为什么称它为"方法隐藏"?

rb6*_*612 5 java oop polymorphism inheritance dynamic-binding

文档 "如果子类定义了与相同的签名在超类中一个静态方法的静态方法,那么在子类中的方法隐藏了一个超类中."

我理解方法隐藏和覆盖之间的区别.但是,很奇怪的是,子类隐藏了超类方法,因为如果你有以下内容:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

调用超类的静态方法.但是通过隐藏的定义,子类中的方法隐藏了超类中的方法.我没有看到子类是如何"掩盖/隐藏"超类静态方法,因为超类的方法是实际调用的方法.

Ste*_*n C 7

调用超类的静态方法.

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

如果你写了main这样的话:

public static void main(String[] args) {
    ...
    testClassMethod();
}
Run Code Online (Sandbox Code Playgroud)

然后你会看到被调用的Cat版本testClassMethod.这里,该Cat.testClassMethod方法隐藏了该Animal.testClassMethod方法

  • 而"明确命名事物"正是人们如何解决隐藏的事物.例如`Animal.testClassMethod`或`this.value = value`或`OuterClass.this.method()`. (5认同)