在大家日常开发中是否遇到过明明调用了方法改变了值,到最后却没有改变成功的样例出现呢
现在请大家先看一下代码
public class mian {
public static void main(String[] args) {
Student a = new Student();
Student b = new Student();
a.setName("zhangsan");
b.setName("lisi");
System.out.println(a);
System.out.println(b);
swap1(a,b);
System.out.println(a);
System.out.println(b);
swap(a,b);
System.out.println(a);
System.out.println(b);
int c =10;
int d=20;
Integer e =10;
Integer f=20;
swap(c,d);
System.out.println(c);
System.out.println(d);
swap(e,f);
System.out.println(e);
System.out.println(f);
}
private static void swap1(Student e, Student f) {
String name = e.getName();
e.setName(f.getName());
f.setName(name);
}
private static void swap(Student e, Student f) {
Student a= e;
e=f;
f=a;
}
private static void swap(int a, int b) {
int c =a;
a=b;
b=c;
}
private static void swap(Integer a, Integer b) {
Integer c =a;
a=b;
b=c;
}
private static class Student {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
'}';
}
}
}
大家先猜一猜这个的输出结果是什么呢
公布一下答案吧
是的没错,在这里除了第一次调用后改变了实际数据之后的调用方法都没能改变
首先在上边的类对象中
在创建类对象后已经开辟了一块内存空间来存放这两个对象,然后在给a和b的name属性赋值后是在内存中开辟了一个“zhangsan”和一个“lisi”的空间然后将a和b的name属性值指向这两块空间完成的赋值,在第一个调用的方法中,可以看到新开辟了一个空间名为name然后让他指向了a.name所指向的空间地址后才将a.name的空间地址指向“lisi”,最后再将b.name的空间地址指向了“张三”,在方法调用完毕后会把新开辟的name空间释放掉,这就完后了之前指向的空间地址的互换,所以才完成了值的互换,而在第二个方法调用后可以看到会在内存中新开辟三个类对象空间,然后在这里只是将新开辟的三个对象空间进行了指向地址的互转而并没有改变指向地址中name指向的地址所以在方法调用完毕后,对临时开辟的对象空间进行释放后对原来的值并没有产生任何作用,而第三种方法因为是基础数据类型int 在创建时会直接在内存中开辟空间直接赋值,然后在调用方法后依旧是会在内存空间中创建三个新的内存地址,方法中对三个新的内存地址进行的互换而并没有对原来的内存地址中的值产生操作,在调用完毕释放后依旧不会产生任何作用,最后一种方法也是同理,所以这就是为什么在调用方法后不能对值进行改变的根本原因,没有对该值的指向地址进行操作