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

Java中函数参数的传递方式及其区别(值传递和引用传递)?

发布时间:2023-07-04 19:26:47

在Java中,函数参数的传递方式有值传递和引用传递。值传递是指将实参的值复制一份给形参,而引用传递是指将实参的引用地址传递给形参。两种传递方式在实际应用中有着明显的区别,下面将详细介绍这两种传递方式及其区别。

1. 值传递

值传递是指在函数调用时,将实际参数的值复制一份给形式参数,在函数内部对形式参数的任何改动都不会改变实际参数的值。在Java中,基本数据类型的传递就是采用值传递的方式。

示例:

public class ValuePassingExample {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 20;
        System.out.println("交换前:num1 = " + num1 + ", num2 = " + num2);
        swap(num1, num2);
        System.out.println("交换后:num1 = " + num1 + ", num2 = " + num2);
    }
    
    public static void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
    }
}

输出结果:

交换前:num1 = 10, num2 = 20
交换后:num1 = 10, num2 = 20

可以看到,虽然在swap函数中对a和b进行了交换,但是不会影响到main函数中的实参num1和num2的值。这是因为在值传递中,函数对形参的修改只是修改了形参的副本,不会改变实参的值。

2. 引用传递

引用传递是指在函数调用时,将实际参数的引用地址传递给形式参数,实际参数和形式参数指向同一个对象,在函数内部对形式参数的任何改动都会改变实际参数的值。在Java中,对象类型的传递就是采用引用传递的方式。

示例:

public class ReferencePassingExample {
    public static void main(String[] args) {
        Person person = new Person("Tom");
        System.out.println("修改前:person = " + person.getName());
        changeName(person);
        System.out.println("修改后:person = " + person.getName());
    }
    
    public static void changeName(Person p) {
        p.setName("Jerry");
    }
}

class Person {
    private String name;
    
    public Person(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
}

输出结果:

修改前:person = Tom
修改后:person = Jerry

可以看到,虽然在changeName函数中修改了形参p的名字,但是同时也改变了main函数中的实参person的名字。这是因为在引用传递中,实参和形参指向同一个对象,因此对形参的任何改动都会影响到实参。

总结:

- 值传递是将实参的值复制一份给形参,修改形参不会改变实参的值。适用于基本数据类型。

- 引用传递是将实参的引用地址传递给形参,实参和形参指向同一个对象,修改形参会改变实参的值。适用于对象类型。

在使用函数参数时,需要根据需要选择适合的传递方式,理解这两种传递方式的区别对于编写正确的程序非常重要。