java中子类与父类同名字段并非覆盖,而是各自独立分配内存空间,一个对象实例中同时存在两份同名变量;父类字段位于对象头后的父类字段区,子类同名字段紧随其后位于子类字段区,通过this.x和super.x可分别访问,且变量访问基于编译时类型静态绑定。

Java中子类与父类同名属性在内存中是各自独立分配空间的,不是覆盖,而是共存——一个对象实例里实际存在两份同名变量。
每个类的字段都在对象内存中占独立位置
当创建子类实例时,JVM会为整个继承链上所有非静态字段逐层分配内存:先分配父类字段空间,再在其后追加子类自己定义的字段。即使名字相同,它们位于不同偏移地址,互不影响。
- 父类字段存储在对象头之后的“父类字段区”
- 子类新增字段(含同名字段)紧接其后,属于“子类字段区”
- 二者物理隔离,可同时读写,比如
super.value和this.value指向不同内存单元
访问哪个值,取决于引用的编译时类型
变量访问不看对象真实类型,而看变量声明时的类型——这是编译期决定的静态绑定。
Java Linux版下载入口,提供 Oracle JDK 26.0.2 官方 Linux 安装包、Java 环境配置、JDBC 数据库连接和 Java 服务端开发相关信息。
-
Parent p = new Child(); System.out.println(p.value);→ 输出父类字段值(因p声明为Parent) -
Child c = new Child(); System.out.println(c.value);→ 输出子类字段值(因c声明为Child) - 强制转型如
((Parent)c).value仍访问父类字段区,不改变内存布局
子类方法里如何区分两个同名变量
在子类非静态方法内部,可通过关键字明确指定访问目标:
-
this.value:访问子类自己定义的字段(即子类字段区) -
super.value:访问父类中被隐藏的同名字段(即父类字段区) - 直接写
value等价于this.value,默认使用子类字段
继承来的字段 vs 子类重声明字段的本质区别
关键不在“有没有同名”,而在“是否重新声明”:
- 若子类没声明
int value,则只有一份父类字段,b.value = 200改的就是它 - 若子类声明了
int value,就新增一份字段,此时b.value = 200改的是子类字段,父类字段仍是初始值 - 父类方法(如
show())体内用的value永远绑定父类字段区,不受子类是否重声明影响
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










