-
如果赋值操作针对的是基本数据类型的变量,则将基本数据类型变量传递的是:保存的数据值
-
如果赋值操作针对的是引用数据类型的变量,则将引用数据类型变量传递的是:保存的地址值
-
调用方法时,方法的形参(只是形参而已!不要与普通的赋值操作混淆)会在栈中新建一个变量。如果要换引用类型里面的元素值,需要传引用类型的地址参数(引用类型变量里放的就是引用类型的地址值)给形参才能使形参新建的变量值指向同一个堆地址,进去同一个堆里面换。不能只传引用类型数据里面的基本类型数据元素给形参,那样的话只是在栈里面复制了一份元素值然后搞事而已,如果是String类型,虽然传的是地址值,但是由于String的不可变性,也不会改变其原有值,包装类也是
- 形参:方法在声明时,在一对()内声明的参数,称为形参
实参:方法在调用时,实际传递的参数值,即为实参 - 即当形参是基本数据类型变量是,传递的是:保存的数据值。
当形参是引用数据类型变量是,传递的是:保存的地址值。
基本数据类型的情况
public class ValueTransferTest1 {
public static void main(String[] args) {
int m = 10;
int n = 20;
System.out.println("m = " + m + ", n = " + n);
ValueTransferTest1 test = new ValueTransferTest1();
test.swap(m, n);
System.out.println("m = " + m + ", n = " + n);
}
public void swap(int m,int n){
int temp = m;
m = n;
n = temp;
}
}
内存结构图:
引用数据类型的情况
public class ValueTransferTest2 {
public static void main(String[] args) {
Data d1 = new Data();
d1.m = 10;
d1.n = 20;
System.out.println("m = " + d1.m + ", n = " + d1.n);
//实现 换序
ValueTransferTest2 test = new ValueTransferTest2();
test.swap(d1);
System.out.println("m = " + d1.m + ", n = " + d1.n);
}
public void swap(Data data){
int temp = data.m;
data.m = data.n;
data.n = temp;
}
}
class Data{
int m;
int n;
}
内存结构图:
又如:
public class TransferTest3 {
public static void main(String args[]) {
TransferTest3 test = new TransferTest3();
test.first();
}
public void first() {
int i = 5;
Value v = new Value();
v.i = 25;
second(v, i);
System.out.println(v.i);
}
public void second(Value v, int i) {
i = 0;
v.i = 20;
Value val = new Value();
v = val;
System.out.println(v.i + " " + i);
}
}
class Value {
int i = 15;
}
内存结构图: