案例一:
public class MathTest1{
public void main(String[] args){
Long a = 111L; //假设地址值为x111
changeNum(a); //debug1
System.out.println(a);
}
private void changeNum(Long num){
num = 222L; //debug2
}
}
最终输出还是"111L"
原因: Long a = 111L声明了一个引用数据类型变量a,并赋值a=111L
调用changeNum()方法,将a的地址值传递过去,但是,注意:
num = 222L; 相当于创建了一个新的引用数据类型222L,产生一个新的地址值,对变量num重新赋值一个新的地址值x222,并没有对地址值x111的值进行修改,因此,最终输出结果111
String中的str.replace()方法是一个道理,底层new了一个新的对象,所以使用str.replace()方法后,str还是原来的str,方法的返回值才是替代过的值
对同一个引用数据类型的数据替换,一定是建立在没有产生新的对象的前提下;通常都是比如说user.setId()/user.setUsername()...一类修改属性的方法
案例二:
public class MathTest2{
public void main(String[] args){
Long a = 1111L;
Long b = a;
a = 2222L;
System.out.println("a:"+a); //2222
System.out.println("b:"+b); //1111
}
}
1.首先在堆内存中创建一个对象,值为"1111L",将地址值保存到变量a中;
2.接着将a的地址值又保存到了变量b中;
3.在堆内存中再次创建一个对象,值为"2222L",将地址值重新赋值给变量a;
4.因此,a保存新的数据"2222L"的地址值,而b保存开始的数据"1111L"的地址值