方法参数传递机制
-
实参:是调用方法时传进去的参数列表;
-
形参:是方法声明是需要传递的参数列表;
1、形参是基本数据类型
- 传递数据值
2、形参是引用数据类型
- 传递的是地址值
- 特殊类型:String、封装类等对象不可变性
3、代码案例
public class ParamTransmit {
public static void main(String[] args) {
int i = 1;
String str = "hello";
Integer num = 200;
int[] arr = {1, 2, 3, 4, 5};
MyClass myClass = new MyClass();
chang(i,str,num,arr,myClass);
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("myClass.a= " + myClass.a);
}
public static void chang(int j, String s, Integer n, int[] a, MyClass m) {
j += 1;
s += "word";
n += 1;
a[0] += 1;
m.a += 1;
}
}
class MyClass {
int a = 10;
}
3.1、分析
1、类中执行main方法会在java栈中分配一块栈帧并初始化局部变量:
int i = 1;
String str = "hello";
Integer num = 200;
int[] arr = {1, 2, 3, 4, 5};
MyClass myClass = new MyClass();
- 基本数据类型直接存数值;
- 字符串类型指向存储常量池中的地址;
- 对象、数据指向存在堆中地址。
2、同样,类中change方法会在java栈中分配一块栈帧并初始化形参:
public static void chang(int j, String s, Integer n, int[] a, MyClass m) {
}
- 基本数据类型传递数据值;
- 引用类型传递的是地址值。
3、执行change方法中的代码
j += 1;
s += "word";
n += 1;
a[0] += 1;
m.a += 1;
- 基本类型 j 传递的是数值,不会改变原来的值;
- 字符串s 相加,需先在常量池查找或创建“word”对象,然后在生成一个相加拼接后的对象“helloword”,并改变s的指向地址;
- 对象n 相加会生成一个新的对象201,并将指向该地址;
- 数据a 元素的相加,会先找到对应下标的数组地址进行修改数值;
- 对象本不会被改变,但对象的属性m.a可以改变,会找到对应的地址进行修改数值。
3.2、结果
i= 1
str= hello
num= 200
arr= [2, 2, 3, 4, 5]
myClass.a= 11