【发布时间】:2016-02-13 11:09:23
【问题描述】:
来自docs,“如果子类定义的静态方法与超类中的静态方法具有相同的签名,则子类中的方法会隐藏超类中的方法。”
我了解方法隐藏和覆盖之间的区别。但是,说子类隐藏了超类方法很奇怪,因为如果您有以下内容:
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();
}
}
调用超类的静态方法。但是根据隐藏的定义,子类中的方法就是隐藏超类中的方法。我看不到子类是如何“掩盖/隐藏”超类静态方法的,因为超类的方法是实际调用的方法。
【问题讨论】:
-
我认为这类似于局部变量如何隐藏字段。该字段仍然可以访问(就像超类的静态方法一样),但它被隐藏了(更难访问),因为 Cat.staticMehodName() 的行为是调用 Cat 而不是 Animal。
标签: java oop inheritance polymorphism dynamic-binding