一、基本概念
值传递是指在方法调用时,将实际参数的值复制一份传递给方法的形式参数。对形式参数的修改不会影响实际参数的值。
引用传递则是将实际参数的引用(内存地址)传递给方法的形式参数,在方法中对形式参数所指向的对象进行修改会影响到实际参数所指向的对象。
二、Java 中的体现
- 基本数据类型参数传递:
- 当把一个基本数据类型(如 int、double、char 等)作为参数传递给方法时,是值传递。
- 例如:
public class ValuePassingExample {public static void main(String[] args) {int num = 10;changeValue(num);System.out.println(num); // 输出仍然是 10}public static void changeValue(int value) {value = 20;}}
- 在这个例子中,把
num
的值 10 传递给了changeValue
方法的参数value
。在changeValue
方法中,虽然将value
的值改为了 20,但这并不会影响到main
方法中的num
。因为这里只是将num
的值复制了一份传递给了value
,对value
的修改不会影响到num
。
- 引用数据类型参数传递:
- 当把一个引用数据类型(如对象、数组等)作为参数传递给方法时,实际上传递的是对象的引用(内存地址)的值。但从本质上来说,仍然是值传递。
- 例如:
class Person {String name;public Person(String name) {this.name = name;}}public class ReferencePassingExample {public static void main(String[] args) {Person person = new Person("Alice");changePerson(person);System.out.println(person.name); // 输出可能是 Bob}public static void changePerson(Person p) {p.name = "Bob";}}
- 在这个例子中,把
Person
对象的引用传递给了changePerson
方法的参数p
。在changePerson
方法中,通过p
引用修改了对象的name
属性。在main
方法中输出person.name
时,发现其值被改变了。这并不是因为引用传递,而是因为两个引用(person
和p
)指向了同一个对象。在方法中通过引用修改了对象的内容,但如果在方法中重新给引用赋值,指向一个新的对象,那么原引用(在main
方法中的引用)不会受到影响。 - 例如:
class Person {String name;public Person(String name) {this.name = name;}}public class ReferencePassingExample {public static void main(String[] args) {Person person = new Person("Alice");changePerson(person);System.out.println(person.name); // 输出仍然是 Alice}public static void changePerson(Person p) {p = new Person("Bob");}}
- 在这个修改后的例子中,在
changePerson
方法中重新给p
赋值为一个新的Person
对象,但这并不会影响到main
方法中的person
引用。因为这里只是把p
指向了一个新的对象,而person
仍然指向原来的对象。
综上所述,Java 中只有值传递,无论是基本数据类型还是引用数据类型,都是将实际参数的值复制一份传递给方法的形式参数。对于引用数据类型,虽然传递的是对象的引用,但对引用的操作本质上还是值传递的体现。