从超类static main创建子类

时间:2012-07-03 14:37:12

标签: java methods static instantiation derived-class

我有一个通用的抽象类(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对象?

在C ++,AFAIR中,方法有类似virtual修饰符的东西,我猜这里有用。在Java中怎么办?

4 个答案:

答案 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
  }
}