Java中值传递与引用传递的区别解析

发表时间: 2024-07-31 18:41

Java中的参数传递是通过值传递进行的,即使是对象也是遵循这个规则,想要了解这个原理,首先我们就需要了解什么是值传递,什么是引用传递?

值传递

值传递是在调用方法的时候,方法接收到的参数是实际参数的一个副本值。所以,在方法内部对参数修改不会影响到原始参数的值。如下所示

public class ValuePassExample {    public static void main(String[] args) {        int number = 5;        System.out.println("Before calling changeValue: " + number); // 输出 5        changeValue(number);        System.out.println("After calling changeValue: " + number);  // 输出 5    }    public static void changeValue(int num) {        num = 10;    }}

在上面这个例子中,当number被作为参数传递到changeValue方法的时候,实际上传递的是number的一个副本值,而在changeValue方法中,对num的修改并不会影响到main函数中的number变量的值。

引用传递

对于对象类型,传递的也是引用的副本(引用的值),而不是对象本身。对象的引用值传递的副本依然是值传递,但由于引用指向同一个对象,方法内通过引用修改对象的属性会影响到原始对象。如下所示

public class ReferencePassExample {    public static void main(String[] args) {        Person person = new Person("Alice");        System.out.println("Before calling changePersonName: " + person.getName()); // 输出 Alice        changePersonName(person);        System.out.println("After calling changePersonName: " + person.getName());  // 输出 Bob        changePerson(person);        System.out.println("After calling changePerson: " + person.getName());  // 输出 Bob    }    public static void changePersonName(Person p) {        p.setName("Bob");    }    public static void changePerson(Person p) {        p = new Person("Charlie");    }}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对象的引用被传递到了changePersonName方法中,而在这个方法的内部通过引用修改了对象的属性值,这种修改对于外部的对象是可见的。

而在changePerson方法中,对p重新赋值,但这只是改变了p的引用,原始的person引用并未改变,因此方法外部无法看到这种修改。

总结

Java 中只有值传递

  • 对于基本类型,传递的是值的副本。
  • 对于对象类型,传递的是引用的副本(即引用的值)。

尽管对象引用是值传递的,但由于引用指向同一个对象,通过引用修改对象的属性会影响到原始对象。然而,引用本身的重新赋值不影响原始引用。因此,可以总结为:Java 中所有参数都是通过值传递的,不存在引用传递。