继承静态方法继承静态方法(Inheritance in Static Methods)

2019-05-12 02:44发布

为什么下面的代码打印“主”?

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”。

Answer 1:

静态方法是变量的编译时类型解析。 m的类型是Main ,所以在该方法中Main被调用。

如果您将其更改为SubMain m ... ,然后在方法SubMain将被调用。



Answer 2:

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

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



Answer 3:

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

静态方法XXX()从类型XXX应以静态方式进行访问

静态方法不参加继承。 该变量的类型的Main ,所以编译器解决您的函数调用Main.method()

为了增加乐趣,可以尝试设置mnull



Answer 4:

执行的Java静态方法,不像实例方法,其是动态绑定早期绑定。

因为你的对象变量的类型主要的号召,势必在编译时的超类实现。

一个很好的解释,请点击这里 。



Answer 5:

静态方法是静态与他们的类名绑定,因为m是类型主类,然后编译后它会看起来像如下Main.method(); 你的类的编译运行以下命令的javap -c主后ü可以看到主类JVM的汇编代码和u会看到以下m.method //调用静态调用静态,调用特殊告诉静态绑定调用特殊,调用接口告诉该动态绑定



文章来源: Inheritance in Static Methods