繁体   English   中英

超级类和子类之间的数据所有权

[英]Data Ownership between super class and sub class

当子类继承父类时,子类与在父类中定义的具有不同可访问性的字段之间的关系是什么,该字段归子类所有,哪些不是。 有人可以解释以下示例:

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();
  }
}

in the stack , I found the Child instance has four fields , two defined by its class and two by its parent class , I was very confused.Did I create a parent instance when I create a child instance , IMP , I think it only enter the parent class's constructor, but I can't explain why the child class don't override the two fields , or at least , I think it should override the with the accessibility .Please tell me what is the reason, thanks. 当我在Eclipse中调试它时,我看着堆栈中的变量 ,我发现Child实例有四个字段,两个字段由其类定义,两个字段由其父类定义,我感到非常困惑。我创建父实例时,创建一个子实例IMP,我认为它只能输入父类的构造函数,但我无法解释为什么子类不覆盖这两个字段,或者至少,我认为它应该使用可访问性来覆盖 。请告诉我原因是什么,谢谢。

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

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

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

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

发生的情况是,您通过在Child类上使用相同的名称重新定义了对Parent类的partTwo字段的访问权限。 实际上,您应该从编译器收到有关此的警告。

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

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

您可能已经看到了我发表的关于封装的评论-仅使用私有字段可以防止此类混淆,并在以后更好地维护您的类,因为您可以更改类的字段而不会影响继承类(只要访问方法数据保持不变)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM