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

Java函数传递参数:值传递和引用传递的区别?

发布时间:2023-06-23 21:46:25

Java函数传递参数:值传递和引用传递的区别?

Java语言是一种强类型语言,其函数参数传递方式主要有值传递和引用传递两种。在Java中,所有的函数参数传递都是值传递。然而,不同的是,Java中的对象引用也是一个值,当我们传递一个对象的引用时,也称之为引用传递。下面将详细讨论Java函数参数传递中的值传递和引用传递。

1. 值传递

值传递就是将参数的值复制一份,然后把复制后的值传递给函数,函数内部操作的是复制后的值。这样,函数内部对参数的任何修改不会影响到原来的变量。

比如:

public class Test{

    public static void main(String[] args) {

        int a = 1;

        int b = 2;

        swap(a, b);

        System.out.println("a=" + a + " b=" + b);

    }

 

    public static void swap(int a, int b) {

        int temp = a;

        a = b;

        b = temp;

    }

}

这个程序会输出 "a=1 b=2"。原因是在 swap 函数内部交换的是 a 和 b 的副本。因此,实参 a 和实参 b 并没有改变。

参数的值传递方式比较简单,适用于基本数据类型的传递,但是如果要传递一个对象,则需要注意。当我们传递一个对象的引用时,虽然引用是一个值,但是实际上引用指向的还是同一个对象。这时,函数内部对该对象的修改会影响到该对象在函数外的使用。

2. 引用传递

引用传递就是将参数的地址复制一份,然后把复制后的地址传递给函数。这样,在函数内部对参数的任何修改会影响到原来的变量,因为它们指向同一个对象。

比如:

public class Test{

    public static void main(String[] args) {

        Person p = new Person("Tom", 18);

        change(p);

        System.out.println(p.getName() + " " + p.getAge());

    }

 

    public static void change(Person p) {

        p.set("Jerry", 20);

    }

}

 

class Person {

    private String name;

    private int age;

 

    public Person(String name, int age) {

        this.name = name;

        this.age = age;

    }

 

    public String getName() {

        return name;

    }

 

    public int getAge() {

        return age;

    }

 

    public void set(String name, int age) {

        this.name = name;

        this.age = age;

    }

}

这个程序会输出 "Jerry 20",因为 change 函数中的参数 p 就是 main 函数中的 p 引用,它指向的是同一个对象。所以在 change 函数中对 p 的修改会影响到 main 函数中的 p。

需要注意的是,虽然针对同一个对象,引用传递会在函数内部影响到函数外部,但是如果在函数内部把传入的引用指向了另外一个对象,则无法影响到函数外部。

比如:

public class Test{

    public static void main(String[] args) {

        Person p1 = new Person("Tom", 18);

        Person p2 = new Person("Jerry", 20);

        change(p1, p2);

        System.out.println(p1.getName() + " " + p1.getAge());

        System.out.println(p2.getName() + " " + p2.getAge());

    }

 

    public static void change(Person p1, Person p2) {

        Person temp = p1;

        p1 = p2;

        p2 = temp;

    }

}

 

class Person {

    private String name;

    private int age;

 

    public Person(String name, int age) {

        this.name = name;

        this.age = age;

    }

 

    public String getName() {

        return name;

    }

 

    public int getAge() {

        return age;

    }

 

    public void set(String name, int age) {

        this.name = name;

        this.age = age;

    }

}

这个程序会输出 "Tom 18" 和 "Jerry 20",因为在 change 函数中交换的是 p1 和 p2 的副本,不会影响到原有的引用。