对Java中传值调用的理解分析

下面我会详细讲解“对Java中传值调用的理解分析”的完整攻略。

下面我会详细讲解“对Java中传值调用的理解分析”的完整攻略。

什么是传值调用

Java中,方法调用时参数的传递都是按值传递的,也就是说在调用方法时,实参把它的值传递给对应的形参,此时形参接收到的是实参值的一个拷贝,也就是说,无论实参是基本数据类型还是引用类型,形参变量都是对其值拷贝的一份副本进行操作,而无法修改实参变量的值。因此,Java中的传值调用又叫做值传递。

下面以两个示例说明Java中的传值调用。

示例一

public class Test {
    public int num = 0;

    public static void main(String[] args) {
        Test t = new Test();
        System.out.println("调用前:" + t.num);
        addNum(t.num);
        System.out.println("调用后:" + t.num);
    }

    public static void addNum(int num) {
        num += 1;
        System.out.println("方法内部:" + num);
    }
}

运行该代码可以得到如下输出:

调用前:0
方法内部:1
调用后:0

可以看到,在调用addNum(int num)方法时,实参t.num的值为0,传递给方法中的形参num,方法内部对形参num进行加1操作后,其值变为1。但是在main方法中,打印输出实参t.num时,其值并没有发生改变,仍然是0。这说明在方法调用中,虽然形参接收了实参的值的一个副本进行操作,但是实参变量本身的值并没有改变。

示例二

public class Test {
    public Integer num = 0;

    public static void main(String[] args) {
        Test t = new Test();
        System.out.println("调用前:" + t.num);
        addNum(t);
        System.out.println("调用后:" + t.num);
    }

    public static void addNum(Test t) {
        t.num += 1;
        System.out.println("方法内部:" + t.num);
    }
}

运行该代码可以得到如下输出:

调用前:0
方法内部:1
调用后:1

可以看到,相对于示例一,我们将实参t.num改为了引用类型Test的实例变量num,形参num也变成了引用类型Test的实例变量num的一个副本。在方法调用时,虽然形参num和实参t.num指向的是同一个对象,但是它们之间仍然是按值传递的,也就是形参变量num和实参变量t.num拥有各自的存储空间,只是存储的是同一个对象的地址。所以在方法内部,对形参num进行+1操作时,实参t.num指向的对象的值也会发生改变。

总结

以上两个示例说明了Java中的传值调用,当实参是基本数据类型时,形参接收的是实参值的一个拷贝,方法内部无法修改实参的值;而当实参是引用类型是,形参和实参虽然指向同一个对象,但是它们之间仍然是按值传递的。在方法内部,对形参的操作会同时修改实参指向的对象的值,这一点需要注意。

本文标题为:对Java中传值调用的理解分析

基础教程推荐