调用继承的类方法从Java(Calling An Inherited Class Method Fr

2019-10-19 07:42发布

在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级?

Answer 1:

在Java中的静态方法不是classmethod那是他们的staticmethod秒。 一般来说,不可能知道哪些类引用静态方法从调用。



Answer 2:

您的类B没有一个main方法和静态方法不能继承。



Answer 3:

我可以看到这种情况发生的唯一办法是找到任何呼吁A.main( String[] arg )并改变它叫B.main代替。

B.main:

   public static void main( String[] arg ) {
        new B().run();
    }

你的程序是如何开始的? 是否有一个批处理文件,快捷方式等? 有些事情,你可以改变? 哪里A.main被调用?



Answer 4:

我觉得这是不可能的。 这是因为:

在Java中,一个方法的实现是通过实例的运行时类型确定。 因此,执行B.show()你需要有一个实例B 。 我看得出来做到这一点,如果假设构建实例的方法被继承,唯一的办法就是使用Class.newInstance()来构建,这不是在运行时已知的类型的实例。

但问题是,静态方法中,你有没有提到含有类,所以你不知道是谁newInstance方法调用。

你为什么想做这个有关系吗? 可能有一些更好的方法来实现什么是你想要实现的。



Answer 5:

在你的榜样,我不会把你的主要方法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();
   }
}


文章来源: Calling An Inherited Class Method From Java