java中继承不支持属性覆盖,只支持字段隐藏:访问哪个字段取决于变量声明类型而非实际类型;private字段同名时完全隔离;应通过getter/setter、抽象方法或构造注入实现多态语义。

字段隐藏的本质:引用类型决定访问哪个字段
当父类和子类声明了同名字段(无论 private、protected 还是 public),它们在内存中独立存在,互不影响。访问哪个字段,取决于变量的声明类型,而非对象的实际类型。
-
Parent p = new Child();→p.field访问的是 Parent 类定义的 field -
Child c = new Child();→c.field访问的是 Child 类定义的 field -
((Child)p).field或super.field(在子类内部)可显式访问子类或父类版本
private 字段同名:完全隔离,无任何关系
父类的 private 字段对子类不可见,子类声明同名 private 字段时,只是新增一个独立字段——两者在同一个对象实例中并存,但彼此无法感知。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 子类无法用
super.xxx访问父类的 private 字段 - 父类的 private 字段仍存在于对象内存中(可通过反射读取),但逻辑上被“屏蔽”
- 这不是覆盖,也不是隐藏的常规形式,而是命名空间隔离
如何避免混乱并实现真正的可定制语义
若你希望子类能提供不同值,且外部调用能体现多态性,请不要直接暴露字段,改用以下方式:
- 把字段设为 private,提供 protected getter/setter,让子类重写 getter 方法
- 父类定义 final getValue(),委托给抽象方法 doGetValue(),由子类实现
- 用构造器注入值(如
super(value)),配合 final 字段,保证不可变与清晰意图 - 避免在父子类中使用相同字段名,尤其当涉及业务含义时(如
name、id)
特别注意 static 和访问修饰符的影响
static 字段不参与隐藏规则:子类声明同名 static 字段,会隐藏父类 static 字段,但访问仍由引用类型决定;而修改 Parent.staticField 会影响所有通过 Parent 引用访问它的代码。
-
protected/ 包级字段可被super.field在子类中访问(仅限直接父类) -
public字段虽可被外部访问,但依然遵循“声明类型决定字段”的隐藏规则 - 字段类型不同时(如父类
int x,子类String x),编译报错 —— Java 不允许同名字段类型不同
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










