Java学习笔记之Java方法值传递

来源:互联网 发布:淘宝网店怎么注册平台 编辑:程序博客网 时间:2024/06/06 12:49

在Java中,方法的参数传递方式是值传递。

我们首先测试基本类型的值传递,基本类型参数的传递方式是复制该基本类型参数,把该基本类型数值的复制品传给方法做参数,该基本类型数值和它的复制品之间没有关联关系,互不影响。

看以下的例子:

public class PrimtiveTransferTest {
    public static void wrap(int a,int b){
        System.out.println("在wrap方法中交换之前a的值是" + a + ";b的值是" + b);
        int temp;
        temp = a;
        a = b;
        b = temp;
        System.out.println("在wrap方法中交换之后a的值是" + a + ";b的值是" + b);
    }
    
    public static void main(String[] args) {
        int a = 6;
        int b = 9;
        System.out.println("main方法中未调用wrap方法前,main方法中a的值是" + a + ";b的值是" + b);
        wrap(a, b);
        System.out.println("main方法中调用wrap方法交换过a、b之后,main方法中a的值是" + a + ";b的值是" + b);
    }
}


输出结果是:

main方法中未调用wrap方法前,main方法中a的值是6;b的值是9
在wrap方法中交换之前a的值是6;b的值是9
在wrap方法中交换之后a的值是9;b的值是6
main方法中调用wrap方法交换过a、b之后,main方法中a的值是6;b的值是9


由此我们可以看出,在Java方法中如果参数是基本类型值,参数传递并没有影响原本的基本类型的值。


另外,如果是引用类型变量,那么传递的就是引用变量的复制品,实则两个引用变量指向的是同一个对象,如果通过其中任何一个引用变量改变了它所指向的实例对象,那么另外一个也会受到影响。

再看接下来这个例子:

public class ReferenceTransferTest{
    public static void swap(DataWrap dw){
        System.out.println("wrap方法中a成员变量的值是" + dw.a + ";b成员变量的值是" + dw.b);
        int temp = dw.a;
        dw.a = dw.b;
        dw.b = temp;
        System.out.println("wrap方法中交换以后a成员变量的值是" + dw.a + ";b成员变量的值是" + dw.b);
    }
    
    public static void main(String[] args) {
        DataWrap dw = new DataWrap();
        dw.a = 6;
        dw.b = 9;
        swap(dw);
        System.out.println("main方法中交换结束后a成员变量的值是" + dw.a + ";b成员变量的值是" + dw.b);
    }
}

输出结果是:

main方法中通过wrap方法交换结束前,main方法中a成员变量的值是6;b成员变量的值是9
wrap方法中a成员变量的值是6;b成员变量的值是9
wrap方法中交换以后a成员变量的值是9;b成员变量的值是6
main方法中通过wrap方法交换结束后,main方法中a成员变量的值是9;b成员变量的值是6


本例中的参数传递方式就是值传递方法,系统复制了dw的副本,传入wrap方法,但是dw只是一个引用变量,所以系统复制了引用变量,而并未复制DataWrap对象,因此dw和它的复制品指向同一个DataWrap对象,因此该对象中成员变量的改变,会对两个引用变量都有影响。

摘抄编辑自《疯狂Java讲义》

0 0