成员变量只有隐藏无重写,方法支持真正重写;变量访问由引用类型静态决定,方法调用由实际对象类型动态决定;隐藏非多态、易歧义,重写是Java多态基石。

本质区别在于:成员变量只有“隐藏”,没有“重写”;而方法支持真正的“重写”,这是 Java 多态的基石。
成员变量是静态绑定,只看引用类型
变量访问在编译期就确定了,取决于引用变量的声明类型,而不是实际对象类型。即使子类定义了同名变量,父类引用仍访问父类变量:
- Parent p = new Child(); → p.a 访问的是 Parent 中的 a
- 子类内部直接写 a 或 this.a,访问的是子类自己的变量(隐藏发生)
- 要访问被隐藏的父类变量,必须显式写 super.a
方法是动态绑定,看实际运行时对象
实例方法调用在运行期才决定执行哪个版本,依赖对象的实际类型:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。
- Parent p = new Child(); → p.say() 执行的是 Child 中重写后的 say()
- 重写要求方法签名(名称 + 参数列表)完全一致,返回类型协变、访问权限不能更严格
- 子类中可通过 super.say() 主动调用父类原方法
语义与设计意图完全不同
隐藏是编译器层面的“遮蔽”,不提供多态能力,容易引发歧义,官方明确不推荐;重写则是面向对象的核心机制,支撑运行时多态,让父类接口能统一调度不同子类行为:
立即学习“Java免费学习笔记(深入)”;
- 隐藏发生在字段(field)上,仅因名字相同就触发,与类型、修饰符无关
- 重写只适用于非 static、非 private 的实例方法,是语言级的多态支持
- 静态方法和成员变量一样,只能被“隐藏”,不能被重写

















