网站首页 > java教程 正文
昨天我们说到了面向对象编程思想,今天我们来探讨一下对象在内存中的结构是怎么样的。
1、对象在内存中的结构:
java在数据存储过程中一般分为栈区、堆区、常量区等,我们的对象存储一般涉及的栈区和堆区,即在栈内存中存储和堆内存中存储,栈内存是存储基本数据类型和变量名地址的 而堆内存是用来存储对象的。也就是说如果我们new了一个对象,那么他的变量名地址会存放在栈内存中,他的具体指向会存放在对象的堆内存的区域:
大致的指向就长这个样子,画得不好多多见谅。从这个图中我们可以看到,假设我们有一个学生类:Student ,当我们 执行 Student student = new Student(); 时。我们的程序会在栈内存中去申请一个内存空间,然后在内存中存放一个指向堆内存中的空间。而我们对象的属性会存储在堆内存中。同样的 堆内存中依旧存放属性的内存地址。一个指向具体值的地址,指向常量区的地址。
2、对象数属性如何赋值的:
当我们创建一个对象时,我们相当于申请了一个存放数据的地址,但是具体属性是没有值得。那么我们就需要给属性进行赋值。这里我们再说一个区域:常量池。我们为变量赋予的具体值,一般会存放在常量池中。即 student.name = "弓长"; 弓长就会被放在常量池中,而我们的name中存放指向常量池的地址。
差不多就长成这个样子。我们常量区里面的数据是最多只会有一个相同数据,也就是说,当student1也叫弓长的时候,只会更改指向常量区的地址,常量区不会去新增一个弓长。也就是说变量之间的赋值,也不是常量的赋值,而是引用地址的赋值 如 student1.name = student.name 中,只是将指向”弓长“的引用地址进行了赋予,并不会在常量区中重新分配一个”弓长“。
3、对象之间的赋值
既然说到了变量之间的赋值,那么我们再说说对象之间的赋值。我们前面说了,对象存放数据是在栈内存中存放一个指向堆内存的地址,那么当我们针对对象之间赋值也是地址指向的赋值。
如 :我们让student.name = "弓长" student.age = 12
student1.name = "张" student.age = 15 时
当 student = student1 时:
赋值都地址指向大致就会变成这个样子,此时我们student和student1同时指向一个地址,而没有被指向的地址区域中的数据就会被认定为垃圾数据,被垃圾清理机制清理掉。
那么当我们对student.name的值进行修改时,student1.name也会发生变化,这就是对象的赋值。他是一个地址传递的过程,而不是值传递的过程。通俗的例子来说 就是一个人 叫张三,一天他起了个笔名叫弓长,当弓长写了一篇文章时,张三也就写了一篇文章。
都看到这里了,请点个关注再走呗!!
猜你喜欢
- 2025-05-05 数据库连接池在Java应用中的应用(数据库连接池的好处)
- 2025-05-05 Java中常见的内存泄 漏场景及解决方案
- 2025-05-05 JVM 深度解析:运行时数据区域、分代回收与垃圾回收机制全攻略
- 2025-05-05 MongoDB与Java的高效结合:打造数据存储的双赢局面
- 2025-05-05 Java学习日志 - 一篇文章解释清楚Java的引用数...
- 2025-05-05 一文吃透Java内存模型:从原理到实战
- 2025-05-05 Java虚拟机内存管理深度解读(java虚拟机启动内存参数)
- 2025-05-05 SpringBoot对于非结构的JSON数据进行动态存储?
- 2025-05-05 13 张图解 Java 中的内存模型(java内存模型有哪些)
- 2025-05-05 「zookeeper详解图文七」ZK集群服务节点角色、状态以及数据存储
你 发表评论:
欢迎- 最近发表
-
- Java对象栈上分配(java对象分配在栈上)
- Java中类和对象到底是什么?一场技术、哲学与设计的深度探索
- VSCode手动创建SpringBoot项目的方法,及详细步骤
- Redis全栈应用实战:从缓存到分布式系统全场景解析
- 用Ansible从零开始部署Spring Boot Web应用:全栈自动化部署指南
- Docker + Kubernetes部署Java应用:从容器化到集群管理的全栈体验
- 如何成为python全栈工程师(python全栈要学多久)
- 俄罗斯程序员创建了外国Java集成开发环境的国产替代品
- Java开发环境最丝滑的打开方式(java项目开发环境)
- idea最新激活jetbrains-agent.jar包,亲测有效
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)