Java 隐藏类的实例变量
我想知道为什么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中,数据成员不是多态的。这意味着Parent.var
和Child.var
是碰巧具有相同名称的两个不同变量。var
在派生类中,你无论如何都不会“压倒” 。如你所知,这两个变量可以相互独立地访问。
最好的前进方式实际上取决于你要实现的目标:
- 如果
Parent.var
不可见Child
,则将其制成private
。 - 如果
Parent.var
和Child.var
是两个逻辑上不同的变量,请给它们提供不同的名称,以避免混淆。 - 如果
Parent.var
和Child.var
在逻辑上是相同的变量,则对它们使用一个数据成员。
以上是 Java 隐藏类的实例变量 的全部内容, 来源链接: utcz.com/qa/402839.html