[英]Inheritance in Static Methods
为什么下面的代码显示“ 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”。
静态方法在变量的编译时类型上解析。 m
是Main
类型的,因此调用Main
的方法。
如果将其更改为SubMain m ...
,则将调用SubMain
上的方法。
这是因为静态方法不是多态的。 此外,静态方法不应由对象调用,而应使用类Main.method()
或SubMain.method()
来调用。 当您调用m.method()
java实际上会调用Main.method()
因为m是Main类型。
如果您想享受多态性,请不要使用静态方法。
当我尝试执行此类操作时,Eclipse会向我发出此类警告:
来自XXX类型的静态方法XXX()应该以静态方式访问
静态方法不参与继承。 该变量的类型为Main
,因此编译器将您的函数调用解析为Main.method()
。
为了增添乐趣,请尝试将m
设置为null
。
静态方法与它们的类名称静态绑定,因为m是Main类的类型,然后在编译后,其外观类似于Main.method();。 在编译您的类之后,运行以下命令javap -c Main您可以看到Main类的jvm汇编代码,并且您会看到以下m.method // //调用static invoke static,调用special表示静态绑定调用special,invoke接口告诉动态绑定
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.