Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中扩展主类_Java_Eclipse - Fatal编程技术网

在Java中扩展主类

在Java中扩展主类,java,eclipse,Java,Eclipse,我需要通过重写它的一些方法来扩展我的主类的功能。我希望扩展主类的类能够运行。但是,Eclipse不将MyLauncher识别为可运行类。在下面的代码中,我有一个被子类重写的setup()方法。我想要的是一种从超类运行main(…)的方法,但也要从子类运行设置 //Launcher.java 公共类启动器{ 发射器实例; 公共静态void main(参数[]){ instance=new Launcher();//这可能就是问题所在 instance.setup(); } 公共作废设置(){ Sy

我需要通过重写它的一些方法来扩展我的主类的功能。我希望扩展主类的类能够运行。但是,Eclipse不将MyLauncher识别为可运行类。在下面的代码中,我有一个被子类重写的
setup()
方法。我想要的是一种从超类运行
main(…)
的方法,但也要从子类运行设置

//Launcher.java
公共类启动器{
发射器实例;
公共静态void main(参数[]){
instance=new Launcher();//这可能就是问题所在
instance.setup();
}
公共作废设置(){
System.out.println(“默认代理设置”);
}
}
//MyLauncher.java
公共类MyLauncher扩展启动器{
公共作废设置(){
System.out.println(“新代理设置!”);
}
}
我接受替代方案。但是,我不能向子类添加main方法。Launcher类位于我正在制作的API中,因此它不能引用使用该API的MyLauncher类


编辑:我想这是针对我的问题。我决定寻找一种新的方法。因为我正在使用JDT,所以我将解析启动器并注入类。

不能从外部调用受保护的方法。因此
MyLauncher.setup()
不会覆盖
Launcher.setup()
instance.setup()
从类
启动器调用public方法

项目中只能有一个主方法,即程序的一个入口点。因此,让我们假设您将在Launcher类中保留main方法

您的主要方法签名应为:

public static void main (String args[])
除非您希望调用启动器中的setup()方法,否则您应该执行以下操作:

instance = new MyLauncher();
这将从MyLauncher调用setup()方法

如果要从Launcher类调用setup(),则需要实例化Launcher类:

instance = new Launcher();

静态方法不是继承的,它们总是绑定到定义它们的类,并且需要显式地调用

在您的情况下,
MyLauncher
也需要一个
main()
方法,然后可以
main()
委托给
启动器的
main()
方法:

public class MyLauncher extends Launcher {

    public static void main (String[] args) {
        Launcher.main(args);
    }

    protected void setup() {
        System.out.println("New agent setup!");
    }
}

正如您所说,直接在
main
中创建
Launcher
的实例意味着没有可用的继承。即使您可以从Eclipse轻松启动
MyLauncher
,在
main
方法中,您也不知道实际使用了哪种类型来启动它。我看不到任何简单的解决方案不涉及在每个类中创建
main
方法或提供类名作为命令行参数。我可能会将“跑步”与其他任何事情区分开来:

public class Launcher {
    public static void launch(LaunchConfiguration configuration) {
        configuration.setup();
        ...
    }
}

public class LaunchConfiguration {
    public static void main(String[] args) {
        Launcher.launch(new LaunchConfiguration());
    }

    public void setup() {
    }
}

public class MyLaunchConfiguration {
    public static void main(String[] args) {
        Launcher.launch(new MyLaunchConfiguration());
    }

    @Override
    public void setup() {
    }
}

如果希望能够运行
MyLauncher.setup()
,则变量必须是
MyLauncher
。您正在初始化
启动器并将其存储在
main()
函数中

如果两个类在同一个包中,或者
Launcher.java
导入
MyLauncher
类,则
Launcher
中的
main()
函数应该能够:

public class Launcher {
    Launcher instance;

    public static void main(String[] args) {
        instance = new MyLauncher();
        if(instance instanceof MyLauncher) {
            ((MyLauncher) instance).setup();
        } else
        {
            instance.setup();
        }
    }
}

除此之外,如果您发布实际代码而不是伪代码,这将非常有帮助。当前代码在编译之前需要进行一些调整。主要方法是静态的。因此,
MyLauncher
不是一个可运行的类,因为它没有main方法。但是,我不认为这是我的核心问题。在实例化之前,运行main的类的类型已经是Launcher。我只需要进行实例化,因为我需要重写<代码> SETUP()/CODE >,最好不要认为主方法在任何地方都是特定的。它在一个类文件中,因为“它必须在某个地方”,过于强调哪个类文件可能是危险的。我可以选择我想运行哪一个。不过,我不能在启动器中引用MyLauncher,因为MyLauncher在我正在制作的API中。