为什么 Java 只有值传递,但 C# 既有值传递,又有引用传递,这种语言设计有哪些好处? - Hugo Gu的回答 - 知乎
一个实例
定义 Person 类
public 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 void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Main {
private int X = 123;
public void updateVlue(int value){ // 传入基本数据类型
value = value + 1;
System.out.println("变量value: "+value);
}
public void updateObject(Person person){ // 传入引用类型
Person E = person;
E.setAge(21);
}
public void swapObject(Person A,Person B){ // 传入引用类型
Person C = A;
A = B;
B = C;
}
public static void main(String[] args) {
// 例子 1
Main main = new Main();
int X = 1;
main.updateVlue(X);
System.out.println("X 的值:"+X); // X = 1
// 例子 2
Person A = new Person("张三",20);
main.updateObject(A);
System.out.println("A: "+A.toString()); // A: Person{name='张三', age=21}
// 例子 3
Person C = new Person("C",10);
Person D = new Person("D",15);
main.swapObject(C,D);
System.out.println("C: "+ C.toString()); // C: Person{name='C', age=10}
System.out.println("D: "+ D.toString()); // D: Person{name='D', age=15}
}
}
例子1:函数传入基本数据类型(值类型参数),由于 value 是 X 的一个副本,对 value 进行操作,并没有改变原来实参的值。