方法的参数传递机制 String、包装类等对象的不可变性
一、代码演示
话不多说,先上代码,猜一猜哪些值变了
public class Exam4 {
public static void main(String[] args) {
int i = 1;
String str = "hello";
Integer num = 200;
int[] arr = {1, 2, 3, 4, 5};
MyData my = new MyData();
change(i, str, num, arr, my);
System.out.println("i= " + i);
System.out.println("str= " + str);
System.out.println("num= " + num);
System.out.println("arr= " + Arrays.toString(arr));
System.out.println("my.a= " + my.a);
}
public static void change(int j, String s, Integer n, int[] a, MyData m) {
j += 1;
s += "world";
n += 1;
a[0] += 1;
m.a += 1;
}
}
class MyData {
int a = 10;
}
结果
i= 1
str= hello
num= 200
arr= [2, 2, 3, 4, 5]
my.a= 11
二、分析
public static void change(int j, String s, Integer n, int[] a, MyData m) {
j += 1;
s += "world";
n += 1;
a[0] += 1;
m.a += 1;
}
// 分析
j = 2 (这里的j已经是新的地址的,不是原来的i)
s = helloword(但是由于String类型是不可变的,所以会产生一个新的对象,指向新的引用),已经不在是原来的str了
n = 201(Integer类型的值不可变,所以会产生一个新的对象,指向新的引用),已经不在是原来的num了
a[0]= 2 (这里的数组还是之前的数组,改了原来的值)
m.a = 11(这里的MyData还是之前的地址,改了原来的值)
三、结论
所以结论是 a[0]和m.a改变了,其他的都没变
- 形参是基本数据类型
- 传递数据值
- 实参是引用数据类型
- 传递地址
- 特殊类型:String、包装类等对象不可变