String作为形参传递和基本类型以及引用类型的不同

关于String类型作为形参传递的问题,String类型作为一个特殊的类型,有着其特殊性

首先,String类型是一个引用类型,但是其在内存中存储却是存储在常量池中

普通的引用类型作为形参传递时,我们可以看做该方法在内存中创建了一个参数的副本,方法中进行操作时,都是对其副本进行操作,例如下图:

假设,原Student对象指向的是0x001这个地址,那么副本也是指向0x001,下一步便是将副本中name和age的值进行改变,注意,改变的仅仅只是name和age的值,而副本此时还是指向0x001这个地址,而整个方法调用的过程中,唯一改变的就是创建的对象中的属性;就是说,老六这个人,在22岁的时候,人家都是叫他二哥的,但是这个人还是这个人。

但是,如果直接改变地址值,比如,在方法中重新new一个Student对象赋值;那么s的指向就发生了改变,但是,注意,此时改变的只是副本中的取值。假设原Student对象指向0x001,则调用方法后,副本和实参同时指向0s001;而改变的是方法创建的副本,他的指向由0x001变为了0x002,也就是说,原对象和副本指向不同了,那么副本对其对象无论进行什么操作,对原引用类型对象无任何影响,例如下图:

下面我们说说基本数据类型,基本类型在副本中操作时,直接进行赋值,并没有地址的改变。等于是你的双胞胎弟弟,他做什么,跟你毛关系么得。

最后说下最特殊的String类型,每一个String类型的对象都指向常量池中的一个地址,按道理,他的传递应当和引用类型的原则一致。

但是它有个特殊的特点在于,String类型的值改变,地址就会改变(内容相同,指向就相同,只要内容不同,指向就不同),如图:

所以说,虽然可能在形参中只是改变了String对象的值,但是其地址却也是改变了,如下:

就是说,副本中地址变了,跟原对象就没了关系

转载于:https://my.oschina.net/u/2450196/blog/742029

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值