子类不可直接访问父类的private属性,但可通过父类提供的public或protected getter方法间接获取其值;private作用域仅限声明类内部,getter仅暴露读取接口而不破坏封装。

父类的私有属性(private)在子类中**不可直接访问**,但若父类提供了 public 或 protected 的 getter 方法,子类**可以通过调用该 getter 访问对应属性的值**——这不是“访问私有属性本身”,而是通过父类开放的公共接口间接读取其值。
为什么子类不能直接访问父类 private 属性
private 是最严格的访问修饰符,作用域仅限于声明它的那个类内部。即使子类继承了父类,也不能绕过这个限制去读写父类的 private 字段。
例如:
class Parent {
private String name = "Alice";
}
class Child extends Parent {
void printName() {
// 编译错误!无法访问 private 字段
// System.out.println(name);
}
}
getter 方法如何让子类“间接访问”
只要父类为私有属性提供了符合访问权限的 getter(如 public 或 protected),子类就能像调用普通方法一样调用它,从而获取属性值。
- getter 必须是
public或protected(不能是private或包私有且子类不在同一包) - 子类中无需任何特殊语法,直接用
this.getXXX()或super.getXXX()调用即可 - 该方式只读取值,不破坏封装性;子类仍不能修改私有属性(除非 getter 返回的是可变对象引用)
示例:
class Parent {
private String name = "Alice";
public String getName() { // public getter → 子类可调用
return name;
}
}
class Child extends Parent {
void showName() {
System.out.println(getName()); // ✅ 正确:调用继承来的 public getter
System.out.println(super.getName()); // ✅ 也可显式用 super
}
}
注意事项和常见误区
-
getter 返回引用类型要小心:如果
private List的 getter 直接返回items items,子类拿到后可修改原集合。应返回不可变视图或副本(如Collections.unmodifiableList(items)) -
子类无法重写 private 方法或字段:哪怕子类定义同名
private字段,也与父类无关,不是覆盖 - 反射可以突破 private 限制,但不推荐:违反封装原则,影响可维护性和安全性,仅用于测试或框架场景
替代设计建议(更面向对象)
如果发现频繁需要“让子类读取父类私有状态”,可考虑:
- 将属性改为
protected(仅当子类确实需要直接访问且你信任继承体系时) - 在父类中提供受控的模板方法(
protected final模板 +abstract protected钩子) - 用组合代替继承,把可复用的状态提取为独立组件,由父类和子类共同持有
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











