-------
下面绘出一段程序在内存中的存储过程:
该段程序有一个本类调用,代码如下:
class Demo
{
int x = 3;
public static void main(String[] args)
{
int y = 5;
Demo d = new Demo();
d.x = 10;
show(d);
/*
这句话是说在堆内存中新开辟了一个空间存放匿名对象new Demo(),作为值传递给show函数,
所以有x = 3;经show中x赋值后得到 x = 6,覆盖了x = 3.即:new Demo().x = 6。
和最后的打印 d.x 没有关系。注意:d得到的是 new Demo()的首地址值。
*/
show(new Demo());
System.out.println(d.x);
}
public static void show(Demo p)
{
p.x = 6;
}
}
下图绘出的从读取主函数,对象的建立到调用show函数在内存中存储的全过程:
程序在执行时,主函数是JVM所识别的接口,所以会在栈内存内开辟一个空间用来存储主函数中读取到的各个变量,当读取到Demo d = new Demo()时,系统会在堆内存中开辟空间用来存储new Demo()这个对象,且该对象中有成员变量x=3,d是类类型变量,它所接收的是new Demo()在堆内存中存储位置的首地址,用来指向这个对象。接下来,d.x=10,即将10赋给x,所以对内存中x=3被覆盖,变为x=10。当读取到show(d)时,这是函数调用,且将d作为值传递给了类类型参数p,那么p就得到了指向new Demo()对象的首地址值,那么在栈内存中就有show方法和main函数指向同一个堆内存,且将堆内存中x值再次更改为6,所以类类型变量d指向该对象的值也将改变,即x=6。show(new Demo()),该句话的分析方式同上,最后打印的是类类型变量d指向本对象中x的值,与show(new Demo())无关。
总结,理解程序在内存中的处理数据的方式是非常重要,有助于我们理清程序的执行过程,更清楚的知道各个语句所表达的意思,分析出正确的处理结果。虽然不要求画内存图,但作为初学者是必不可少的课程,有利于我们将基础知识掌握的更熟练,促进后期的学习进度。