方法的参数传递机制 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= 1str= hellonum= 200arr= [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、包装类等对象不可变
