传址 java_JAVA传值与传址

要了解JAVA中的传值与传址问题,必要先要了解JVA中的栈内存和堆内存,

栈:基本数据类型、数据的引用变量,这两种存放在栈内存

堆:new创建的对象(包换数组),是存放在堆内存中,同时分配一个内存地址值,并将其附值给引用他的变量。

以上两点理解清楚了,传值还是传址问题就迎刃而解了。

以下代码运行结果:

classClassDemo

{public static voidmain(String[] args)

{

Person a=newPerson();

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);

}

}classPerson

{

String name;intage;

}

这段代码的运行步骤说明及示意图如下:

第一步——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三个变量的指向堆内存中的同一实体,任一属性值改变,其它的属性同是变化。

执行示意图如下:

7eab4a5e1aa05eb4906ed19369305624.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值