在Java中,对象和基本数据类型的传递方式是不同的。对于对象来说,是引用的传递;而对于基本数据类型来说,是值的传递。
值的传递
String str1 = "hello";
String j = i;
System.out.println(System.identityHashCode(i) + " " + System.identityHashCode(j));
输出:
189568618 189568618
可以看到,赋值之后两个变量的引用地址相同。
j = "MLDN"; System.out.println(System.identityHashCode(i) + " " + System.identityHashCode(j));
可以看到,在修改了j的值之后,对应指向的地址也发生改变,因为此时虽然str2不再为"hello",但str1仍指向此地址空间,所以str2重新指向"MLDN"的地址空间。
引用传递(地址传递)
public static class testclass{
public int i = 0;
}
public static void main(String[] args){
testclass t1 = new testclass();
testclass t2 = t1;
System.out.println(System.identityHashCode(t1) + " " + System.identityHashCode(t2));
System.out.println(System.identityHashCode(t1.i) + " " + System.identityHashCode(t2.i));
}
输出:
793589513 793589513
159413332 159413332
如上,输出的地址可以看到,t1和t2指向相同的地址空间,他们其中的i也是。
t1.i = 1;
System.out.println(t2.i);
System.out.println(System.identityHashCode(t1) + " " + System.identityHashCode(t2));
System.out.println(System.identityHashCode(t1.i) + " " + System.identityHashCode(t2.i));
输出:
1
793589513 793589513
1028214719 1028214719
如上,对t1的i进行修改之后,t2的i也被修改。t1和t2还是指向同一地址。
在Java中,对象的传递是通过引用来进行的。当你将一个对象作为参数传递给一个方法时,实际上传递的是对象的地址(引用),而不是对象的实际副本。这意味着在方法内部对该对象的修改将影响原始对象。
而基本数据类型(如int, double, char等)的传递是按值传递的,这意味着当你把一个基本类型的值作为参数传递给一个方法时,实际上传递的是这个值的副本,在方法内部对这个值的改变不会影响原始变量。