Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从超类static main创建子类_Java_Methods_Static_Instantiation_Derived Class - Fatal编程技术网

Java 从超类static main创建子类

Java 从超类static main创建子类,java,methods,static,instantiation,derived-class,Java,Methods,Static,Instantiation,Derived Class,我有一个泛型抽象类(超类)。我希望有一个main方法,它将是每个子类的默认main,并且将执行相同的操作,但是使用适当的派生和调用它的子类对象 像这样: 公共抽象类超类{ //这里有一些代码。。。 公共静态void main(字符串参数[]){ //这里实例化子类 //扩展这个超类,并调用 //一些方法 } } 公共子类扩展了超类{ //这里只是实现一些 //SupeClass中的抽象方法 //而不是实现main() } 现在我希望能够以独立程序的形式运行子类,它执行从超类派生的默认main。

我有一个泛型抽象类(
超类
)。我希望有一个
main
方法,它将是每个子类的默认main,并且将执行相同的操作,但是使用适当的派生和调用它的子类对象

像这样:

公共抽象类超类{
//这里有一些代码。。。
公共静态void main(字符串参数[]){
//这里实例化子类
//扩展这个超类,并调用
//一些方法
}
}
公共子类扩展了超类{
//这里只是实现一些
//SupeClass中的抽象方法
//而不是实现main()
}
现在我希望能够以独立程序的形式运行
子类
,它执行从
超类
派生的默认
main
。如何在
main
方法中实例化适当的
子类
对象

  • 我不能只做new,因为在
    超类
    中,我不知道
    子类的实际名称
  • 我不能使用反射,因为我无法从
    超类中实现的静态方法中获取
    子类的名称()

< C++ > AfAIR中,有一种方法类似于<代码>虚拟< /Calp>修饰符,我想在这里会有用。如何在Java中执行?

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

例如,您可以使用

创建如下所示的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>
然后,您的超类将不知道它的子类(而是知道Spring…)


你也必须在ScaspScript中添加一些Spring jar文件。

你不能继承子类中的静态方法,但是如果你想用一个虚拟的C++方法,使您的方法抽象或受保护

如果我希望能够将子类作为独立程序运行,您的意思是希望能够运行类似于
java my.app.SubClass的东西,但这不起作用,因为正如大家已经指出的,静态方法不会被继承

根据您想要这种奇怪的子类嵌套的原因,您可以通过实现如下非静态main来找到解决方法:

   public static void main(String args[]) {
       ApplicationContext context = ClassPathXmlApplicationContext("appconfig.xml");
       SuperClass startClass = (SuperClass) context.getBean("someBean");
       startClass.someMethod();
   }
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
  }
} 

(这基本上是说你不能做你想做的事。)好吧。。。它们是继承的,因为我可以调用从超类派生的主方法的子类,并且它可以工作。问题主要是我需要做的。@WRz子引用可以直接调用父类中定义的方法,但这不会使该方法成为虚拟的。这只是语法上的甜言蜜语。您既不能重写静态方法,也可以通过在子类中提供具有相同签名的另一个实现来隐藏父实现。对于静态方法,要调用的方法实现是在编译时根据用于访问它的引用的类型选择的,与虚拟方法相反,虚拟方法的实现是在运行时根据给定对象的实际类型选择的。好了,问题到此为止。谢谢你快速详尽的回答。讨论这个Java“特性”的地方可能在其他地方…你知道。。。所有这些问题都是关于如何“弄清楚要加载哪个类…”。这一点很难从问题中看出:)传递一个论点。