3

我有一个通用的抽象类(SuperClass)。我想有一个main方法,这将是每个子类的默认 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作为独立程序运行,该程序执行mainSuperClass. 如何SubClass在方法中实例化正确的对象main

  • 我不能只做新的,因为SuperClass我不知道一个的实际名称SubClass
  • 我不能使用反射来做到这一点,因为我无法从(从超类中获取子类的名称)中实现SubClass的静态方法中获取名称SuperClass

在 C++ 中,AFAIR 中有类似virtual方法的修饰符,我想这在这里很有用。在Java中怎么做?

4

4 回答 4

7

静态方法不会被继承,如果您希望您的子类成为您的应用程序入口点,请在子类中编写 main 方法。

于 2012-07-03T14:39:27.430 回答
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 文件添加到您的类路径中。

于 2012-07-03T14:51:18.563 回答
0

您不能在子类中继承静态方法,但如果您想在 c++ 中创建类似虚拟的方法,请将您的方法设为抽象或受保护

于 2012-07-03T14:52:40.950 回答
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
  }
} 
于 2012-07-03T15:05:01.970 回答