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

Ian*_*Ian 7 java inheritance encapsulation information-hiding

子类是否继承私有字段?

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

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

说"子类不继承其父类的私有成员".

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

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

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

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

谢谢你的帮助

Qua*_*nic 10

访问器将正常工作.请记住,访问器在超类的"上下文"中运行,因此访问者将能够看到从子类隐藏的成员.

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

  • +1是的,你的答案可以通过一个例子来强调:人类继承了(如果我们相信进化论)某种尾巴来自猴子(底部骨骼的一部分),但它们不能摇尾巴.他们只能看着猴子摇着他们的故事,或者给他们香蕉以鼓励他们摇晃他们的故事. (3认同)

Anu*_*kur 5

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

C类对象

       -------------------------------------------------------------
       |                                                           | 
       |                   C and it's members                      |
       |                                                           |
       |    ------------------------------------------------       |
       |    |                                              |       |
       |    |              B and it's members              |       |
       |    |    ------------------------------------      |       |                                              
       |    |    |         A and it's members       |      |       |
       |    |    |                                  |      |       |
       |    |    ------------------------------------      |       |                                   
       |    ------------------------------------------------       |
       |                                                           |
       -------------------------------------------------------------            
Run Code Online (Sandbox Code Playgroud)

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

但是,它可以访问B和A的公共和受保护成员.

因此,B或A的公共访问器函数将允许C类的此对象访问对象的类B或类A" 部分 "的私有实例变量.


Laj*_*pad 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;
}
//...
Run Code Online (Sandbox Code Playgroud)

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

//...
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");
}
//...
Run Code Online (Sandbox Code Playgroud)

并在某处调用 setConstantValueToMyText 。

  • 是的你是对的。如果您尝试直接从继承的类操作 myText,您的代码将无法编译。 (2认同)