我想知道为什么Java对于超类和具有相同名称的实例变量的子类有这种奇怪的行为.
假设我们有以下类定义:
class Parent {
int var = 1;
}
class Child extends Parent {
int var = 2;
}
Run Code Online (Sandbox Code Playgroud)
通过这样做,我们应该隐藏超类的变量var.如果我们没有明确指定的方式来访问Parent的var通过super电话,那么我们不应该能够访问var一个孩子的一个实例.
但是当我们有一个演员表时,这个隐藏机制就会破坏:
Child child = new Child();
Parent parent = (Parent)child;
System.out.println(parent.var); // prints out 1, instead of 2
Run Code Online (Sandbox Code Playgroud)
这不完全绕过整个隐藏点吗?如果是这种情况,那么这不会使这个想法完全没用吗?
编辑:我在Java教程中专门提到这篇文章.它提到了
在子类中,超类中的字段不能通过其简单名称引用.相反,必须通过超级...访问该字段
从我在那里读到的内容,似乎暗示Java的开发人员在这方面考虑了某种技术.虽然我同意这是一个相当模糊的概念,但总的来说可能是不好的做法.