要了解JAVA中的传值与传址问题,必要先要了解JVA中的栈内存和堆内存,>>>>点些查看<<<<昨天写的学习记录
栈:基本数据类型、数据的引用变量,这两种存放在栈内存
堆:new创建的对象(包换数组),是存放在堆内存中,同时分配一个内存地址值,并将其附值给引用他的变量。
以上两点理解清楚了,传值还是传址问题就迎刃而解了。
以下代码运行结果:
class ClassDemo
{
public static void main(String[] args)
{
Person a=new Person();
a.age=20;
a.name="zhangsan";
Person b;
b=a;
b.age=33;
Person c;
c=b;
c.age=50;
System.out.println(a.age);
System.out.println(b.age);
System.out.println(c.age);
}
} class Person
{
String name;
int age;
}
这段代码的运行步骤说明及示意图如下:
第一步——Person a=new Person();
栈开辟空间,存放变量a;同hi ,堆中开辟空间,存放新创建的Person类实体,并分配内存地址值,假设值为0x0088,并将0x0088赋给堆中的变量a。
第二步——a.age=20;
给a在堆中的Person类对象创建age属性,附值20。
第三步——a.name="zhangsan";
给a在堆中的Person类对象创建name属性,附值zhangsan。
第四步——Person b;
栈开辟新空间,存放Person类变量b。此时b空间是空的,没有地址值。
第五步——b=a;
将a的内存地址值传给了b。此时,b也会指向堆中的Person类实体,即和a指向同一实体。
第六步——b.age=33;
给b在堆中的Person类对象创建age属性,附值33。所以,原来的20被替换成33。
第七步——Person c;
栈开辟新空间,存放Person类变量c。此时c空间是空的,没有地址值。
第八步——c=b;
将b的内存地址值传给了b。此时,c也会指向堆中的Person类实体,即和b指向同一实体。
第九步——c.age=50;
给c在堆中的Person类对象创建age属性,附值50。所以,原来的33被替换成50。
所以,以上栈内存中的a、b、c三个变量的指向堆内存中的同一实体,任一属性值改变,其它的属性同是变化。
执行示意图如下: