Java自学随笔 - 创建对象使用时的内存分析随笔1
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java自学随笔 - 创建对象使用时的内存分析随笔1,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2953字,纯文字阅读大概需要5分钟。
内容图文
![Java自学随笔 - 创建对象使用时的内存分析随笔1](/upload/InfoBanner/zyjiaocheng/941/f70118effee74209bf1fbad58d7b69e0.jpg)
对象通过类中自带的构造方法类创建(此处不详细展开)
那么在创建对象的过程中,对象去访问成员变量,jvm又发生了哪些变化呢?
此处通过代码和画图的形式来详解
code图:
实际完整code:
class husband{
String name;
wife w;
}
class wife{
String name;
husband h;
}
public class Demo10 {
public static void main(String []args){
husband huangxiaoming = new husband();
huangxiaoming.name = "黄晓明";
wife yangying = new wife();
yangying.name = "杨颖";
huangxiaoming.w = yangying;
yangying.h = huangxiaoming;
System.out.println(huangxiaoming.name + "的妻子的名字: " + huangxiaoming.w.name);
}
}
接下来我们逐行代码分析,jvm中的内存变化过程
step 1:
创建了一个公共类,且这个类名和java文件名一致,那就是主类
step 2:
创建了两个类,一个husband类,一个wife类。
那么此时的jvm的内存结构是什么样的呢?
step 3:
创建了两个对象,并对各自类中的实例变量name进行初始化赋值
husband huangxiaoming = new husband();
huangxiaoming.name = "黄晓明";
wife yangying = new wife();
yangying.name = "杨颖";
此时的jvm内存图为:
step 5:
huangxiaoming.w = yangying;
上述代码,yangying这个变量储存的内存地址赋给了huangxiaoming这个引用实际指向的husband对象中的w,也就意味着此时的实例变量w是指向yangying的实际对象
yangying.h = huangxiaoming;
上述代码,栈中huangxiaoming变量所存储的所指对象内存地址,赋给了yangying的实际对象中的对象变量h,那么此时也就是说,对象变量h中的内存地址和huangxiaoming中是一样的。
那么我们发现了一个有趣的地方如图:
huangxiaoming和yangying他们的实际对象中的w,h的内存地址各自指向对方在堆内存中的内存地址,所以也就是说,通过这样的内存地址交换,使得我只需要创建一个对象,我这个对象下的对象变量还会去指向其他对象中的对象变量,一环套一环,使得对象之间可以联系起来。
比如,我想要输出:黄晓明的老婆的名字叫什么
System.out.println(huangxiaoming.name + "的妻子的名字: " + yangying.name);
这么写可以么?当然可以,也没错。但是我们需要弄清楚一个需求:黄晓明的老婆的名字?
黄晓明的老婆是何种关系?是从属关系,也可以理解为黄晓明是主目录,而老婆是子目录,子目录属于主目录。上述yangying.name这个打印出来的,和黄晓明没有关系。
那也就是说不同对象之间是可以通过各自的实例变量使用step5的方式联系起来,这样使得输出的数据更有逻辑性和合理性。如果还没有明白,下面这个图可以更为直观的描述,为什么不能直接用
**System.out.println(huangxiaoming.name + “的妻子的名字: " + yangying.name);**来输出结果?举一个不恰当的例子,如下
这里有部电影,电影是《我的二战》(名字我瞎编的),电影记录了主人公经历了抗日战争,中途岛战役,诺曼底登录这三个阶段中战斗的故事,并且每个章节的结尾,都会用同一句话来结尾:“终于打赢了”。且会使用不同状语去修饰喊出这句话的时候的一个状态。
从开始的悲愤,到最后的兴高采烈,都体现了主人公在每个章节结尾处的心态变化。那么如果用代码的思想来考虑下:
我要打印我在最后一个章节,说出的那句结尾的话,那么就有:
System.out.println(我.第三章.兴高采烈.结束语);
那么我们比较一下:
System.out.println(我.第一章.悲愤.结束语);
System.out.println(我.第二章.艰难.结束语);
System.out.println(我.第三章.兴高采烈.结束语);
虽然最终打印出来的都是"终于打赢了”,但是实际上话语中的心理变化是不一样的,所以这三句"终于打赢了"并不相同。
内容总结
以上是互联网集市为您收集整理的Java自学随笔 - 创建对象使用时的内存分析随笔1全部内容,希望文章能够帮你解决Java自学随笔 - 创建对象使用时的内存分析随笔1所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。