一段代码理解Java的引用和内存

思考下面的简单代码

public class Study_9_30_1 {
	public static void main(String[] args) {
		Person p1 = new Person();
		p1.name="老张";
		Person p2 = p1;
		p2.name = "老李";
		p1.show();
		p2.show();
	}
}
class Person{
	String name;
	public void show() {
		System.out.println(name);
	}
}

此代码的运行结果会输出什么?

运行结果

在这里插入图片描述
为什么p1.name和p2,name都为李四?
看下面这张图片
在这里插入图片描述
当创建一个person类的对象p1时,此时会在栈里声明一个p1,并在堆里分配快内存,p1指向这块内存;当执行Person p2 = p1;语句时,同样会在栈里声明一个p2,,并且p2同样指向一块内存(就是p1所指的内存,同一块内存),当p2改变时就是改变p1所指的内存里的内容

下面看看带注释的代码


public class Study_9_30_1 {
	public static void main(String[] args) {
		Person p1 = new Person();
		p1.name="老张";
		//引用的赋值是将p1所指向的对象赋值给p2;
		Person p2 = p1;
		//此时p1和p2指向同一块内存,所以修改p2等于修改p1
		p2.name = "老李";
		p1.show();//老李
		p2.show();//老李
	}
}
class Person{
	String name;
	public void show() {
		System.out.println(name);
	}
}

从内存的角度去理解代码比较好理解,易接受;

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值