9

子类是否继承私有字段?

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

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

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

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

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

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

这不是oracle教程的缩影吗?

谢谢你的帮助

4

6 回答 6

10

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

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

于 2012-05-08T00:38:47.397 回答
5

把它想象成洋葱。层次结构的每一层都是洋葱中的一层。例如,如果 C 类扩展了 B 类,而 B 类扩展了 A 类,那么 C 类的对象将如下所示:

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 类的私有实例变量对象的“部分”。

于 2012-08-15T08:54:45.687 回答
2

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

您链接到的问题中接受的答案确实解释了这一点。该解释中是否有任何不明确的特定部分?

于 2012-05-08T00:38:37.867 回答
1

当然,当您创建一个类的对象时,如果该类具有私有项,则该类B继承自一个类,根据 Java 中的访问规则,您不能访问它们,但是这些元素确实存在于私有内存中,即使作为空引用如果它们是空对象。AA

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

一个类从其直接超类和直接超接口继承超类和超接口的所有非私有字段,这些字段都可以被类中的代码访问,并且不会被类中的声明隐藏。

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

于 2012-05-08T00:43:42.140 回答
1

如果子类在同一个包中,它也继承私有成员,否则它只继承公共和受保护成员!

于 2016-08-08T14:12:32.070 回答
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 。

于 2012-05-08T00:48:13.613 回答