我有一个通用的抽象类(SuperClass
)。我希望有一个main
方法,它将是每个子类的默认主要方法,并且会做同样的事情,但是使用适当的子类对象派生并调用它。
像这样:
public abstract class SuperClass {
// some code here...
public static void main(String args[]) {
// here instantiate the subclass
// extending this SuperClass, and call
// some methods
}
}
public SubClass extends SuperClass {
// here just implement some
// abstract methods from SupeClass
// and NOT implement main()
}
现在我希望能够将SubClass
作为独立程序运行,该程序执行从main
派生的默认SuperClass
。如何在SubClass
方法中实例化正确的main
对象?
SuperClass
我不知道SubClass
SubClass
(Getting the name of a sub-class from within a super-class)SuperClass
的名称
在C ++,AFAIR中,方法有类似virtual
修饰符的东西,我猜这里有用。在Java中怎么办?
答案 0 :(得分:7)
如果希望子类成为应用程序入口点,则不继承静态方法,在子类中编写main方法。
答案 1 :(得分:1)
例如,您可以使用Spring IOC。
创建如下所示的xml文件并放入类路径中:
appconfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<bean id="someBean" class="com.company.SubClass"/>
</beans>
然后在您的主代码中,您可以执行以下操作:
public static void main(String args[]) {
ApplicationContext context = ClassPathXmlApplicationContext("appconfig.xml");
SuperClass startClass = (SuperClass) context.getBean("someBean");
startClass.someMethod();
}
然后你的SuperClass将不知道它的子类(但会知道Spring而不是......)。
您还必须在类路径中添加一些Spring jar文件。
答案 2 :(得分:0)
您不能在子类中继承静态方法,但如果您想在c ++中创建类似虚拟的方法,请将您的方法设为抽象或受保护
答案 3 :(得分:0)
如果通过我希望能够将SubClass作为独立程序运行,那么您的意思是希望能够运行类似java my.app.SubClass
的内容,但这不起作用,因为正如大家已经指出的那样,静态方法不会被继承。
根据您想要这个奇怪的子类嵌套的原因,您可以通过实现这样的非静态main来找到解决方法:
public class SuperClass{
public static void main(String[] args) {
SuperClass c = //figure out which class to load via a factor or something
c.nonStaticMain(args);
}
protected void nonStaticMain(String[] args) {
//do everything from your old main() here
}
}