bug,这是大家在写代码过程种最寻常的事了。了解代码运行的详细步骤能更有效的解决的问题,这里我们了解一下对象创建和调用的过程。
这里创建一个类Test,里面只有一个成员属性——int a;
再创建一个类,勾选main方法,在main方法中创建Test对象t1并给a赋值,再将t1赋给Test t2;
输出t1.a和t2.a的值
然后将t2.a的值改为20;再输出t1.a和t2.a的值
只更改t2.a的值,但t1.a的值也发生了改变,现在了解一下它的原理
首先在栈内存中加载main方法,然后创建对象Test t1,并在堆内存中划分出一片空间用于存储t1中的数据,那t1是如何找到堆内存中的空间的呢?t1其实有个内存地址,能根据这个地址找到堆内存中对应的空间
这是出现了Test t2,但它并不是new出来的,这意味着t2只被加载栈内存中,但堆内存并没有划分出一片空间储存它的数据,将t1赋给t2,是将t1的内存地址赋值给了t2,指向的是堆内存中同一片空间
此时更改了t2.a的值,再通过t1.a去访问时就会出现更改后的值。
那如何让两个对象互不影响呢?这里两个会相互影响的原因是两个对象共用了一片内存空间,那我给t2也划分一片内存空间就可以了,那就通过new创建对象,堆内存中就有了它自己的内存空间,此时再将t1赋值给t2,复制的是t1中具体的数据,而不再是内存地址,毕竟金窝银窝不如自己的狗窝。有了自己的家就不会去跟别人共用一间房间。
上面的问题其实就是指向的堆内存不同导致的问题,确定好其指向的空间是否正确就可以避免这类问题