子类能否访问父类属性取决于访问修饰符:private不可见;默认修饰符仅同包子类可见;protected允许跨包子类访问;public完全开放但不推荐。

子类能否访问父类的属性,取决于该属性声明时使用的访问修饰符,而不是“是否被继承”。Java 中所有非构造方法的成员(包括 private 属性)都会被子类继承,但能否访问,由修饰符决定。
private 属性:继承但不可见
父类中用 private 修饰的属性,子类**无法直接访问或修改**,编译器会报错。它虽存在于子类对象内存结构中(占用空间),但无访问路径。
- 不能在子类中写
this.privateField或super.privateField - 不能通过子类对象引用访问:
childObj.privateField❌ - 唯一可行方式:通过父类提供的 public/protected getter/setter 间接操作
默认(包级私有)属性:同包才可访问
不加任何修饰符的属性,仅对**同一包内的子类可见**。跨包继承时,该属性对子类不可见,如同不存在。
- 同包子类:可直接读写,如
this.packageField✅ - 不同包子类:编译报错,无法识别该字段名 ❌
- 即使子类对象在运行时拥有该字段,也无法在源码中合法引用
protected 属性:跨包子类也可访问
protected 是专为继承设计的修饰符。它允许:
- 同一包内任意类访问(含非子类)
- 不同包中的子类访问(通过
this.field或super.field)✅ - 但不允许不同包的非子类通过对象引用访问(如
obj.protectedField❌)
public 属性:完全开放,慎用
public 属性可在任何地方被任意代码访问和修改,破坏封装性。
- 子类可直接使用:
this.publicField✅ - 外部类也可直接调用:
obj.publicField✅ - 实际开发中应避免 public 字段,改用 private + public getter/setter 控制读写逻辑


















