示例1:基本数据类型参数传递
//基本数据类型参数传递
class Demo
{
public static void main(String[] args){
int x = 3;
show(x);
System.out.println("x=" + x);
}
public static void show(int x){
x = 4;
}
}
打印的是3, 执行过程说明:
1、jvm调用main方法,main方法入栈。
2、将x变量值设置为3。
3、main方法调用show方法,3作为基本数据类型参数赋值给show方法参数x,也就是说,此时show方法的参数x值为3。
4、show方法执行x=4后,show方法的参数x值变为4。
5、show方法执行结束,show方法出栈。show方法参数x也随之出栈。
6、main方法打印x的值。此时x指的是main方法中的x变量的值(show方法中的参数x已经随show方法一块出栈了)。所以,打印出来的x值为3而不是4。
7、main方法执行结束,出栈。
示例2:引用数据类型参数传递
//引用数据类型参数传递
class Demo
{
int x = 3;
public static void main(String[] args){
Demo d = new Demo();
d.x = 9;
show(d);
System.out.println(d.x);
}
public static void show(Demo d){
d.x = 4;
}
}
4
执行过程说明:
1、jvm调用main方法,main方法入栈。
2、创建Demo对象d(在堆内存中创建,d作为引用变量,指向堆内存中创建的实体对象),并将d指向的实体对象中的属性x的值设置为9。
3、main方法调用show方法,d作为引用数据类型参数赋值给show方法参数d,也就是说,此时show方法的参数d和main方法中的变量d同时指向了堆内存中同一个实体对象。
4、show方法执行d.x=4后,堆内存中的实体对象的x属性值变为4。
5、show方法执行结束,show方法出栈,show方法参数d也随之出栈。虽然show方法参数d出栈了,但是,由于main方法的变量d依然引用着堆内存中的实体对象,因此堆内存中的实体对象不会被垃圾回收器清除。
6、main方法打印d.x的值。此时,d指的是main方法中的引用变量x,d.x指的依然是堆内存中的实体对象中x的值。所以,打印出来的值为4而不是9。
7、main方法执行结束,出栈。
总结:
在java中,方法参数的传递永远都是传值,而这个值,对于基本数据类型,值就是你赋给变量的那个值。而对于引用数据类型,这个值是对象的引用,而不是这个对象本身。
|
|