欢迎访问宙启技术站
智能推送

Java函数的参数传递方法解析

发布时间:2023-05-20 00:29:26

在Java中,参数传递有两种方式:值传递和引用传递。这两种传递方式对于初学者来说可能比较难以理解,本文将对这两种传递方式做出详细解析。

一、值传递

值传递是指将实参的值复制一份到形参中,相当于实参和形参之间无共享数据。在Java中,所有的简单类型(包括整型、浮点型、字符型等)都是按值传递的方式进行传递的。下面通过一个简单的例子进行说明。

public class Test {

    public static void main(String[] args) {

        int x = 10;

        System.out.println("before method call, x = " + x);

        change(x);

        System.out.println("after method call, x = " + x);

    }

    public static void change(int x) {

        x = 20;

        System.out.println("in method change, x = " + x);

    }

}

运行结果为:

before method call, x = 10

in method change, x = 20

after method call, x = 10

在这个例子中,我们定义了一个整型变量x并将它初始化为10,然后调用change方法,并将x作为参数传递给该方法。在change方法中,我们将x的值改为20。当调用完change方法后,再次输出x的值,我们发现x的值并未被改变。这是因为方法内部的x只是一个形参,在方法调用完成后就会被释放掉,而不会影响到原来的实参。

二、引用传递

引用传递是指将实参的引用传递给形参,即传递的是实参所指向的内存地址,形参和实参指向相同的内存地址。在Java中,所有的对象(包括数组、字符串、自定义对象等)都是按引用传递的方式进行传递的。下面通过一个简单的例子进行说明。

public class Test {

    public static void main(String[] args) {

        int[] nums = {1, 2, 3};

        System.out.println("before method call, nums = " + Arrays.toString(nums));

        change(nums);

        System.out.println("after method call, nums = " + Arrays.toString(nums));

    }

    public static void change(int[] nums) {

        nums[0] = 4;

        nums[1] = 5;

        nums[2] = 6;

        System.out.println("in method change, nums = " + Arrays.toString(nums));

    }

}

运行结果为:

before method call, nums = [1, 2, 3]

in method change, nums = [4, 5, 6]

after method call, nums = [4, 5, 6]

在这个例子中,我们定义了一个整型数组nums并将它初始化为{1, 2, 3},然后调用change方法,并将nums作为参数传递给该方法。在change方法中,我们将nums的值改为{4, 5, 6}。当调用完change方法后,再次输出nums的值,我们发现nums的值已经被改变了。这是因为方法内部的nums和主程序外的nums指向的是同一个数组对象,因此在方法内部修改的值也可以在主程序里看到。

需要注意的是,在引用传递中,如果形参被重新赋值为一个新的对象,那么该操作不会改变实参指向的对象。举个例子:

public class Test {

    public static void main(String[] args) {

        String str = "hello";

        System.out.println("before method call, str = " + str);

        change(str);

        System.out.println("after method call, str = " + str);

    }

    public static void change(String str) {

        str = "world";

        System.out.println("in method change, str = " + str);

    }

}

运行结果为:

before method call, str = hello

in method change, str = world

after method call, str = hello

在这个例子中,我们定义了一个字符串str并将它初始化为"hello",然后调用change方法,并将str作为参数传递给该方法。在change方法中,我们将str重新赋值为"world"。当调用完change方法后,再次输出str的值,我们发现str的值并未被改变。这是因为在方法内部重新赋值的字符串"world"是一个新的字符串对象,它并不会改变实参所指向的原字符串对象。