静态方法中的继承

Swa*_*rma 10 java inheritance 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

por*_*ges 18

静态方法在变量的编译时类型上解析.m是类型Main,所以Main调用方法.

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

  • 除了这个答案,我建议你不要从实例对象调用静态方法,并从类名称中调用它们(例如:SubMain.method()而不是m.method()). (13认同)

Ale*_*exR 15

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

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