Java 子类使用getter和setter访问超类成员是否常见? 请考虑以下情况: class A{ private int num = 10; public int getNum(){ return num; } public void setNum(int num){ this.num = num; } } class B extends A{ private int num; public B(){ num = getNum(); } }

Java 子类使用getter和setter访问超类成员是否常见? 请考虑以下情况: class A{ private int num = 10; public int getNum(){ return num; } public void setNum(int num){ this.num = num; } } class B extends A{ private int num; public B(){ num = getNum(); } },java,inheritance,Java,Inheritance,在Java中,子类访问超类私有成员的一种方法是使用超类的getter和setter,而不声明它们受保护(因为这将使它们暴露于整个包中)。不仅在子类的构造函数中,而且在任何需要的地方 这是人们使用的东西吗?普通的?你见过这个吗?是的。这很常见。最好是公开字段(即使仅受保护)。类的封装不仅用于隐藏构造和使用实例的代码的细节,而且还用于隐藏子类的细节 我想说,这不仅仅是普遍现象——它是(而且应该是)常态。我写过成千上万的课程和几十个内部图书馆;我已经多年没有将成员字段公开、保护或包私有。是的,这是一种

在Java中,子类访问超类私有成员的一种方法是使用超类的getter和setter,而不声明它们受保护(因为这将使它们暴露于整个包中)。不仅在子类的构造函数中,而且在任何需要的地方


这是人们使用的东西吗?普通的?你见过这个吗?

是的。这很常见。最好是公开字段(即使仅受
保护
)。类的封装不仅用于隐藏构造和使用实例的代码的细节,而且还用于隐藏子类的细节


我想说,这不仅仅是普遍现象——它是(而且应该是)常态。我写过成千上万的课程和几十个内部图书馆;我已经多年没有将成员字段公开、保护或包私有。

是的,这是一种常见的方法,尤其是为了封装超类的内部工作

考虑一个要被子类化的库类。当使实例变量对子类可见时,有人将不得不更改超类,并可能在新版本中删除该字段,这将使库版本与旧版本不兼容

这同样适用于您自己的类,但如果您将字段公开给内部子类,则问题可能不会那么严重


但是,使用另一个变量并像上面那样在构造函数中调用getter会有问题,因为您还必须重写setter,以便在更改时获得通知,这会增加复杂性和代码,几乎没有好处。

这是一种有效的做法,虽然我看不出实例变量
B.num
的意义,但您可以在需要的地方使用getNum(),在使用私有变量的地方可以使用超类的方法。总之,您可以通过超类的
public/protected
方法使用
private
变量。在这里,您使用返回值为
num
getNum()
方法。您编写了“没有声明它们受保护(因为这将使它们暴露于整个包中)”。那是错误的。“受保护”意味着只有继承类才能访问。这似乎就是您要查找的内容。为什么要重复子类中的
num
字段?B已经从a继承了一个名为
num
(可通过
getNum()
setNum()
访问)的字段。为什么要在B中重复它?(请注意,B中的
num
既不可访问,又始终为0,给定如图所示的代码。)@blafasel:不,这是错误的: