隐藏类的实例变量
我想知道为什么Java对一个超类和一个具有相同名称的实例变量的子类有这种奇怪的行为。
假设我们有以下类定义:
class Parent {
int var = 1;
}
class Child extends Parent {
int var = 2;
}
通过这样做,我们应该隐藏超类的变量 。如果我们没有明确指定通过调用访问的方式,那么我们就永远不能从子的实例访问。var
Parent
var
super
var
但是当我们有一个演员表时,这种隐藏机制会破坏:
Child child = new Child();
Parent parent = (Parent)child;
System.out.println(parent.var); // prints out 1, instead of 2
这难道不是完全规避了现场隐藏的整个要点吗?如果是这样的话,那么这难道不会使这个想法完全无用吗?
编辑:我特别指的是Java教程中的这篇文章。它提到
在子类中,超类中的字段不能通过其简单名称引用。相反,该字段必须通过超级...
从我在那里读到的内容来看,这似乎暗示Java的开发人员在这样做时有某种技术。虽然我同意这是一个相当晦涩的概念,并且总体上可能是不好的做法。