我想知道为什么Java对于具有相同名称的实例变量的超类和子类具有这种奇怪的行为。
假设我们有以下类定义:
class Parent { int var = 1; } class Child extends Parent { int var = 2; }
通过这样做,我们应该隐藏了超类的变量var。如果我们没有明确指定的方式来访问Parent的var通过super电话,那么我们就应该永远无法获得var一个孩子的一个实例。
var
Parent
super
但是,当我们进行强制转换时,此隐藏机制将中断:
Child child = new Child(); Parent parent = (Parent)child; System.out.println(parent.var); // prints out 1, instead of 2
这不是完全避开整个野外躲藏点吗?如果是这种情况,那么这是否会使该想法完全没有用?
在子类中,不能用其简单名称引用超类中的字段。相反,必须通过超级访问该字段。
从我在这里看到的内容来看,这似乎暗示Java开发人员在执行此操作时会想到某种技术。虽然我同意这是一个相当晦涩的概念,但总体上可能是不好的做法。
在Java中,数据成员不是多态的。这意味着Parent.var和Child.var 是碰巧具有相同名称的两个不同变量。var在派生类中,你无论如何都不会“压倒” 。如你所知,这两个变量可以相互独立地访问。
Parent.var
Child.var
最好的前进方式实际上取决于你要实现的目标:
Child
private