在Java中继承静态方法?

Kva*_*ass 1 java polymorphism inheritance static-methods

所以我知道在Java中,当你有一个静态方法时,你应该用格式来调用它,ClassName.method()而不是使用与实例方法相同的结构,即:

ClassName myObject = new ClassName();
myObject.method();
Run Code Online (Sandbox Code Playgroud)

但是,如果你这样做,它仍然是有效的代码,并将工作.假设我决定在有问题的方法是静态的情况下执行此操作,并进行以下设置:

public SuperClass {
    public static int foo(int x) {
        return x;
    }
}

public SubClass extends SuperClass {
    public static int foo(int x) { // Overriding foo() in SuperClass
        return x + 1;
    }
}

public MyDriver {
    public static void main(String[] args) {
        SuperClass myObject = new SubClass(); // Upcasting.
        System.out.println(myObject.foo(5));  // This should polymorphically print 6
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,在屏幕上打印的是5而不是6.为什么?

Pan*_*der 5

静态方法仅适用于它们所定义的类,并且不能覆盖它们.

当你打电话时myObject.foo(5),你SuperClass.foo(5)实际上在调用,因为你声明myObject为a SuperClass,无论你是否将其实例化为一个.

调用静态方法的正确方法是直接从声明它的类中调用它,所以如果你想调用它SubClass.foo(),你必须从显式声明的SubClass实例中调用它(意味着没有向上转换),或者你需要SubClass.foo()像这样调用它.

简单的答案是从实例调用静态方法评估从声明的类型调用那些相同的方法而没有实例而不是实例类型.

我不确定这一点,但是如果将代码编译成字节代码,实际上静态方法调用实际上会被编译成对声明类型的直接调用,我不会感到惊讶.

编辑:一个upvote让我的注意力回到了这一点,我清理了解释,使其更清晰,并修复了一些可以忽略的语法错误.我希望这有助于未来的读者.