嗯,问题不是什么是方法或变量隐藏。问题是为什么不鼓励使用它。
如果有人清除了静态和动态绑定,一切似乎都是合乎逻辑的。我同意静态变量和方法应该按类名而不是对象引用来调用,以使代码易于理解,但为什么不鼓励这种隐藏的做法呢?
这仅仅是因为代码变得更容易阅读还是其他什么原因?
对静态方法进行重写没有多大意义,因为重写虽然是针对多态性的事情,但当您调用该方法时,您不是在操作对象,而是在操作类。所以它可能会让您以非静态方式执行它,并且您将受声明变量的类型而不是它的实例的约束。
我实际上对这里的文档非常满意(谢谢@baao):https://docs.oracle.com/javase/tutorial/java/IandI/override.html。
请注意隐藏和覆盖之间的区别: - 隐藏是指子类中的静态方法,其签名与超类中的静态方法相同,被认为是不好的做法 - 重写是允许子类修改继承行为的原因,并且不是坏做法。
我将再次使用文档中的示例:
public class Animal {
public static void testClassMethod() {
System.out.println("The static method in Animal");
}
public void testInstanceMethod() {
System.out.println("The instance method in Animal");
}
}
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;
myAnimal.testClassMethod();
// "The static method in Animal"
myAnimal.testInstanceMethod();
// "The instance method in Cat"
}
}
引用Java中隐藏的方法是什么?甚至JavaDoc的解释也令人困惑:“在实例而不是类上调用静态方法是一种非常糟糕的做法,永远不应该这样做。”