【发布时间】:2011-12-09 07:49:35
【问题描述】:
我想知道为什么 Java 对具有同名实例变量的超类和子类有这种奇怪的行为。
假设我们有以下类定义:
class Parent {
int var = 1;
}
class Child extends Parent {
int var = 2;
}
通过这样做,我们应该隐藏了超类的变量var。如果我们没有明确指定通过super 调用访问Parent 的var 的方法,那么我们将永远无法从子实例访问var。
但是当我们有一个演员表时,这个隐藏机制就会中断:
Child child = new Child();
Parent parent = (Parent)child;
System.out.println(parent.var); // prints out 1, instead of 2
这不是完全绕过了字段隐藏的全部要点吗?如果是这样的话,那不是让这个想法完全没用吗?
编辑:我特指Java 教程中的this article。它提到了
在子类中,不能引用超类中的字段 以其简单的名字。相反,该字段必须通过超级...
从我在那里读到的内容,这似乎暗示 Java 开发人员在做这件事时想到了某种技术。虽然我同意这是一个相当晦涩的概念,一般来说可能是不好的做法。
【问题讨论】:
-
我真的很想知道为什么编译器不禁止这样做。我想不出有什么用处。
-
如果您希望 var 的值对于 Child 与 Parent 不同?