先写三个例子把。
1、这个例子很简单,估计都知道,是值类型,按照值类型传递,传递是副本。所以结果依旧是20。
static void change(int age) { age = 10; } public static void main(String[] args) { int age = 20; change(age); System.out.println(age); }
2、这个一看是引用类型,按照引用类型传递,传递“址”,那么结果就是10,嗯,对,确实是10。
public class UserPo {
private int age;
public int getAge() {return age;}
public void setAge(int age) {this.age = age;}
UserPo(int age) {this.age = age;}
static void change(UserPo user) {
user.setAge(10);
}
public static void main(String[] args) {
UserPo user = new UserPo(20);
change(user);
System.out.println(user.getAge());
}
}
3、再来看看这个,也是引用类型,引用传递,输出结果是10吗?NO,是20,不是都说是引用类型传递的是引用么?为什么还是20?
解释:其实把,不能说是引用类型传递的就是引用,其实不管值类型,还是引用类型传递的都是一个副本,记住是副本。值类型副本就不解释了,引用类型的副本就是引用地址的副本,结合下面这个例子,假设我们在new UserPo(20);的时候,引用是A,那么传递进去change方法中就变成A的副本,两个引用指向同一处堆空间,所以在上边例子你依然可以改掉值。但在这个例子中,由于又new UserPo(10);生成了新的引用地址指向age是10的堆空间。引用地址已经不是原来20的地址了。执行完这个change方法就进入回收了。那么原来的20还是原来的20没有发生改变。
记住传递是“副本”。
public class UserPo {
private int age;
public int getAge() {return age;}
public void setAge(int age) {this.age = age;}
UserPo(int age) {this.age = age;}
static void change(UserPo user) {
user = new UserPo(10);
}
public static void main(String[] args) {
UserPo user = new UserPo(20);
change(user);
System.out.println(user.getAge());
}
}