私有成员和继承[重复]
Posted
技术标签:
【中文标题】私有成员和继承[重复]【英文标题】:Private members and inheritance [duplicate] 【发布时间】:2015-01-21 09:55:54 【问题描述】:我在一本教科书中读到,标记为私有的类成员不会被继承。
所以我想如果A
类有一个private
变量x
和B
类将扩展A
类,那么B
类中就不会有变量x
。
但是,以下示例表明我误解了这一点:
public class testdrive
public static void main(String[] args)
B b = new B();
b.setLength(32);
System.out.print(b.getLength());
class A
private int length;
public void setLength(int len)
length = len;
public int getLength()
return length;
class B extends A
public void dummy()
结果是 32,我很困惑,因为它看起来像带有 ref b
的对象现在有变量 length
,它的值是 32。但是 ref b
指的是从类 B
创建的对象,其中length
变量未定义。
那么真相是什么,B
类是否继承了private
变量length
?如果是这样,private
变量没有被继承是什么意思?
【问题讨论】:
不要在你的标题中添加“Java”,你已经用java
标记了你的问题。
【参考方案1】:
private
的字段隐藏在 B
中。但是,您的 public
方法是继承的并且是可访问的,并且它们可以访问私有字段。
【讨论】:
【参考方案2】:嘿伙计,这不是你想的那样,私有字段只能被同一个类中存在的方法访问(当然,这些方法可以从其他类访问)
不是你可以直接调用:
b.length=8;
或者你甚至不能这样做:(写在你为B创建对象的地方)
A a = new A();
a.length=8;
这两种方法都无效!
更多信息:
你甚至不需要从 A 扩展 B,只需在 main 中创建一个 A 的对象并使用你的 get 和 set 方法,它也可以工作!
【讨论】:
【参考方案3】:您不能直接访问超类的私有字段和方法,但可以通过使用其他公共方法来访问它们。
这是面向对象编程的基本概念之一,它被命名为封装。 在此处阅读更多信息:TutorialsPoint。
底线:您不能直接访问这样的私有字段或方法
b.length = 32;
也不是这样(对于超类)
A a = new A();
a.length = 32;
但您可以通过使用示例中的公共方法来操作这些字段。
原因很简单:您的 private 字段/方法对于其他类除了拥有它们的类隐藏,但是您的 private strong>public 字段/方法未隐藏。
【讨论】:
问题不在于 getter/setter 是如何工作的,而是为什么length
字段在 B 类中是 inherited 或 accessible 如果private
字段不被继承。
我编辑了帖子并纠正了我的错误。感谢您的回复!:)以上是关于私有成员和继承[重复]的主要内容,如果未能解决你的问题,请参考以下文章