子类是否从超类inheritance私有实例变量
子类是否inheritance私有字段?
这个问题解决了同样的问题,但我不太明白这是如何满足下面(看似)相互矛盾的情况。
http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
说“子类不inheritance其父类的私有成员”。
这意味着它既不inheritance私有实例变量也不inheritance私有方法?
但是,如果从父级inheritance公共访问器方法,它如何工作? 它返回一个它不知道存在的实例变量?
此外,我的计算机科学书籍(Baron的AP计算机科学A)对一个问题的正确答案是:“(子类)inheritance了(超类)的所有私有实例变量和公共访问器方法。”
这不是收缩到oracle的教程吗?
谢谢你的帮助
私人成员也是inheritance的。 要测试它,您可以在超类中执行以下操作:
//... 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; } //...
在inheritance的类中创建一个方法:
//... 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。
访问器将正常工作。 请记住,访问器在超类的“上下文”中运行,因此访问者将能够看到从子类隐藏的成员。
至于教科书,这取决于你的观点。 子类inheritance私有成员,因为它们实际上存在于子类的实例内(因此它们会占用内存等),但是子类将无法直接访问它们。
把它想象成一个洋葱。 层次结构的每个级别都是洋葱中的一个层。 例如,如果类C扩展了类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“ 部分 ”的私有实例变量。
“不inheritance”这里意味着您无法访问它。 它仍然存在,只是没有任何可以与之交互的方式(除非通过调用超类的非私有方法)。
你所链接的问题中接受的答案确实解释了这一点。 那个解释中有什么特别的部分不清楚吗?
当然,当你创建一个inheritance自类A
的类B
的对象时,如果类A
有私有项,根据Java中的访问规则,你不能访问它们 ,但这些元素确实存在于私有内存中,甚至如果它们是null对象,则为null引用。
在Java语言规范中 ,您可以阅读:
类inheritance自其直接超类并直接超接口超类和超接口的所有非私有字段,这些字段既可以访问类中的代码,也不会被类中的声明隐藏。
子类可以访问超类的
private
字段 – 例如,如果两个类都是同一个类的成员。 然而,private
字段永远不会被子类inheritance。
如果子类在同一个包中,它inheritance私有成员,否则它只inheritancepublic和protected成员!