嗯,问题不在于什么是方法或变量隐藏。 问题是为什么不鼓励使用它。
如果某人没有静态和动态绑定,那么一切似乎都是合乎逻辑的。我同意静态变量和方法应该由类名调用,而不是通过对象引用来使代码易于理解,但为什么这种隐藏的做法不鼓励呢?
是不是因为代码变得更容易阅读,还是其他东西?
答案 0 :(得分:0)
重写静态方法没有多大意义,因为覆盖是针对多态的事情,但是当你调用方法时,你不是操纵对象而是操作类。 因此,它可能会以非静态方式执行它,并且您将受到声明变量的类型而不是它的实例。
答案 1 :(得分:0)
我对这里的文档非常满意(感谢@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"
}
}
从What is method hiding in Java? Even the JavaDoc explanation is confusing引用另一个答案: "在实例而不是类上调用静态方法是一种非常糟糕的做法,永远不应该这样做。"