在面向对象编程中,私有成员(包括私有方法和属性)的设计意图是为了封装类的内部实现细节,防止外部直接访问和修改。私有成员只能在定义它们的类内部被访问。
这是因为私有成员的访问权限限制了它们只能在定义它们的类内部被访问。当子类重写一个方法时,它可以访问父类的私有getter方法,因为getter方法是用于读取私有属性的值,而不是修改它。然而,私有setter方法是用于修改私有属性的值,这违反了封装的原则,因此子类不能访问父类的私有setter方法。
class Parent {
private int privateField;
private int getPrivateField() {
return privateField;
}
private void setPrivateField(int value) {
this.privateField = value;
}
}
class Child extends Parent {
public void accessPrivateMembers() {
// 可以调用继承的私有getter
int value = getPrivateField(); // 这是允许的
// 不能调用继承的私有setter
// setPrivateField(10); // 这是不允许的,会导致编译错误
}
}
如果需要在子类中修改父类的私有属性,可以考虑以下几种方法:
class Parent {
private int privateField;
protected int getPrivateField() {
return privateField;
}
protected void setPrivateField(int value) {
this.privateField = value;
}
}
class Child extends Parent {
public void accessPrivateMembers() {
int value = getPrivateField(); // 这是允许的
setPrivateField(10); // 这也是允许的
}
}
interface PrivateFieldAccessor {
int getPrivateField();
void setPrivateField(int value);
}
class Parent implements PrivateFieldAccessor {
private int privateField;
@Override
public int getPrivateField() {
return privateField;
}
@Override
public void setPrivateField(int value) {
this.privateField = value;
}
}
class Child extends Parent {
public void accessPrivateMembers() {
int value = getPrivateField(); // 这是允许的
setPrivateField(10); // 这也是允许的
}
}
通过这些方法,可以在保持封装性的同时,允许子类访问和修改父类的私有属性。
领取专属 10元无门槛券
手把手带您无忧上云