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";
}

测试结果:

java -jar 传参 java怎么传参_引用传递

结论:一个方法不能修改一个基本类型的参数。基本类型,基本类型的包装类,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);
}

测试结果:

java -jar 传参 java怎么传参_System_02

结论:对象参数实际传递的是实参对象地址的拷贝,实参和形参此时保存的地址值相等,指向同一个地址,对形参的改变会直接影响实参的值。

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 -jar 传参 java怎么传参_System_03

如果Java对对象采用的是引用传递,那么这个方法就应该能够实现交换数据的效果。但是,方法并没有改变存储在变量t1和t2中的对象引用,这个方法交换的是这两个对象引用的拷贝。

java -jar 传参 java怎么传参_java -jar 传参_04

                 黑色是实参地址值,绿色是形参地址值,红色是形参交换后的地址值