值传递和引用传递的机制
public class Dog {
private String name;
private int age;
public Dog(String name) {
this.name = name;
}
public void changeDog(Dog dog){
dog = new Dog("Jerk");
}
public void changeName(Dog dog){
dog.setName("Jerk");
}
public void changeAge(int age){
age = 100;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class Test {
public static void main(String[] args) {
Dog dog = new Dog("Tom");
int age = 10;
dog.changeAge(age);
System.out.println(age);//输出10
/**
* 在传递基础数据类型时,dog.changeAge(age);
* 是将外部的age的值拷贝,“自己”作为实参传入changeAge,
* 在changeAge中改变了“自己”,并没有改变外部的age。
*/
dog.changeDog(dog);
System.out.println(dog.getName());//输出Tom
/**
* 在传递引用数据类型时,dog.changeDog(dog);
* 是将外部的 new Dog(Tom)的地址A拷贝,
* “自己”作为实参引用该地址A的数据,并将“自己”传入changeDog中。
* 在changeDog中改变了“自己”的引用地址new Dog(“Jerk”)。
* 但上述改变,并没有改变外部的dog的引用地址。
*/
dog.changeName(dog);
System.out.println(dog.getName());//输出Jerk
/**
* 另外一种情况,dog.changeName(dog);
* 是将外部的 new Dog(Tom)的地址A拷贝,
* “自己”作为实参引用该地址A的数据,并将“自己”传入changeName中。
* “自己”和外部dog都指向地址A,
* changeName中的dog.setName改变了地址A上的数据
* 所以外部dog的数据发生了变化。
*/
}
}
图表达: