讲师中心 微信公众号
AI工具推荐 视频效率加速

Java 中继承对象的内存分配机制详解

阿芳大大_4005

阿芳大大_4005

发布时间:2025-12-30 14:17:01

|

707人浏览过

|

来源于php中文网

原创

Java 中继承对象的内存分配机制详解

java 中继承对象在堆内存中只创建一个连续对象实例,子类对象包含父类字段与自身字段的完整布局,通过统一对象头实现多态引用。

在 Java 中,当使用 new B(1, "b") 创建一个继承自 A 的子类 B 实例时,JVM 并不会在堆中分别分配两个独立对象(一个 A、一个 B),而是分配单一、紧凑的内存块,完整容纳整个继承链的所有实例字段。

内存布局结构(以 B b = new B(1, "b") 为例)

该对象在堆中的实际布局如下(忽略对齐填充和 JVM 版本差异细节):

内存区域 内容说明
对象头(Object Header) 包含 Mark Word(哈希码、GC 分代年龄、锁状态等)和 Class Metadata Pointer(指向 B.class 的 Klass 指针)
父类字段区 int id(来自 class A)
子类字段区 String name(来自 class B)
✅ 关键点:B 的实例直接内嵌了 A 的所有非静态字段(此处仅 id),而非持有对 A 对象的引用。因此,b 的内存地址即为整个对象起始地址——从该地址出发,JVM 可按偏移量精确访问 id(父类字段)或 name(子类字段)。

为什么能安全向上转型?——基于内存布局的“天然兼容”

B b = new B(1, "b");
A a = b; // 合法!无需额外拷贝或封装

之所以 B 类型引用可直接赋值给 A 类型变量,根本原因在于:

Java注释规范Skills
Java注释规范Skills

当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。

下载
  • A 的字段(id)位于对象内存的固定前缀位置;
  • A 的方法表(vtable)指针可通过 B 对象头中的 Klass 结构查找到其 A 部分的虚函数入口;
  • 因此,将 B 引用视为 A 引用,仅需语义层面限制可访问字段/方法范围,底层内存地址完全一致。

注意事项与常见误区

  • ❌ 错误认知:“B extends A 意味着 B 中‘包含’一个 A 对象” → 实际是字段扁平化合并,无嵌套对象。
  • ⚠️ private 字段仍被分配空间(如 A.id),但不可被 B 直接访问(编译器检查),仅可通过 super.id(若可见)或反射读取。
  • ? 字段顺序遵循声明顺序(父类字段在前,子类字段在后),JVM 可能重排序优化,但逻辑布局保证父子字段连续。
  • ? 静态字段(static)不参与实例分配,它们属于类元数据,存储在方法区(JDK 8+ 为 Metaspace)。

总结

Java 继承的内存模型是高效且直观的:单对象、多视图。每个子类实例在堆中表现为一块融合了全部祖先类(直至 Object)和自身定义的非静态字段的连续内存区域,并由统一对象头标识其真实运行时类型。这种设计既保障了 is-a 关系的语义正确性,又避免了额外的间接寻址开销,是 Java 多态实现的底层基石。

立即学习“Java免费学习笔记(深入)”;

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6879

2023.08.02

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

355

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

355

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

355

2025.11.27

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6879

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3305

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4288

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2925

2025.08.29

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn