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 中所有参数都是通过值传递的,不存在引用传递。