网上关于 java参数传递的说法云天雾地的,许多人不严谨的说法给许多新人 造成了误解。
经过多方试验 本人就个人理解 总结如下:希望对探求真理的同学有所帮助,如果有不严谨的说辞 ,请予以留言指正,互相讨论 共同进步。
public class Bean(
private String name;
public void setName(String name){this.name=name;}
public String getName(){return this.name;}
)
public class Test{
public static void main(String args[]){
Bean bean1=new Bean();
bean1.setName("abc");
Bean bean2=bean1;
bean2.setName("cba");
System.out.println(bean1.getName());
}
}
运行结果:cba
解释:java中变量都用 引用 这个名字代替
1。在内存的 栈内存区存储引用,堆内存存储引用指向的实际内容。
2. 虚拟机在运行的时候每读到一个引用就调至栈顶 然后对其操作。引用也是一个东西,他的实质是一个地址。一个记录了引用指向的具体变量内容的 堆内存地址。
例如 001单元的栈内存单元 存储了引用bean1,即001单元里存储着 @12345
而在堆内存单元地址 @12345里面存储了 bean1引用的实际内容。(或者是从这个地址开始的,根据变量类型决定)
这样bean1 就成为人们常说的 “指向内容的引用了”。因为存了内容的地址,所以可以叫指向。(不知道谁发明这个让大家费解的名词。)
3.理解了上面之后,bean2=bean1操作之后,会发生以下变化。
在内存的栈内存区域 的一个新的内存单元002中存储了一个引用的值@12346 。即栈内存单元002里面也存了@12345这玩意儿。 为啥呢?大家可以考虑下=号是什么意思,就是把等号右边的值给左边。
这样bean2也就指向了@12345的内容了。
4. bean2.setName("cba");这句话执行之后 就由bean2 这个玩意操作了@12345里面 的东西改成了cba
5.所以 无辜的 bean1 啥也没做 就被改了内容。因为bean1 也指向了 @12345
这就好比 业主 给了装修的一把自己家门的钥匙 ,然后 装修的进去把屋子给砸砸,业主也只能无辜的看着这一切的发生。