1.值传递和引用传递
值传递:实参将自身的值拷贝一份传递给方法作为参数,在方法中对形参的修改不会影响到实参的数值。
引用传递:方法接受的实际是实参的地址值,在方法中的操作会直接根据地址找到实参并修改实参的值。
2.Java中的参数传递
很多程序设计语言(C++等)使用了上面提到了两种参数的传递方式,但是在Java中,只有值传递。
a) 基本类型,基本类型的包装类,String类的参数传递:
public static void main(String[] args) {
int a=10;
Integer b=10;
String s="aaaa";
doTest01(a,b,s);
System.out.println(a);
System.out.println(b);
System.out.println(s);
}
//基本类型,基本类型的包装类,String类的参数传递实际为值的拷贝
public static void doTest01(int a, Integer b, String s){
a=a+10;
b=b+10;
s=s+"123";
}
测试结果:
结论:一个方法不能修改一个基本类型的参数。基本类型,基本类型的包装类,String类的参数传递实际为值的拷贝,修改的是实际值的副本,除非在外面赋值。
b) 改变对象参数的状态
public static void main(String[] args) {
Test01 test01 = new Test01();
test01.setAge(10);
System.out.println("修改之前的age是: "+test01.getAge());
doTest02(test01);
System.out.println("修改之后的age是: "+test01.getAge());
}
//修改对象参数的值
public static void doTest02(Test01 test01) {
test01.setAge(20);
}
测试结果:
结论:对象参数实际传递的是实参对象地址的拷贝,实参和形参此时保存的地址值相等,指向同一个地址,对形参的改变会直接影响实参的值。
c) 对象引用是否为引用传递
b的测试结果看上去更像是引用传递,即形参是引用的实参而不是实参的地址值副本。实际上,这种理解是不对的。
public static void main(String[] args) {
Test01 t1=new Test01();
Test01 t2=new Test01();
t1.setAge(10);
t2.setAge(20);
System.out.println("交换之前t1的age是: "+t1.getAge());
System.out.println("交换之前t2的age是: "+t2.getAge());
exchange(t1,t2);
System.out.println("交换之后t1的age是: "+t1.getAge());
System.out.println("交换之后t2的age是: "+t2.getAge());
}
//对象的互换
public static void exchange(Test01 t1, Test01 t2) {
Test01 test01 = t1;
t1 = t2;
t2 = test01;
}
测试结果:
如果Java对对象采用的是引用传递,那么这个方法就应该能够实现交换数据的效果。但是,方法并没有改变存储在变量t1和t2中的对象引用,这个方法交换的是这两个对象引用的拷贝。
黑色是实参地址值,绿色是形参地址值,红色是形参交换后的地址值