方法的参数传递机制

方法的参数传递机制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Demo1 {
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

考点:

  • 方法的参数传递机制

  • String、Integer 等包装类的不可变性

方法传递机制:

  • 基本数据类型是值传递

  • 引用类型是地址值传递

  • 特殊类型如 String、包装类等对象不可变

分析:

方法中的变量称为局部变量,每个方法在栈中有属于自己的方法区,局部变量存在自己的方法区。change() 方法执行之前,内存结构简单如下:

change()执行之前的简单内存结构

执行 change() 方法,参数传递代码执行之前:

传参

change() 方法执行完毕:

赋值之后

change() 执行之后,change 方法区被释放,观察 main 方法区的箭头指向:

  • i 只是将值复制了一份给 j,本身的值没变

  • str 代表的 “hello” 这一份常量,由于 String 不可变性,change 对这个常量拼接形成了新的常量,但是 str 指向的还是原来的 “hello”

  • num 是 Integer 不可变类型,在堆中也创建了另外一份变量,本身没变

  • arr 是基本数据类型,值被改变

  • m 是引用类型,change 中保存了这个引用,并将实例变量 a 改变了

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×