我在很多地方读到静态方法无法覆盖的地方。但是,我编写了一个示例查询来测试,似乎我的静态方法被覆盖了。
以下是我的询问:
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");
}
}
输出为“此被覆盖”。有什么想法吗?
答案 0 :(得分:0)
由于通过显式指定类名来调用静态方法,因此任何多态尝试都是无效的。
换句话说。确实可以在子类中隐藏/隐藏/替换静态方法,但由于您从不在任何实例上调用静态方法,因此覆盖任何内容的唯一目的就会丢失。您在编译时已经知道要调用的是哪个类。
因此,即使您的代码是有效的java,它也不符合重写方法的定义。
答案 1 :(得分:0)
谢谢大家。我发现一篇文章很好地解释了这种情况。请检查the answer here
另外,我同意你的意见,这不适用于覆盖。因为“覆盖取决于拥有类的实例”。 (参考here)
因此,如果我执行Robert Bain提到的代码
superClass myClass = new subClass(); myClass.print();
输出将是“这是静态的”,意味着没有重写。