[英]Extending the main class in Java
我需要通过覆盖它的一些方法来扩展我的主类的功能。 我期待扩展主类的类能够运行。 但是,Eclipse不会将MyLauncher识别为可运行的类。 在下面的代码中,我有一个由子类重写的setup()
方法。 我想要的是一种从超类运行main(..)
,还有从子类运行的设置。
// Launcher.java
public class Launcher {
Launcher instance;
public static void main (args[]) {
instance = new Launcher(); // This is likely the problem
instance.setup();
}
public void setup() {
System.out.println("Default agent setup.");
}
}
// MyLauncher.java
public class MyLauncher extends Launcher {
public void setup() {
System.out.println("New agent setup!");
}
}
我接受这个的替代方案。 但是我无法在子类中添加main方法。 Launcher类在我正在制作的API中,因此它不能引用正在使用API的类MyLauncher。
编辑:我认为这是针对我的问题。 我决定寻找新的方法。 由于我正在使用JDT,我将解析Launcher并注入该类。
静态方法不是继承的,它们总是绑定到定义它们的类,并且需要明确地调用。
在你的情况下, MyLauncher
需要一个main()
方法,然后可以委托给Launcher
的main()
方法:
public class MyLauncher extends Launcher {
public static void main (String[] args) {
Launcher.main(args);
}
protected void setup() {
System.out.println("New agent setup!");
}
}
无法从外部调用受保护的方法。 所以MyLauncher.setup()
不会覆盖Launcher.setup()
和instance.setup();
从Class Launcher
调用public方法。
项目中只能有一个主要方法,即程序的一个入口点。 因此,我们假设您将在Launcher类中保留main方法。
您的主要方法签名应该是:
public static void main (String args[])
除非你想要调用启动器的setup()方法,否则你想做:
instance = new MyLauncher();
这将从MyLauncher调用setup()方法。
如果要从Launcher类调用setup(),则需要实例化启动器类:
instance = new Launcher();
如果您希望能够运行MyLauncher.setup()
,则该变量必须是MyLauncher
。 您正在main()
函数中初始化并存储Launcher
。
如果这两个类在同一个包中,或者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();
}
}
}
正如您所说,直接在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() {
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.