Java中子类与父类同名变量不覆盖而独立存储,各自占用不同内存区域;字段访问为静态绑定,由引用类型决定而非实际对象类型,且static变量完全独立。

Java 中子类与父类同名变量在内存中并非“覆盖”,而是各自独立存储,共存于同一个对象实例的不同内存区域。
每个变量有独立的存储空间
当子类声明与父类同名的实例变量时,JVM 会在堆中为该对象分配两份独立的内存空间:一份属于父类字段,一份属于子类字段。它们物理上并存,互不干扰。
- 父类变量由父类构造器初始化,存在于对象的“父类部分”内存块中
- 子类变量由子类构造器初始化,存在于对象的“子类扩展部分”内存块中
- 即使名称相同,JVM 通过编译期绑定(字段签名 + 类型信息)区分二者
访问时遵循就近原则和显式限定
代码中对 name 的引用,默认指向当前类作用域内声明的变量;要访问被隐藏的父类变量,必须显式使用 super.name。
- 在子类方法中写
name→ 编译器解析为子类自己的字段 - 写
super.name→ 编译器解析为父类字段(仅限非 private) - 写
((Parent)this).name无效 —— 字段不支持多态,强制转型不能改变字段访问目标
向上转型后访问的是父类类型视角下的字段
若用父类引用指向子类对象(如 Parent p = new Child();),通过该引用访问 p.name,实际读取的是父类中定义的 name 字段(因为字段访问由引用类型决定,而非实际对象类型)。
立即学习“Java免费学习笔记(深入)”;
- 这与方法调用不同:方法是动态绑定,字段是静态绑定
- 所以
p.name、new Parent().name、new Child().name(直接用子类引用)三者可能输出不同值
static 变量的处理方式不同
静态变量属于类,不随对象实例存在。子类定义同名 static 变量时,并非“隐藏”,而是完全独立的新变量,与父类 static 变量无继承关系。
- 访问
Parent.count和Child.count操作的是两个不同的内存地址 - 无法用
super.count访问父类 static 变量,必须用Parent.count


















