繁体   English   中英

静态方法中的继承

[英]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”。

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

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

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

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

当我尝试执行此类操作时,Eclipse会向我发出此类警告:

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

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

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

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

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

这里有一个很好的解释。

静态方法与它们的类名称静态绑定,因为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM