方法的参数传递
方法,必须有其所在类或对象调用才有意义。若方法含有参数:
形参:方法声明时的参数
实参:方法调用时实际传给形参的参数值
Java里方法的参数传递方式只有一种:值传递:即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响
一、JVM的内存模型
1)引用对象
Person p = new Person();
new 一个 Person类对象 p 在 JVM内存中的表现:
1、new Person() 对象在堆[heap]中,假设其地址 BE95000;【真正的对象】
2、栈中存的是 p【new Person() 对象】在堆[heap]中的地址,即BE95000;该地址在栈中的地址假设为AG84300【对象地址】
2)基础数据类型
int i = 1;
在栈中,i 的地址假设为 AG84100;值为 1;
总结:基础数据类型,值是保存在栈中;引用对象,值保存在堆中,栈中存的对象是堆中的地址
二、方法的参数传递之基础数据类型
public class Test {
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);
}
}
输出:
1、先执行 int a = 0 ;在栈中开辟了一块内存,地址假设为AD8500,存的值是0;
2、调用 swap() 方法,执行 int i 部分,在栈中开辟了一块内存,地址假设为AD8600,值就是从 a 哪里复制过来的值,就是0;执行swap的方法体里面的代码 -- i = 6,把 i 在栈中的值改为6,最终 i 在栈中的值就是6 ;栈内存如上图所示
总结:基本数据类型在参数的传递过程中就是把实参的值复制到形参上
三、方法的参数传递之引用对象
DataSwap.java
public class DataSwap{
public int a;
}
Test.java
public class Test {
public static void swap(DataSwap ds1){
ds1.a = 6;
System.out.println("在swap方法中,ds1.a的值是:" + ds1.a);
}
public static void main(String[] args) {
DataSwap ds = new DataSwap();
System.out.println("调用swap方法之前,ds.a的值是:" + ds.a);
swap(ds);
System.out.println("调用swap方法之后,ds.a的值是:" + ds.a);
}
}
输出:ds、ds1 操作的其实是同一个对象
调用过程:
1)DataSwap ds = new DataSwap();-- 将 new DataSwap() 存到了堆内存中,地址BE2500;
2)ds引用对象存到栈中,地址是AD9500,值是 new DataSwap() 对象在堆中的地址BE2500;
3)调用swap方法,将 ds1 引用对象保存到栈中,地址是AD9600,存的值是实参【ds的栈中的值,这个值实际上就是之前 new DataSwap()对象在堆内存中的地址 BE2500】实际上 ds 、ds1 其实都是指向同一个对象,这个对象就是在堆内存中地址是BE2500上保存的对象
【ds、ds1是引用对象,存的是对象实际在堆中的地址;堆中是对象实际存储的地方】
总结:方法的参数传递
1)如果方法的形参是基本数据类型,那么实参向形参传递参数是就是传递值,把实参的值复制给形参;
2)如果方法的形参是对象,那么实参向形参传递参数时也是将值给形参,这个值是实参在栈内存中的值,即引用对象在堆内存中的地址;
基本数据类型都是保存在栈内存中,引用对象在栈内存中保存的是引用对象的地址,方法的参数传递是传递值(变量在栈内存的值)