我需要通过覆盖它的一些方法来扩展我的主类的功能。我期待扩展主类的类能够运行。但是,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并注入该类。
答案 0 :(得分:7)
静态方法不是继承的,它们总是绑定到定义它们的类,需要明确地调用。
在您的情况下,MyLauncher
也需要main()
方法,然后委托到main()
Launcher
方法:< / p>
public class MyLauncher extends Launcher {
public static void main (String[] args) {
Launcher.main(args);
}
protected void setup() {
System.out.println("New agent setup!");
}
}
答案 1 :(得分:2)
无法从外部调用受保护的方法。因此,MyLauncher.setup()
不会覆盖Launcher.setup()
,instance.setup();
会调用类Launcher
中的公共方法。
答案 2 :(得分:2)
项目中只能有一个主要方法,即程序的一个入口点。因此,让我们假设您将主要方法保留在Launcher类中。
您的主要方法签名应为:
public static void main (String args[])
除非您希望调用启动器中的setup()方法,否则您希望这样做:
instance = new MyLauncher();
这将调用MyLauncher中的setup()方法。
如果要从Launcher类调用setup(),则需要实例化启动器类:
instance = new Launcher();
答案 3 :(得分:2)
如果您希望能够运行MyLauncher.setup()
,则变量必须为MyLauncher
。您正在Launcher
函数初始化并存储main()
。
如果这两个类在同一个包中,或Launcher.java
导入MyLauncher
类,那么main()
中的Launcher
函数应该是:
public class Launcher {
Launcher instance;
public static void main(String[] args) {
instance = new MyLauncher();
if(instance instanceof MyLauncher) {
((MyLauncher) instance).setup();
} else
{
instance.setup();
}
}
}
答案 4 :(得分:1)
正如您所说,直接在Launcher
中创建main
实例的事实意味着没有可用的继承。即使你可以从Eclipse轻松启动MyLauncher
,在main
方法中你也不会知道实际使用了哪种类型来启动它。我无法看到任何简单的解决方案, 在每个类或中创建main
方法,提供类名作为命令行参数。我可能会分开&#34;运行&#34;来自其他任何事情:
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() {
}
}