子类是否从超类继承私有实例变量

时间:2012-05-08 00:36:19

标签: java inheritance encapsulation information-hiding

Do subclasses inherit private fields?

这个问题解决了同样的问题,但我不太明白这是如何满足以下(看似)矛盾的情况。

http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

说“子类不继承其父类的私有成员。”

这意味着它既没有继承私有实例变量也没有私有方法吗?

但是,如果从父级继承公共访问器方法,它是如何工作的?它返回一个它不知道存在的实例变量吗?

另外,我的计算机科学书籍(Baron的AP计算机科学A)对一个问题的正确答案是:“(子类)从(超类)继承所有私有实例变量和公共访问器方法。”

这不是收缩到oracle的教程吗?

感谢您的帮助

6 个答案:

答案 0 :(得分:10)

访问器可以正常工作。请记住,访问者在" context"中运行。超类的,因此访问者将能够看到隐藏在子类中的成员。

至于教科书,这取决于你的观点。子类继承私有成员,因为它们实际上存在于子类的实例内部(因此它们会占用内存等),但是子类将无法直接访问它们。

答案 1 :(得分:5)

把它想象成洋葱。层次结构的每个级别都是洋葱中的一个层。例如,如果类C扩展了类B,它扩展了类A,那么类C的对象看起来像:

Object of Class C

       -------------------------------------------------------------
       |                                                           | 
       |                   C and it's members                      |
       |                                                           |
       |    ------------------------------------------------       |
       |    |                                              |       |
       |    |              B and it's members              |       |
       |    |    ------------------------------------      |       |                                              
       |    |    |         A and it's members       |      |       |
       |    |    |                                  |      |       |
       |    |    ------------------------------------      |       |                                   
       |    ------------------------------------------------       |
       |                                                           |
       -------------------------------------------------------------            

因此,C类的对象确实有B和A的成员。但是它不能访问B和A的私有成员。

然而,它可以访问B和A的公共成员和受保护成员。

因此,B或A的公共访问器函数将允许C类的这个对象访问B类或A类“ part ”的私有实例变量。对象。

答案 2 :(得分:2)

“不继承”这里意味着您无法访问它。它仍然存在,只是没有任何可以与之交互的方式(除非通过调用超类的非私有方法)。

您链接的问题中的

The accepted answer确实解释了这一点。这个解释中有什么特别的部分不清楚吗?

答案 3 :(得分:1)

当你创建一个类B的对象时,如果类A有私有项,则继承自类A,根据Java中的访问规则,你< em>无法访问它们,但这些元素确实存在于私有内存中,即使它们是空对象也是空引用。

Java语言规范中,您可以阅读:

  

一个类继承自其直接超类和直接超接口   超类的所有非私有字段和超级接口   都可以访问类中的代码,而不是由a隐藏   在课堂上宣言。

     

子类可以访问超类的private字段 -   例如,如果两个类都是同一个类的成员。   然而,private字段永远不会被子类继承。

答案 4 :(得分:1)

如果子类在同一个包中,它继承私有成员,否则它只继承public和protected成员!

答案 5 :(得分:0)

私人成员也是继承的。要对此进行测试,您可以在超类中执行以下操作:

//...
private String myText = "I'm in the superclass";

private void setMyText(String myTextValue)
{
    this.myText = myTextValue;
}

public void setMyTextPublic(String myTextValue)
{
    setMyText(myTextValue);
}

public String getMyText()
{
    return myText;
}
//...

在继承的类中创建一个方法:

//...
public void setMyTextInTheSuperClass(String myTextValue)
{
    System.out.println(getMyText());
    setMyTextPublic(myTextValue);
    System.out.println(getMyText());
}

public void setConstantValueToMyText()
{
    setMyTextInTheSuperClass("I am in the child class");
}
//...

并在某处调用setConstantValueToMyText。