Java中继承不是复制而是运行时天然访问父类非私有字段,public/protected/默认字段可被子类直接使用,private字段不可继承,子类对象内存中真实叠加父类非私有字段与自身字段,static字段不参与实例继承。

Java 中继承通过 extends 关键字实现类属性的传递,但不是“复制”,而是让子类对象在运行时**天然拥有对父类非私有字段的访问能力**,其本质是编译期可见性控制 + 运行期内存布局协同作用的结果。
可被继承的属性范围很明确
子类能直接使用(即“传递”成功)的父类属性,仅限以下三类:
- public 字段:同包、不同包子类均可直接访问;
- protected 字段:同包子类、不同包子类都可直接访问;
- 默认(包级私有) 字段:仅限同包子类可直接访问。
而 private 字段不会被继承——子类中既看不到该字段定义,也不能用 this.fieldName 直接调用。它只属于父类自身,子类必须通过父类提供的 public/protected getter/setter 方法间接操作。
属性在内存中是真实叠加存在的
当创建一个子类实例时,JVM 在堆中为其分配一块连续内存空间,结构是:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
- 前段存放从父类继承来的所有非私有字段(按声明顺序排列);
- 后段存放子类自己定义的新字段。
这意味着:子类对象内部确实“带着”父类的那些字段数据,不是引用或代理,而是实实在在的组成部分。例如 Dog extends Animal,每个 Dog 对象内存里既有 Animal.name 和 Animal.age,也有 Dog.breed。
访问时遵循严格的查找链
当你写 dog.name,JVM 查找过程是线性的:
- 先查
Dog类本身是否有name字段; - 没有就向上查
Animal; - 再没有就继续查
Animal的父类(如Object),直到顶层; - 若某层找到但修饰符不允许访问(比如
private),则编译报错; - 若全程没找到匹配字段,则编译失败。
静态字段不参与继承传递
父类的 static 字段属于类本身,不属于任何实例,因此不会出现在子类对象的内存布局中,也不能被子类“继承”为自己的实例属性。子类可以访问父类的 static 字段(如 Animal.COUNT),但这只是语法糖式的可见性共享,并非继承意义上的状态传递。

















