繁体   English   中英

为什么称为“方法隐藏”?

[英]Why is it called “method hiding”?

文档中 ,“如果子类定义的静态方法与超类中的静态方法具有相同的签名,则子类中的方法会将其隐藏在超类中。”

我了解方法隐藏和覆盖之间的区别。 但是,说子类隐藏超类方法很奇怪,因为如果您具有以下条件:

public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Cat");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Cat");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;
        Animal.testClassMethod();
        myAnimal.testInstanceMethod();
    }
}

超类的静态方法被调用。 但是根据隐藏的定义,子类中的方法会将其隐藏在超类中。 我看不到子类如何“覆盖/隐藏”超类的静态方法,因为超类的方法是实际调用的方法。

超类的静态方法被调用。

是。 但这是因为您通过在call语句中使用超类名称进行限定来显式命名超类的静态方法。

如果您是这样编写main则:

public static void main(String[] args) {
    ...
    testClassMethod();
}

那么您会看到调用了Cat版本的testClassMethod 在这里, Cat.testClassMethod方法隐藏了Animal.testClassMethod方法

CattestClassMethod()隐藏了Animal.testClassMethod() ,因为如果在Cat类中没有静态的testClassMethod()Cat.testClassMethod()将调用Animal.testClassMethod()

当您调用Animal.testClassMethod() ,子类的方法无法将其隐藏。

考虑将其添加到您发布的示例中

class Dog extends Animal {
    // nothing here
}

现在,如果您这样做:

new Cat().testClassMethod();
new Dog().testClassMethod();

以上每个都会给出不同的输出。 因此,您可以说Cat中的静态方法确实隐藏了Animal的静态方法-虽然没有诸如覆盖静态方法之类的东西,但其中一个动物是根据Animal的代码打印的,而另一Animal则没有。

(附言:我绝对不鼓励您以这种方式调用静态方法。)

我认为这被称为“隐藏”,因为您不能仅通过编写方法名称就可以访问超类的方法。 如果在Cat没有public static void testClassMethod()定义,您的main可能会说

testClassMethod();

调用Animal定义的方法。 但是您不能再这样做了。 是的,您仍然可以通过给它一个限定名称来调用它:

Animal.testClassMethod();

因此它并未完全隐藏。 但是请注意,编写语言标准的人必须为某些概念想出名称,这些名称可能与非计算世界中我们给单词赋予的含义不完全相同,因此有时接近是他们所能做到的。 您不能尝试从字面上理解该术语。 我认为, hidden一词在JLS中的某个地方有正式定义。 这意味着当您看到JLS中使用的术语时,它意味着JLS定义的含义无论多多少少。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM