在Java中扩展主类

时间:2014-05-14 13:38:26

标签: java eclipse

我需要通过覆盖它的一些方法来扩展我的主类的功能。我期待扩展主类的类能够运行。但是,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并注入该类。

5 个答案:

答案 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() {
    }
}