方法调用参数有两种方式:按值传递、引用传递
下面介绍一下这个两个方式的具体含义:
1、按值调用:指的是在方法调用时,传递的参数是按值的拷贝传递,传递的是值的拷贝,也就是说传递后就互不相关了
2、按引用传递:指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。
在java中参数传递都是按值传递
按照上面介绍所说,按值传递是传递值的拷贝;
来看一下以下代码
public class test {
public static void main(String[] args) {
user u = new user();
test(u);
System.out.print("1"+u);//1
user u1 = new user();
System.out.println("2"+u1);//2
test1(u1);
System.out.println("3"+u1);//3
}
private static void test1(user u1) {
u1 = null;
System.out.println("方法中"+u1);
}
private static void test(user u) {
// TODO Auto-generated method stub
u.setId(10);
}
}
输出结果:
1user [id=10, name=null, sex=null]
2user [id=0, name=null, sex=null]
方法中null
3user [id=0, name=null, sex=null]
可见当第一次调用 “test()” 方法时,将对象的id 属性修改为10,
从第二次输出可以看出:当对象刚创建时,他的各个属性都会有默认值,int为0,引用类型为null
从第三个输出调用"test1()" 方法中可以看出,当在方法中指定对象为null, 在方法中其值确实为null,但是并未有改变传入的参数的真正的指向
这就引出下面java中方法参数的使用情况
1.一个方法不能修改一个基本类型的参数(即数值型和布尔型)
2.一个方法可以改变一个对象参数的状态
3.一个方法不能让对象参数引用一个新的对象
至于java为什么是这样的,看下图:
首先注意,变量放在栈中,方法在方法区中,new出来的对象存放在堆中,但是对象所存的属性值在栈中
一 . 当第一次调用test方法时
二 . 当调用test1()方法时