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

Java中函数参数的传递方式详解

发布时间:2023-07-16 13:17:08

Java中函数参数的传递方式有两种:值传递和引用传递。

值传递:当基本数据类型作为函数参数时,实际传递的是值的拷贝。在函数内部对参数进行修改不会影响原始的变量。

例如:

public class Main {
    public static void main(String[] args) {
        int number = 10;
        changeNumber(number);
        System.out.println("原始值:" + number);
    }

    public static void changeNumber(int number) {
        number = 20;
        System.out.println("修改后的值:" + number);
    }
}

运行结果:

修改后的值:20
原始值:10

从结果可以看出,虽然在changeNumber函数中修改了number的值,但是在main函数中的number变量的值并未受到影响。

引用传递:当对象作为函数参数时,实际传递的是对象的引用。在函数内部对参数进行修改会改变原始的对象。

例如:

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("Alice");
        changePersonName(person);
        System.out.println("修改后的姓名:" + person.getName());
    }

    public static void changePersonName(Person person) {
        person.setName("Bob");
        System.out.println("修改后的姓名:" + person.getName());
    }
}

class Person {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

运行结果:

修改后的姓名:Bob
修改后的姓名:Bob

从结果可以看出,虽然changePersonName函数中修改了person的姓名,但是在main函数中的person对象的姓名也发生了改变。

需要注意的是,虽然引用传递传递的是对象的引用,但是不能在函数内部修改引用的指向,例如:

public class Main {
    public static void main(String[] args) {
        Person person1 = new Person();
        person1.setName("Alice");
        Person person2 = new Person();
        person2.setName("Bob");
        System.out.println("person1的姓名:" + person1.getName());
        System.out.println("person2的姓名:" + person2.getName());
        swapPerson(person1, person2);
        System.out.println("交换后person1的姓名:" + person1.getName());
        System.out.println("交换后person2的姓名:" + person2.getName());
    }

    public static void swapPerson(Person person1, Person person2) {
        Person temp = person1;
        person1 = person2;
        person2 = temp;
        System.out.println("交换后person1的姓名:" + person1.getName());
        System.out.println("交换后person2的姓名:" + person2.getName());
    }
}

class Person {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

运行结果:

person1的姓名:Alice
person2的姓名:Bob
交换后person1的姓名:Bob
交换后person2的姓名:Alice
交换后person1的姓名:Bob
交换后person2的姓名:Alice
交换后person1的姓名:Bob
交换后person2的姓名:Alice

从结果可以看出,虽然在swapPerson函数中交换了person1person2的引用,但是在main函数中的person1person2对象的引用并未发生改变。

综上所述,Java中函数参数的传递方式有两种:值传递和引用传递。对于基本数据类型,采用值传递,对于对象,采用引用传递。