[英]Calling An Inherited Class Method From Java
在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”,因为“ new A()”是硬编码的。
您将如何更改“ new A()”,以便对其进行参数化以使用被调用时所在的类,而不是硬编码的类A?
您的B
类没有main
方法,并且static方法也不被继承。
我可以看到这种情况的唯一方法是查找正在调用A.main( String[] arg )
然后将其更改为调用B.main
。
B.main:
public static void main( String[] arg ) {
new B().run();
}
您的程序如何启动? 是否有批处理文件,快捷方式等? 有什么可以改变的吗? A.main
在哪里打电话?
Java中的静态方法不是classmethod
它们是staticmethod
。 通常,不可能知道从哪个类引用了静态方法。
我认为这是不可能的。 原因如下:
在Java中,方法的实现由实例的运行时类型确定。 因此,要执行B.show()
,您需要具有B
的实例。 如果构造该实例的方法应该被继承,那么我看到的唯一方法就是使用Class.newInstance()
构造一个在运行时未知的类型的实例。
这样做的问题在于,在静态方法中,您没有对包含类的引用,因此您不知道要调用newInstance
方法。
但是,为什么要这样做呢? 可能有一些更好的方法来实现您想要实现的目标。
在您的示例中,我不会将您的主要方法放在A内。这是设置为系统的入口点(如果您专门输入A,则不能在B中)。
在下面的示例中,我创建了类A,B和C。类C实例化了A和B并运行它们。 注意,在CI中创建了一个A,一个B和另一个实例化为B的A。我的输出是:ABB
希望这是有道理的。
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();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.