请考虑以下情况:
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中,一种子类可以访问超类的方法。私人成员,没有声明他们protected
(因为这会将他们暴露给整个包),可能是使用超类'吸气剂和二传手。不仅在子类中'构造函数,但需要它。
这是人们使用的东西吗?共同?你见过这个吗?
答案 0 :(得分:1)
是的,这是一种常见的方法,特别是为了封装超类的内部工作。
考虑一个要进行子类化的库类。当使实例变量对子类可见并且有人必须更改超类并且可能删除新版本中的字段时,它将使该库版本与旧版本不兼容。
对于您自己的类也是如此,但如果将字段暴露给内部子类,则可能没有问题。
然而,使用另一个变量并在上面的构造函数中调用getter会有问题,因为您还必须覆盖setter才能获得有关更改的通知,这会增加复杂性和代码几乎没有任何好处
答案 1 :(得分:0)
是。是很常见。并且最好暴露字段(即使仅作为protected
)。类的封装不仅仅用于隐藏构造和使用实例的代码的细节,还用于将它们隐藏在子类之外。
我说这不仅是常见的 - 它是(而且应该是)常态。我写了数千个班级和数十个内部图书馆;多年来,我还没有成为公共场所的公共场所,受到保护或打包私密。