Java中方法的参数传递只有一种方式:值传递
将实际参数值的副本(复制品)传入方法中,而参数本身不受影响。所谓形参就是方法声明定义的时候的参数,实参就是方法调用时实际传递给形参的参数。介绍之前先简单了解下Java内存模型
那对于常见的一个学习的类就是Person,关于以下初始化如何实现的呢?
//对象声明
Person p = new Person();
//变量定义
int i = 1;
栈中存放的对象的地址,真正的对象存在堆中,这就是引用对象
1.基本数据类型方法参数传递
接着看一下方法的参数传递
public class TestTransfer {
public static void swap(int i) {
i = 6;
System.out.println("swap方法里面的i的值: "+i);
}
public static void main(String[] args) {
int a = 0;
swap(a);
System.out.println("main方法里面的a的值: "+a);
}
}
//输出结果
swap方法里面的i的值: 6
main方法里面的a的值: 0
这个很容易理解,因为在栈内存先创建一个变量a并分配地址,调用swap(int i) ,再次在栈中开辟一个新的内存,其存放的值就是a传过来的值,就是0,执行i = 6的时候,将i在栈中的值就修改为6
因此:基本数据类型参数传递就是把实参的值复制到形参上
2.引用对象类型方法参数传递
class DataSwap{
public int a;
}
public class TestTransfer {
public static void swap(DataSwap ds1) {
ds1.a = 6;
System.out.println("swap方法里面的i的值: "+ds1.a);
}
public static void main(String[] args) {
DataSwap ds = new DataSwap();
System.out.println("执行swap方法前的a的值: "+ds.a);
swap(ds);
System.out.println("执行swap方法后的a的值: "+ds.a);
}
}
//输出结果
执行swap方法前的a的值: 0
swap方法里面的i的值: 6
执行swap方法后的a的值: 6
当调用DataSwap的时候,因此其属性a没有进行初始化,因此默认值为0。当调用swap(Object obj)之后
其过程如下:
- DataSwap ds = new DataSwap(),把new DataSwap()存放到了堆内存中,分配的内存地址地址是BEP2500
- ds引用对象存放在栈中,其内存地址AG5300,值是new DataSwap()对象在堆内存中的地址BE2500
- 调用swap方法后,给ds1引用对象保存到栈中,地址是AG6300,存放的值是来源于于实参(ds),也就是ds在栈中存放的值,这个就是new DataSwap()对象在堆内存中的地址,因此无论是ds还是ds1都是执行了同一个对象,这个对象就是在堆内存中地址是BE2500上保存的对象
所以关于方法中参数传递,有如下结论:
- 如果形参是基本数据类型,那么实参(实际数据)向形参传递的时候,就是直接传递值,把实际值复制给形参
- 如果形参是对象,那么实参(实际对象),向形参传递参数时,也是把值传递给形参,这个值是实参在栈的值,也就是引用对象在堆内存中的地址,
从上面的实践中可知, 基本数据类型都是保存栈中,引用对象在栈内存中保存的是引用对象的地址,那么方法参数传递是传递值(变量在栈内存中的值)。