楼主的问题实质在:没弄明白引用类型对象的创建在内存中的具体表现是怎样的。
我用自己的理解来解释一下,希望你能明白。
Data data = new Data();
这个表达式可以分为两部分,Data data 只是声明一个Data 类型 的名称 data,不分配内存空间,也就不存在实际意义,只是一个名字;
而new Data() 则是真实的在内存中分配一个空间并创建一个Data 类型的对象。
只有在将new Data() 赋值给Data data以后,data才有了实际意义。
举个通俗一点的例子,
有一个人名字叫"张三",但是我们并不认识,所以对于张三是谁,张三的信息我们不去关心,因为没有啥意义。
当有一天,有一个人来到大家面前自我介绍说:"我是张三"。OK,大家都知道了"张三"可以代表这个人了,那么我们就可以去对他的特征和行为进行评价。
如果有一天,这个人缺胳膊少腿了,那么他还是"张三",因为"张三"这个名字是代表这个人,指向这个人的。
所以,下面这段代码代表的是同一个意思
for (int i = 100; i < 103; i++) {
data = new Data();
data.setVal(i);//虽然改变了对象的值,但是并没有改变对象本身是自己这个事实,所以不管他改变多少次,但是张三还是代表这个人。
//除非某一天,有人跟你说,张三不是这个人了,是另外一个人,那么才是真正的改变。
list.add(data);
}
当然,如果有一天,张三说:"我还有一个英文名字叫Json",那么,Json也是指向"这个人"。
建议查一下声明对象时内存空间的分配情况(指针指向谁就代表谁),只有明白了这个,以后才不会有疑惑。(个人理解,如果有误,请指正,谢谢!)
|