当前位置: 首页 > article >正文

Java对象内存分配全解:从new Student()到this关键字,一张图看懂对象在内存中的完整生命周期

当你写下这行代码时Student stu new Student();你有没有想过这短短一行代码在内存中到底发生了什么对象存在哪里stu变量里存的到底是什么为什么方法里修改对象的属性外面的对象也跟着变了this到底指向谁如果你对这些问题似懂非懂那今天这篇文章就是为你准备的。我们将从内存角度一步步拆解Java对象的完整生命周期彻底搞懂面向对象底层原理。一、Java虚拟机三大内存区域快速回顾在开始之前先快速回顾一下Java虚拟机的三个核心内存区域区域作用特点栈内存存储方法调用和局部变量方法调用入栈执行完毕出栈堆内存存储new出来的对象、数组所有new创建的空间都在这里方法区存储类的字节码信息.class文件类加载时进入虚拟机关闭才释放重要方法区的字节码信息不会随方法执行完毕而消失它一直存在直到关闭虚拟机。二、创建对象的完整七步流程我们以最常见的代码为例Student stu new Student();这行代码在内存中经历了七个步骤第一步加载class字节码文件程序启动后Student.class文件被加载到方法区。类的所有信息属性、方法都存在这里等待被使用。第二步声明局部变量在栈内存中为变量stu开辟空间。这个变量将来要存储对象的地址。第三步在堆中开辟空间因为new关键字在堆内存中开辟一块空间。假设这块空间的地址是0x0011。这块空间就是我们平时说的“对象”。对象空间里存什么所有的成员属性name、age等所有成员方法在方法区中的地址方便调用时快速找到第四步属性默认初始化给成员属性赋予默认值int→0double→0.0boolean→false引用类型String、数组等→null第五步属性显式初始化如果定义成员变量时直接赋值了比如int age 18;就在这一步把默认值替换成你写的值。第六步构造方法初始化调用构造方法给成员变量赋值。如果用的是有参构造这一步就会把参数值赋给属性如果是无参构造这一步可能什么也不做。注意构造方法只是创建对象过程中的一步不是全部。第七步将地址赋值给变量将堆中对象的地址0x0011赋值给栈中的变量stu。从此stu这个变量就“指向”了堆中的对象。理解这一点很重要stu不是对象本身它只是存了对象的地址。就像你手里的门牌号不是房子本身但能帮你找到房子。三、对象的访问流程访问属性stu.name 小诗诗;从栈中找到stu拿到它存的地址0x0011通过地址找到堆中的对象修改或读取对应属性的值调用方法stu.study();从stu拿到地址0x0011找到堆中的对象对象里存了study方法在方法区的地址跳转到方法区执行study方法的字节码study方法入栈执行四、对象的生命周期与回收规则规则一方法出栈局部变量消失main方法执行完毕出栈后栈中的stu变量也随之消失。规则二没有变量引用的对象被回收当没有任何变量指向堆中的对象时这个对象就会被JVM垃圾回收器回收。因为已经找不到它了留着也没用。规则三方法区的字节码直到虚拟机关闭才消失类加载一次就够了字节码信息会一直存在直到关闭IDEA或关闭Java程序。五、对象作为方法参数传递的内存原理这是面试中经常问到的问题也是理解“为什么方法内修改对象会影响原对象”的关键。来看这段代码public class MemoryDemo { public static void main(String[] args) { Student stu new Student(); stu.name 小诗诗; stu.age 23; change(stu); System.out.println(stu.name ... stu.age); // 输出小丹丹...19 } public static void change(Student stu) { stu.name 小丹丹; stu.age 19; } }内存执行过程创建对象main方法中stu变量存着对象的地址0x0011对象属性是“小诗诗”和23。调用change方法change方法入栈形参stu也在栈中开辟空间。调用时把实参stu中存的地址0x0011复制一份传给形参stu。两个变量指向同一个对象现在栈中有两个stu变量一个是main的一个是change的它们存的地址都是0x0011指向同一个堆对象。修改对象change方法中通过形参stu找到堆中对象把name改成“小丹丹”age改成19。这是直接修改堆中的对象。方法出栈change方法执行完毕形参stu消失。但堆中的对象已经被修改了。回到main方法main的stu变量还在它存的地址还是0x0011访问到的就是修改后的值。核心结论Java中传递对象参数时传递的是对象的内存地址不是对象本身。传递地址后多个变量指向同一个对象。任何一个变量修改对象其他变量访问到的都是修改后的值。六、this关键字的内存本质this是Java中一个非常关键的关键字它的作用有两个区分同名变量当成员变量和局部变量同名时用this.访问成员变量代表当前对象哪个对象调用了方法this就指向哪个对象内存理解this就是调用者的地址public class Student { String name; int age; public void study() { int age 10; // 局部变量 System.out.println(age); // 10就近原则 System.out.println(this.age); // 成员变量的值 } }测试代码public class Test { public static void main(String[] args) { Student s1 new Student(小诗诗, 18); Student s2 new Student(小丹丹, 19); s1.study(); // 输出10 18 s2.study(); // 输出10 19 } }内存执行过程创建两个对象堆中有两个独立的对象地址分别是0x0011和0x0022。s1调用study方法study方法入栈方法内部自动记录调用者的地址。这个地址就是this此时this 0x0011。打印age不带this的age是局部变量输出10。打印this.agethis.age就是通过this存的地址0x0011找到s1对象的age输出18。s2调用study方法study方法再次入栈这次this 0x0022找到s2对象的age输出19。核心结论this的本质就是当前方法调用者的内存地址。哪个对象调用了方法this就指向哪个对象同一个类的多个对象共享方法区的同一份方法字节码依靠this区分“是谁在调用”七、总结一张图看懂对象内存分配内存区域存储内容生命周期栈内存局部变量存地址方法执行完就消失堆内存对象实例属性方法地址无引用时被回收方法区类字节码虚拟机关闭才消失核心理解变量存的是地址不是对象本身对象传参传的是地址所以方法内修改会影响原对象this就是调用者的地址用来区分“谁在调用”写在最后面向对象是Java的灵魂而理解内存中的对象是掌握面向对象的必经之路。

相关文章:

Java对象内存分配全解:从new Student()到this关键字,一张图看懂对象在内存中的完整生命周期

当你写下这行代码时:Student stu new Student();你有没有想过,这短短一行代码,在内存中到底发生了什么?对象存在哪里?stu变量里存的到底是什么?为什么方法里修改对象的属性,外面的对象也跟着变…...

用过才敢说! 全场景通用降AIGC平台 千笔·专业降AI率智能体 VS 万方智搜AI

在AI技术迅速发展的今天,越来越多的学术工作者和学生开始依赖AI工具来提升写作效率。然而,随着查重系统对AI生成内容的识别能力不断提升,论文中的“AI痕迹”问题日益凸显,成为影响学术成果合规性的关键障碍。许多人在使用AI辅助写…...

横评后发现 9个降AI率工具:专科生必看的降AI率测评与推荐

在当前学术写作中,AI生成内容(AIGC)的广泛应用让论文查重率和AI痕迹成为学生必须面对的问题。尤其是对于专科生来说,论文写作不仅需要符合学术规范,还要避免被系统识别为AI生成内容,这使得“降AI率”、“去…...

2026年科研党收藏!圈粉无数的降AIGC网站 —— 千笔

在AI技术快速发展的今天,越来越多的科研人员、学生和职场人士开始借助AI工具辅助论文写作。然而,随着查重系统对AI生成内容的识别能力不断提升,如何有效降低AI率和重复率成为学术写作中的一大难题。面对市场上五花八门的降AI率和降重复率工具…...

少走弯路:顶流之选的降AIGC软件 —— 千笔·专业降AI率智能体

在AI技术迅猛发展的今天,越来越多的学生、研究人员和职场人士开始借助AI工具进行论文写作与内容创作。然而,随着学术审核标准的不断提升,AI生成内容的痕迹愈发明显,导致论文面临“AI率超标”的风险。知网、维普、万方等查重系统不…...

用过才敢说! 更贴合全场景通用的降AI率网站,千笔·降AIGC助手 VS 知文AI

在AI技术迅速发展的今天,越来越多的学生、研究人员和职场人士开始借助AI工具进行论文写作和内容创作。然而,随着学术审核标准的不断提升,AI生成内容的痕迹愈发明显,查重系统对AIGC的识别能力也不断增强。面对日益严格的合规要求&a…...

交稿前一晚!降AI率工具 千笔·专业降AI率智能体 VS WPS AI 全行业通用

在AI技术迅速发展的今天,越来越多的学生、研究人员和职场人士开始借助AI工具辅助论文写作,以提高效率和质量。然而,随之而来的AI率超标问题却成为学术道路上的一大挑战——随着查重系统不断升级,对AI生成内容的识别愈发严格&#…...

直接上结论:10个降AI率软件降AIGC网站开源免费测评,哪款最实用?

在学术写作日益依赖AI工具的今天,如何有效降低AIGC率、去除AI痕迹并确保论文内容的原创性,已成为众多学生和研究者面临的共同挑战。AI降重工具应运而生,凭借其智能化处理能力,不仅能够精准识别文本中的AI生成痕迹,还能…...

CTF密码学实战:5种Base编码变种题解与Python实现(附完整代码)

CTF密码学实战:5种Base编码变种题解与Python实现(附完整代码) 在CTF竞赛中,Base系列编码题目几乎每年都会出现在密码学赛道。这类题目看似简单,但实际解题时往往会遇到自定义编码表、多层嵌套、混合加密等复杂情况。本…...

地磁场导航避坑大全:磁偏角/倾角处理中的5个常见错误

地磁场导航避坑大全:磁偏角/倾角处理中的5个常见错误 当你在上海外滩测试无人机航向时,电子罗盘突然显示机头方向偏离预定航线15度——这很可能不是传感器故障,而是忽略了地磁场的磁偏角补偿。全球地磁场分布如同一个巨大的不规则磁铁&#x…...

Prometheus时间同步问题排查指南:从浏览器到服务器的72秒差异修复实战

1. 问题现象:浏览器与服务器时间差引发的Prometheus告警 那天下午我正在查看生产环境的监控数据,突然发现Prometheus的Web界面上弹出一个鲜红的警告框:"Warning! Detected 72.65 seconds time difference between your browser and the …...

Mac安装第三方软件报错?3种终端命令一键解决「身份不明开发者」问题

Mac安装第三方软件报错?3种终端命令一键解决「身份不明开发者」问题 每次下载完心仪的Mac软件,双击时却弹出"已损坏"或"身份不明开发者"的警告,那种感觉就像收到礼物却打不开包装。作为常年折腾开发工具的设计师&#xf…...

多机器人路径规划避坑指南:CBS/ECBS算法常见问题与优化技巧

多机器人路径规划避坑指南:CBS/ECBS算法常见问题与优化技巧 在自动化仓储、无人配送、工业机器人协同作业等场景中,多机器人路径规划(MRPP)系统的性能直接影响整体效率。CBS(Conflict-Based Search)及其优化…...

Anki卡组实战:考研数学二线代124张卡片如何快速上手(含真题错题整理)

Anki卡组实战:考研数学二线代124张卡片如何快速上手(含真题错题整理) 考研数学二的线性代数部分,往往是许多考生复习过程中的"拦路虎"。不同于高数的直观性,线代的概念抽象、公式繁多,需要考生在…...

计算机毕业设计:Python基于Spark与协同过滤的智能图书推荐平台 Django框架 协同过滤推荐算法 书籍 可视化 数据分析 大数据 大模型(建议收藏)✅

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…...

计算机毕业设计:Python图书数据可视化分析系统 Flask框架 可视化 爬虫 书籍 大数据 机器学习(建议收藏)✅

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…...

基于vue+python智能医疗辅助就诊系统

目录技术选型与架构设计核心功能模块实现数据处理与AI集成部署与测试方案项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术选型与架构设计 前端采用Vue 3 TypeScript构建响应式SPA,使用Element Plus组件库实现医…...

卫星轨道六要素详解:从火箭残骸到GPS卫星的追踪原理

卫星轨道六要素详解:从火箭残骸到GPS卫星的追踪原理 当仰望夜空时,我们看到的不仅是闪烁的星光,还有数千颗人造卫星在按照精确计算的轨道运行。这些轨道并非随意设定,而是由六个关键参数严格定义——这就是航天工程中著名的"…...

Python豆瓣图书数据可视化平台 Flask框架 可视化 爬虫 书籍 大数据 机器学习 计算机毕业设计(建议收藏)✅

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,…...

基于Python的仿淘宝系统毕设

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在设计并实现一个基于Python的仿淘宝系统,以模拟真实电子商务平台的功能和操作流程。具体研究目的如下:验证Python在电子商务系统…...

T样条实战:如何在Autodesk Fusion360中设计汽车B柱并导入LS-DYNA分析

T样条在汽车B柱设计与LS-DYNA仿真中的全流程实战 1. 工业设计新范式:T样条技术解析 在汽车工业设计领域,T样条技术正逐渐成为复杂曲面建模的首选方案。与传统NURBS相比,T样条允许每个面存在多个特殊点(EP),这一特性使其在保持曲面…...

ArcScene点云可视化进阶:如何自定义RGB颜色映射打造专业级三维效果

ArcScene点云可视化进阶:如何自定义RGB颜色映射打造专业级三维效果 在三维地理信息系统中,点云数据的可视化质量直接影响着数据解读的深度和展示效果的专业性。对于需要向客户展示成果的地勘工程师、城市规划师或文化遗产数字化专家而言,粗糙…...

计算机毕业设计:Python豆瓣图书数据分析系统 Flask框架 可视化 爬虫 书籍 大数据 机器学习(建议收藏)✅

博主介绍:✌全网粉丝50W,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,…...

OpenCV去畸变实战:手把手教你用undistortPoints搞定鱼眼镜头图像矫正(附Python代码)

OpenCV鱼眼镜头去畸变实战:从标定到undistortPoints的完整指南 当你第一次用鱼眼镜头拍摄图像时,可能会惊讶地发现直线变成了曲线——这就是镜头畸变在作祟。对于计算机视觉开发者来说,这种畸变会严重影响特征点匹配、三维重建和目标跟踪的精…...

吐血推荐!全学科适配的AI论文神器 —— 千笔AI

你是否曾为论文选题发愁?是否在撰写过程中感到思路混乱、资料难寻?又或是反复修改却依然无法达到满意效果?论文写作不仅是学术能力的考验,更是时间与精力的挑战。面对这些难题,你是否渴望一个高效、智能的助手&#xf…...

Windows下VSCode配置OpenSSL开发环境避坑指南(C语言版)

Windows平台VSCode与OpenSSL开发环境深度配置实战 环境准备与工具选择 在Windows平台上搭建C语言开发环境,特别是涉及加密库调用时,往往会让不少开发者感到头疼。不同于Linux系统的开箱即用,Windows环境需要更多手动配置环节。本文将带你避开…...

GhostConv:YOLOv8 的轻量化利器,通过廉价线性变换实现高效目标检测

摘要 在目标检测领域,模型的计算效率与检测精度之间的平衡始终是一个核心挑战。YOLOv8 作为当前最先进的目标检测算法之一,在保持高精度的同时,其计算复杂度仍然较高,难以直接部署在资源受限的边缘设备上。本文提出了一种基于 GhostConv 的 YOLOv8 改进方法,通过引入 Gho…...

YOLOv8改进系列:C2f模块全面升级——从C2f到C2f-Faster、C2f-DCN的高效变体实战

摘要 YOLOv8作为目标检测领域的标杆模型,其核心组件C2f(Cross Stage Partial with 2 fusions)模块在特征提取与融合方面表现出色。然而,随着工业应用对模型实时性与精度的双重追求,原生C2f模块的优化空间逐渐成为研究热点。本文系统介绍了C2f模块的改进方案,包括轻量化变…...

YOLOv8改进之Involution:反转卷积思想,核在空间上共享但在通道上特异,减少冗余

1. 引言 在目标检测领域,YOLO系列模型以其高效、简洁的设计理念一直占据着重要的地位。YOLOv8作为Ultralytics公司推出的最新版本,在检测精度和速度上都达到了新的高度。然而,随着对模型性能要求的不断提高,如何在保持实时性的同时进一步提升检测精度成为了研究的热点。本…...

LLM之Agent(四十)|AI Agents(九):从单体到多体——构建可协作的智能体网络

1. 从单体到多体:为什么需要智能体协作网络? 想象一下你正在经营一家小型咨询公司。接到客户需求时,你需要同时完成市场调研、数据分析、报告撰写等工作。如果全靠一个人完成,要么质量难以保证,要么效率极其低下。这就…...