[英]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.