【问题标题】:What's the difference between override and hidden in java?java中的覆盖和隐藏有什么区别?
【发布时间】:2014-06-09 04:40:30
【问题描述】:

我搜索了很多。它们之间的区别在于 override 用于实例方法, hidden 用于静态方法。而隐藏其实是对方法的重新定义。但是我还是不明白。如果重新定义意味着父类的静态方法仍然存在于子类中,那只是我们看不到吗?或者为什么我们称它为隐藏而不是任何其他词?但是如果它存在,我找不到再次调用该方法的方法。老实说,从功能层面来看,我无法找到它们不同的原因。有人可以从更深层次的比如记忆来解释吗?

【问题讨论】:

标签: java


【解决方案1】:

静态成员(方法和变量)不会出现在继承它们的子类(子类)对象中,但它们将作为单个副本出现在内存中。

静态成员可以通过超类和子类的类名访问,但它们实际上并不存在于这些类的对象中。

当你继承非静态成员时,内存中的子类对象将包含继承的方法以及它自己的方法。所以当你尝试在这里写一个类似的方法时,超类方法将被覆盖。另一方面,由于静态方法不参与继承,您编写的任何类似方法存在于超类中,新方法将在每次被请求时运行。父类方法只是隐藏而不是覆盖!

【讨论】:

    【解决方案2】:

    来自JLS 8.4.8.2,示例 8.4.8.2-1 向我们展示了隐藏方法绑定到引用类型 (Super),而重写方法绑定到对象类型 (Sub)。

    class Super {
        static String greeting() { return "Goodnight"; }
        String name() { return "Richard"; }
    }
    class Sub extends Super {
        static String greeting() { return "Hello"; }
        String name() { return "Dick"; }
    }
    class Test {
        public static void main(String[] args) {
            Super s = new Sub();
            System.out.println(s.greeting() + ", " + s.name());
        }
    }
    

    输出:

    Goodnight, Dick
    

    【讨论】:

    • 如果我不隐藏Sub中的greeting()。如果Sub中的隐式greeting()方法仍然绑定到引用的类型(Super)?
    • @deathlee,如果你在Sub中不隐藏greeting()方法,那么调用哪个方法就没有歧义了。它将调用Super 版本。
    【解决方案3】:

    如果您调用Superclass.staticMethod(),您将获得超类中定义的方法,而不管子类中是否发生任何隐藏。另一方面,如果您调用((Superclass)subObj).instanceMethod(),您仍然会调用该方法,因为它在子类中被覆盖。

    【讨论】:

    • 您可能想使用SuperType(或类似的东西)而不是Super,以防止读者对super 关键字感到困惑...
    猜你喜欢
    • 2013-11-13
    • 2016-06-21
    • 2012-06-18
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 2011-07-29
    • 1970-01-01
    相关资源
    最近更新 更多