我们都知道java的引用分为值引用和对象引用,那么值引用和对象引用在使用上的区别是什么呢?直奔代码。

java值引用和地址引用 java值引用和对象引用区别_set方法


我定义了四个对象,分别是String、StringBuilder、int、boolean类别。其中s、s1是对象引用,a、b是值引用。以下是执行结果

java值引用和地址引用 java值引用和对象引用区别_对象引用_02


经过查找,范县java方法调用传参数引用是引用的复制,而不是同一个引用,就是说在stack里面是两个不同的引用。可以参考

就是说,一个对象其实在方法执行中是有两个引用,String对象是不可变的,每次都会创建新的对象,所以,方法内部的引用其实是指向了另一个对象,方法外的引用还是指向原来的对象。但StringBuilder是操作的同一个对象,尽管方法内是不用的引用,但是两个引用对应的对象的值确实是改变了。

我们可以看到基本类型的值引用,体现出了和String类型相同的效果,其实本来就是这样,因为基本类型都是特殊的,既不属于对象,也不属于引用。姑且理解为跟String一样,每次赋值都是指向一个新的基本类型。

但是我们实际工作中操作的很多pojo对象,在方法内调用set方法时,事实都是可以改变pojo对象的某个属性的,难道这里和上面不冲突吗?其实我们仔细思考就能考虑出结果,一个pojo对象里面存的也是其他对象的引用,调用set方法时,其实是把对象的属性的引用设置成另一个对象的引用。可以把这种情况分层来看,stack里面的引用是第一层,对象的属性的引用是第二层,即使stack里面的引用不是一个,但是对应对象的属性的引用其实是一个,每次set都是操作的都是操作的对象属性的引用,所以我们实际工作的时候也根本没有体会。