0

当一个子类继承一个超类时,子类和超类中定义的具有不同可访问性的字段之间的关系是什么,哪些字段属于子类,哪些不属于。有人可以解释下面的例子:

class Parent
{
  private int partOne = 0;
  public int partTwo = 1;

  public void tellMe()
  {
     System.out.println(partOne);
     System.out.println(partTwo);
  }
}
class Child extends Parent
{
  private int partOne = 2;
  public int partTwo = 3;

  public void main(String[] args)
  {
   Child child = new Child();
   child.tellMe();
  }
}

在 Eclipse 中 调试 时 , 观察 栈 中 的 变量child , 发现 Child 实例 有 4 个 字段 , 两个 由 其 类 定义 , 两个 由 其 父 类 , 我 很 困惑 . 是 否 是 我 的 时候 创建 了 父 实例 .创建一个子实例,IMP,我认为它只进入父类的构造函数,但我无法解释为什么子类不覆盖这两个字段,或者至少,我认为它应该覆盖具有公共可访问性的partTwo .请告诉我是什么原因,谢谢。

4

2 回答 2

4

为什么子类不覆盖这两个字段,或者至少,我认为它应该覆盖具有公共可访问性的 partTwo

在 Java 中,数据成员不是多态的。这意味着在您的示例中,类中定义的两个字段与Child类中的两个字段完全无关Parent,即使它们碰巧共享它们的名称。

尽管语言允许这样做,但做这种性质的事情只是造成混乱的秘诀(正如您所发现的那样)。

如果您想要多态行为,请创建两个成员函数,getPartOne()getPartTwo(), 并根据需要覆盖它们。

于 2012-05-26T13:14:09.407 回答
0

发生的情况是,您通过在类上使用相同的名称重新定义它来隐藏对类字段partTwo的访问。实际上,您应该从编译器那里得到一个警告。ParentChild

做以下实验,看看发生了什么:

  • 向两个类添加适当的构造函数,调用superChild构造函数(是的,这不是必需的,但它可以帮助使事情更清晰)。
  • 在构造函数中初始化您的字段,而不是直接在字段声明中进行。
  • 到目前为止,代码将执行相同的操作。
  • 现在partTwo从类中删除变量Child- 它仍然会编译,但这次Child将应用构造函数设置的值(并且警告将消失)。

您可能已经看到我发布的关于封装的评论 - 只有私有字段可以防止这种混淆,并允许以后更好地维护您的类,因为您可以在不影响继承类的情况下更改类的字段(只要访问的方法数据保持不变)。

于 2012-05-26T13:15:18.563 回答