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“特性”的地方可能在其他地方…你知道。。。所有这些问题都是关于如何“弄清楚要加载哪个类…”。这一点很难从问题中看出:)传递一个论点。