(个人学习记录!)
值传递
值传递不用讲了,java中的基础数据类型都是值传递,它在赋值时传递的是基础数据类型的一个副本,副本的修改和原数据没有关系。
引用传递
引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本,准确来讲是该对象的引用地址,赋值给同类型对象并修改,会影响到原数据。
值传递的基本例子
值传递很好理解,且就八种数据类型byte(1B) int(4B) short(2B) long(8B) char(2B) boolean(1bit) float(4B) double(8B)
int a=1;
int b=a;
b=2;
System.out.println(a); //1
System.out.println(b); //2
引用传递的基本例子
StringBuilder a=new StringBuilder();
a.append("a");
StringBuilder b=a;
b.append("b");
System.out.println(a); //ab
System.out.println(b); //ab
对b操作影响了a,这就是引用地址的传递
疑问
1、String和基础数据类型的装箱类也无法改变原对象
可以这样测试
String a="a";
String b=a;
System.out.println(a+" "+a.hashCode()); //a 97
System.out.println(b+" "+b.hashCode()); //a 97
String a="a";
String b=a;
b="b";
System.out.println(a+" "+a.hashCode()); //a 97
System.out.println(b+" "+b.hashCode()); //b 98
可以看到,修改b的值已经和原来的a不是同一个对象了,再联想到String是由final修饰的不可变字符串,可以理解为,b等于修改了a 后再new出来的一个String对象,同理在Integer中,我找到了
由此可知,装箱类中其实也是不可变的值,从而在修改时重新new了对象