方法的参数传递机制 String、包装类等对象的不可变性

一、代码演示

话不多说,先上代码,猜一猜哪些值变了

  1. public class Exam4 {
  2. public static void main(String[] args) {
  3. int i = 1;
  4. String str = "hello";
  5. Integer num = 200;
  6. int[] arr = {1, 2, 3, 4, 5};
  7. MyData my = new MyData();
  8. change(i, str, num, arr, my);
  9. System.out.println("i= " + i);
  10. System.out.println("str= " + str);
  11. System.out.println("num= " + num);
  12. System.out.println("arr= " + Arrays.toString(arr));
  13. System.out.println("my.a= " + my.a);
  14. }
  15. public static void change(int j, String s, Integer n, int[] a, MyData m) {
  16. j += 1;
  17. s += "world";
  18. n += 1;
  19. a[0] += 1;
  20. m.a += 1;
  21. }
  22. }
  23. class MyData {
  24. int a = 10;
  25. }

结果

  1. i= 1
  2. str= hello
  3. num= 200
  4. arr= [2, 2, 3, 4, 5]
  5. my.a= 11

二、分析

image.png

  1. public static void change(int j, String s, Integer n, int[] a, MyData m) {
  2. j += 1;
  3. s += "world";
  4. n += 1;
  5. a[0] += 1;
  6. m.a += 1;
  7. }
  8. // 分析
  9. j = 2 (这里的j已经是新的地址的,不是原来的i
  10. s = helloword(但是由于String类型是不可变的,所以会产生一个新的对象,指向新的引用),已经不在是原来的str
  11. n = 201Integer类型的值不可变,所以会产生一个新的对象,指向新的引用),已经不在是原来的num
  12. a[0]= 2 (这里的数组还是之前的数组,改了原来的值)
  13. m.a = 11(这里的MyData还是之前的地址,改了原来的值)

image.png

三、结论

所以结论是 a[0]和m.a改变了,其他的都没变

  • 形参是基本数据类型
    • 传递数据值
  • 实参是引用数据类型
    • 传递地址
    • 特殊类型:String、包装类等对象不可变