Java值传递机制
形参与实参
形参:方法被调用时需要传递出来的参数
实参:方法被调用时传入的实际值
Java里方法的参数传递机制只有一种:值传递
-
形参是基本数据类型,则将基本数据类型存储的“数据值”传给形参
-
形参时引用数据类型,则将引用数据类型变量的“地址值”赋给形参
基本数据类型
- 流程:
-
main方法进栈,m和n的初始化值分别为10和20,
-
swap方法进栈,将m和n的值传入swap方法的形参中,并将swap方法里的m和n的值交换,输出
swap方法里,m的值为10,n的值为10
-
swap方法结束,弹栈,只剩下main方法里面的成员变量,输出
交换结束后,变量m的值为20,n的值为10
引用数据类型
- 流程
-
首先main方法进栈,在执行
Data d = new Data()
时,JVM会创建一个Data()实例对象并在堆空间中开辟一块内存存储这个实例,同时把地址值(假设地址值为0x0011)赋值给d变量,由于Data类没有对m和n进行初始化,所以int类型默认值为0 -
d.m=20
和d.n=20
修改了原来的值使m=10,n=20 -
swap方法进栈,形参data的值是main方法中
swap(d)
这条语句赋值过来,是地址值,所以也是0x0011,所以也指向那个实例 -
swap方法又定义了一个局部变量tmp,只要是局部变量就放在栈空间,所以把tmp放在栈空间,并将m的值赋给它,tmp=10.然后把m和n的值交换,输出
swap方法里,m的值为20,n的值为10
-
swap方法结束,结束之后就弹栈
-
执行main方法里的输出语句,main方法还是指向那个实例,输出
交换结束后,变量m的值为20,n的值为10
static关键字
看完后你可能会发现基本数据类型的代码main方法中有TransferTest1 t = new TransferTest1()
,并且调用swap方法时是t.swap(m,n)
;
而引用数据类型的代码块main方法中直接使用swap(d)
,这是因为定义swap方法时使用了static
关键字
static关键字的基本作用一句话来描述就是:
方便在没有创建对象的情况下来进行调用(方法/变量)。
很显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。
所以第一块代码也可以写成
public class TransferTest1 {
public static void main(String[] args) {
int m = 10;
int n = 20;
swap(m, n);
System.out.println("交换结束后,变量m的值为" + m + "n的值为" + n);
}
public static void swap(int m, int n) {
int tmp = m;
m = n;
n = tmp;
System.out.println("swap方法里,m的值为" + m + "n的值为" + n);
}
}