静态方法中的inheritance

为什么以下代码打印“Main”?

public class Main { public static void method() { System.out.println("Main"); } public static void main(String[] args) { Main m = new SubMain(); m.method(); } } class SubMain extends Main { public static void method() { System.out.println("SubMain"); } } 

在运行时, m指向Submain一个实例,因此它应该在概念上打印“SubMain”。

静态方法在变量的编译时类型上解析。 mMain类型,因此调用Main的方法。

如果将其更改为SubMain m ... ,则将调用SubMain上的方法。

这是因为静态方法不是多态的。 此外,静态方法不应该由对象调用,而是使用类,即Main.method()SubMain.method() 。 当你调用m.method() java实际上调用Main.method()因为m是Main类型。

如果你想享受多态,不要使用静态方法。

当我尝试做这样的事情时,Eclipse给了我这种警告:

应以静态方式访问XXX类型的静态方法XXX()

静态方法不参与inheritance。 该变量的类型为Main ,因此编译器解析了对Main.method()函数调用。

为了增加乐趣,请尝试将m设置为null

Java对静态方法执行早期绑定,与动态绑定的实例方法不同。

因为您的对象变量是Main类型,所以调用在编译时绑定到超类实现。

这里有一个很好的解释。

静态方法与它们的类名静态绑定,因为m是Main类的类型,然后在编译后它看起来像下面的Main.method(); 编译完类后运行以下命令javap -c主要你可以看到main类的jvm汇编代码,你会看到下面的m.method //调用静态调用static,调用special告诉静态绑定调用special,调用接口告诉动态绑定