闲话少说线上代码,在给分析
/**
* @Auther: qianshanmuxue
* @Date: 2019/3/21 09:53
* @Description:
*/
public class test {
class A{
String a;
String name;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return a+name;
}
}
public void a(){
A a=new A();
a.setA("a");
a.setName("is a ");
System.out.println("1"+a.getA()+":"+a.getName()+":"+a.toString());
b(a);
System.out.println("2"+a.getA()+":"+a.getName()+":"+a.toString());
}
public void b(A a){
a.setName(" is b");
a.setA(" b is ");
System.out.println("3"+a.getA()+":"+a.getName()+":"+a.toString());
}
public static void main(String [] a){
test t=new test();
t.a();
}
}
运行结果:
可以发现在调用b方法后,对象A的值已经发生改变
说明引用传递(对象传递)后对象的属性如果发生改变,那么返回原方法后对象的属性就已经发生改变。
实质分析:引用传递,在java机制中传递的是对象在内存中的地址,可以这样理解,
1.a方法:在内存中new了一个对象=a在某个楼盘要建个房子,先买了楼盘,打了地基,建了毛坯房等操作;
2.现在a方法调用b方法:把这个对象交给b,b再修改了对象的属性=现在a吧房子地址发给b,请b过来进行装修,b进行装修后就离开了;
3.a又重新接管房子的,房子还是在那个地址没变,但是房子的属性却变了==对象地址未发生改变,对象的属性发生了改变。
4.可能接下a又要调用c,d,e来进行干一些其他的事情,比如改装,装水电啊之类的,房子的属性继续发生改变,但是地址依旧不变;
5.可能c,d,e...之类的又调用F,G装厕所,通下水道等等,是一个原理。属性发生变化,但是地址不会发生变化。