Java中的方法传递机制
1. 代码如下
public class Test01 {
public static void main(String[] args) {
int a = 1;
String b = "hello";
Integer c = 200;
int [] d = {1,2,3,4,5};
E e = new E();
change(a,b,c,d,e);
System.out.println("a = " +a);
System.out.println("b = " +b);
System.out.println("c = " +c);
System.out.println("d = " + Arrays.toString(d));
System.out.println("e = " +e.a);
}
public static void change(int a1,String b2,Integer c3,int[] d4,E e5){
a1+=1;
b2 +="world";
c3 +=1;
d4[0] +=1;
e5.a +=1;
}
}
class E {
int a = 10;
}
2 没调用change方法前个参数情况
如图所示
- int a 是基本数据类型 又是局部变量 在main方法栈中 值为一
- String b 是引用数据类型 b 中存放的是地址值 指向 常量池中的值
- Integer c 是int的包装类 c 中存放的是地址值 因为200不在-128~127中 所以 在堆中开辟一块空间存放200 c 指向200
- int d 是数组 d中存放的是地址值,在堆中开辟一块空间,存放d对应的值
- e中有一个成员变量 所以 e.a 在堆中开辟一块空间存放 值为10 e.a指向这块空间
执行change时
首先实参向形参传值时,当是基本数据类型时,传递的时数据值,引用数据类型时,传递的是引用地址值
3 执行chanage的方法 各参数情况
-
a1 = a +1 = 2
-
b2 +="world" 因为String类型是常量 不可变 拼接后会产生一个新的对象 helloworkd b2就会指向helloworld
同时地址值发生改变0x1001
-
Integer c 由于Integer是包装类型所以 当c传入的时候 c3 = 201 同时c3的地址值发生改变 0x2001
-
int [] d 传入的时候 数组传递是引用地址值,当d4[0] +=1 的时候 0x3000对应的下标为零的值发生改变 由1变2
-
E 转入的也是地址值 此时 e5指向0x4000 e5.a+=1 红 int a = 11
情况变成如下图所示
代码执行结果
结论
-
实参是基本数据类型
- 传递的是数据值
-
实参是引用数据类型
- 传递地址值
- 特殊的类型: String 包装类等对象不可变性
评论区