从Java调用继承的类方法

时间:2010-01-28 19:06:43

标签: java python inheritance class-method

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

5 个答案:

答案 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();
   }
}