在Python中,可以继承类方法。 e.g。
>>> 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”,因为“new A()”是硬编码的。
你如何改变“new A()”以便它被参数化以便在被调用时使用它所在的类,而不是硬编码的类A?
答案 0 :(得分:1)
您的班级B
没有main
方法,静态方法不继承。
答案 1 :(得分:1)
我能看到这种情况的唯一方法是查找正在调用A.main( String[] arg )
的内容并将其更改为调用B.main
。
B.main:
public static void main( String[] arg ) {
new B().run();
}
您的计划是如何开始的?有批处理文件,快捷方式等吗?你可以改变什么? A.main
在哪里被召唤?
答案 2 :(得分:1)
java中的静态方法不是classmethod
,而是staticmethod
。通常,不可能知道调用静态方法的类引用。
答案 3 :(得分:0)
我认为这是不可能的。原因如下:
在Java中,方法的实现由实例的运行时类型决定。因此,要执行B.show()
,您需要拥有B
的实例。我可以看到这样做的唯一方法,如果构造实例的方法应该被继承,那就是使用Class.newInstance()
来构造一个在运行时不知道的类型的实例。
问题在于,在静态方法中,您没有引用包含类,因此您不知道要调用哪个newInstance
方法。
但为什么要这样做呢?可能有更好的方法来实现你想要达到的目标。
答案 4 :(得分:0)
在您的示例中,我不会将您的主要方法放在A中。这是设置为系统的入口点(如果您特意进入A,则不能在B中)。
在下面的示例中,我创建了A,B和C类.C类实例化A和B并运行它们。请注意,在C中我创建了一个A,一个B和另一个我实例化为B的A.我的输出是: 一个 乙 乙
希望这是有道理的。
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();
}
}