一尘不染

Java 隐藏类的实例变量

java

我想知道为什么Java对于具有相同名称的实例变量的超类和子类具有这种奇怪的行为。

假设我们有以下类定义:

class Parent {
    int var = 1;
}

class Child extends Parent {
    int var = 2;
}

通过这样做,我们应该隐藏了超类的变量var。如果我们没有明确指定的方式来访问Parentvar通过super电话,那么我们就应该永远无法获得var一个孩子的一个实例。

但是,当我们进行强制转换时,此隐藏机制将中断:

Child child = new Child();
Parent parent = (Parent)child;
System.out.println(parent.var); // prints out 1, instead of 2

这不是完全避开整个野外躲藏点吗?如果是这种情况,那么这是否会使该想法完全没有用?

在子类中,不能用其简单名称引用超类中的字段。相反,必须通过超级访问该字段。

从我在这里看到的内容来看,这似乎暗示Java开发人员在执行此操作时会想到某种技术。虽然我同意这是一个相当晦涩的概念,但总体上可能是不好的做法。


阅读 358

收藏
2020-03-22

共1个答案

一尘不染

在Java中,数据成员不是多态的。这意味着Parent.varChild.var 是碰巧具有相同名称的两个不同变量。var在派生类中,你无论如何都不会“压倒” 。如你所知,这两个变量可以相互独立地访问。

最好的前进方式实际上取决于你要实现的目标:

  1. 如果Parent.var不可见Child,则将其制成private
  2. 如果Parent.varChild.var是两个逻辑上不同的变量,请给它们提供不同的名称,以避免混淆。
  3. 如果Parent.varChild.var在逻辑上是相同的变量,则对它们使用一个数据成员。
2020-03-22