Java - 静态方法覆盖

时间:2015-04-26 20:14:03

标签: java static override

我在很多地方读到静态方法无法覆盖的地方。但是,我编写了一个示例查询来测试,似乎我的静态方法被覆盖了。

以下是我的询问:

public class staticTestDriver{

    public static void main(String[] args){
        subClass.print(); //seems the print() method has been overridden
    }
}

class superClass {
    static void print(){
        System.out.println("this is static");
    }
}

class subClass extends superClass{
    static void print(){
        System.out.println("This is overridden");
    }
}

输出为“此被覆盖”。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

由于通过显式指定类名来调用静态方法,因此任何多态尝试都是无效的。

换句话说。确实可以在子类中隐藏/隐藏/替换静态方法,但由于您从不在任何实例上调用静态方法,因此覆盖任何内容的唯一目的就会丢失。您在编译时已经知道要调用的是哪个类。

因此,即使您的代码是有效的java,它也不符合重写方法的定义。

答案 1 :(得分:0)

谢谢大家。我发现一篇文章很好地解释了这种情况。请检查the answer here

另外,我同意你的意见,这不适用于覆盖。因为“覆盖取决于拥有类的实例”。 (参考here

因此,如果我执行Robert Bain提到的代码

 superClass myClass = new subClass(); myClass.print();

输出将是“这是静态的”,意味着没有重写。