【问题标题】:Java - static method overrideJava - 静态方法覆盖
【发布时间】:2015-04-26 20:14:03
【问题描述】:

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

以下是我的查询:

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

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

【问题讨论】:

  • 这不是覆盖的意思。那只是阴影。
  • 这不是压倒一切的,那是hiding
  • 鉴于调用static 方法的static 上下文,我认为它不能被视为隐藏。
  • IE如果是superClass myClass = new subClass(); myClass.print();,它就会隐藏起来。

标签: java static overriding


【解决方案1】:

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

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

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

【讨论】:

  • Java 确实允许您使用对实例的引用来调用静态方法。否则整个“隐藏”定义将不存在。
  • 是的,你是对的。但是调用哪个方法取决于变量的声明类型,而不是实例的实际类型。但你说得对,这让我的回答很混乱。
【解决方案2】:

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

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

所以,如果我执行 Robert Bain 提到的代码

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 2018-06-21
    • 2012-11-07
    • 2018-06-19
    • 1970-01-01
    相关资源
    最近更新 更多