Java-静态方法重写

Java-静态方法重写,java,static,overriding,Java,Static,Overriding,我在很多地方读到静态方法不能被重写。然而,我编写了一个示例查询进行测试,似乎我的静态方法被覆盖了 以下是我的疑问: public class staticTestDriver{ public static void main(String[] args){ subClass.print(); //seems the print() method has been overridden } } class superClass { static void

我在很多地方读到静态方法不能被重写。然而,我编写了一个示例查询进行测试,似乎我的静态方法被覆盖了

以下是我的疑问:

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");
    }
}

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

因为静态方法是通过显式指定类名来调用的,所以任何多态性尝试都是无效的

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


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

谢谢大家。我发现一篇文章对这种情况做了很好的解释。请查收

此外,我同意你的观点,这不适用于覆盖。因为“重写依赖于拥有类的实例。”(引用)

所以如果我按照Robert Bain提到的代码

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

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

您应该阅读这篇文章,这不是重写的意思。这只是隐藏。这不是覆盖,而是。考虑到调用
static
方法的
static
上下文,我认为它不能被视为隐藏。如果是
超类myClass=newsubclass();myClass.print()