方法的参数传递机制
# 面试题
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); // 1
System.out.println("str = " + str); // hello
System.out.println("num = " + num); // 200
System.out.println("arr = " + Arrays.toString(arr)); // 2,2,3,4,5
System.out.println("my.a = " + my.a); // 11
}
//形参: 基本类型 j,只传值; 包装类型、String传地址,但是原对象不可变; 数组、对象传地址
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;
}
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
30
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
30
数据存放java虚拟机的不同位置, main()方法和 change()方法存在栈、 字符串值存在常量池、对象的值放在堆中。

# 方法的参数传递机制
①形参是基本数据类型
传递数据值
②实参是引用数据类型
传递地址值
特殊的类型:String、包装类等对象不可变性


如代码Exam5. 运行main函数,在栈里面会放 main()方法,运行完再移出,运行时会加载类的初始化 <clinit>
,加载类变量、执行静态代码块
。 将 Exam5.class类放在方法区,里面存放类变量(static修饰), new Exam5()这个obj1实例时,会调实例的初始化方法<init>
,加载成员变量、执行非静态代码块
;将初始化的值保存在堆当中。 obj1.test() 方法也放在栈里面,运行完就移出。