在Python中,类方法可以继承。 例如
>>> class A:
... @classmethod
... def main(cls):
... return cls()
...
>>> class B(A): pass
...
>>> b=B.main()
>>> b
<__main__.B instance at 0x00A6FA58>
你会怎么做Java中的等价物? 我目前有:
public class A{
public void show(){
System.out.println("A");
}
public void run(){
show();
}
public static void main( String[] arg ) {
new A().run();
}
}
public class B extends A{
@Override
public void show(){
System.out.println("B");
}
}
我想打电话B.main(),并把它打印“B”,但很明显,将打印“A”代替,因为“新的A()”是固定的。
你将如何改变“新A()”,因此,它的参数使用它在叫上课的时候,而不是硬编码的A级?
在Java中的静态方法不是classmethod
那是他们的staticmethod
秒。 一般来说,不可能知道哪些类引用静态方法从调用。
我可以看到这种情况发生的唯一办法是找到任何呼吁A.main( String[] arg )
并改变它叫B.main
代替。
B.main:
public static void main( String[] arg ) {
new B().run();
}
你的程序是如何开始的? 是否有一个批处理文件,快捷方式等? 有些事情,你可以改变? 哪里A.main
被调用?
我觉得这是不可能的。 这是因为:
在Java中,一个方法的实现是通过实例的运行时类型确定。 因此,执行B.show()
你需要有一个实例B
。 我看得出来做到这一点,如果假设构建实例的方法被继承,唯一的办法就是使用Class.newInstance()
来构建,这不是在运行时已知的类型的实例。
但问题是,静态方法中,你有没有提到含有类,所以你不知道是谁newInstance
方法调用。
你为什么想做这个有关系吗? 可能有一些更好的方法来实现什么是你想要实现的。
在你的榜样,我不会把你的主要方法A.里面这是设置为切入点进入系统(你不能在B如果明确进入A)。
在下面我创建的示例类A,B,和C. C类实例A和B,并运行它们。 请注意,在CI创建的A中,B,和另一个阿那我实例为B.我的输出是:A B B
希望这是有道理的。
public class A {
public void show(){
System.out.println("A");
}
public void run(){
show();
}
}
public class B extends A {
@Override
public void show(){
System.out.println("B");
}
}
public class C {
public static void main(String[] args) {
A a = new A();
B b = new B();
A anothera = new B();
a.show();
b.show();
anothera.show();
}
}