1

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

4

5 回答 5

1

您的类B没有main方法,并且静态方法不会被继承。

于 2010-01-28T19:28:29.990 回答
1

我可以看到这种情况发生的唯一方法是找到正在调用的内容A.main( String[] arg )并将其更改为调用B.main

B.主要:

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

你的程序是如何开始的?是否有批处理文件、快捷方式等?你可以改变什么?在哪里A.main被调用?

于 2010-01-28T19:31:08.747 回答
1

java中的静态方法不是classmethods,它们是staticmethods。一般来说,不可能知道静态方法是从哪个类引用中调用的。

于 2010-01-28T19:48:20.940 回答
0

我认为这是不可能的。原因如下:

在 Java 中,方法的实现由实例的运行时类型决定。所以,要执行B.show(),你需要有一个B. 如果构造实例的方法应该被继承,我能看到的唯一方法是用于Class.newInstance()构造运行时未知类型的实例。

问题在于,在静态方法中,您没有对包含类的引用,因此您不知道newInstance要调用谁的方法。

但是,您为什么要这样做?可能有一些更好的方法可以实现您想要实现的任何目标。

于 2010-01-28T19:20:33.553 回答
0

在您的示例中,我不会将您的 main 方法放在 A 中。这是设置为系统的入口点(如果您专门进入 A,则不能在 B 中)。

在下面的示例中,我创建了 A、B 和 C 类。C 类实例化 A 和 B 并运行它们。请注意,在 CI 中创建了一个 A、一个 B 和另一个我实例化为 B 的 A。我的输出是: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();
   }
}
于 2010-01-28T19:23:32.857 回答