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