作者mkopoi (mm)
看板java
标题[问题] 一个再基础也不过的OO观念
时间Wed Dec 2 13:51:41 2009
今天写程式遇到一个我百思不得其解的观念问题
就我的认知, Java中的等号, 是把右边的值set给左方物件
结果今天遇到一个再基础也不过的问题,有点颠翻我对OO的认知
以下程式:
A a1= new A();
a1.id= "123";
A a2= new A();
a2= a1;
(以上两行写成A a2= a1也是一样啦)
a2.id= "456";
结果这时候去查...a1.id竟然是456!不是应该要123吗?
怎麽搞的好像指标一样,看起来好像是把a1的address reference给a2
有谁可以指出我观念上的盲点吗?感激不尽!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 60.249.163.125
1F:→ tkcn:Reference 只是一个被包装起来,比较安全的指标 12/02 13:55
2F:推 godfat:是指标没错啊,呵呵... 只是不能当 address 运算 12/02 13:59
3F:→ janyfor:a2 = a1, 会使得参考到同样的位置. 12/02 13:59
4F:→ janyfor:a2 = a1, 拿掉就会像你说的那样了. 12/02 14:02
5F:→ mkopoi:还是不懂耶...在Java中a2复制a1的值不是吗 12/02 14:08
6F:→ mkopoi:怎麽会变成address reference... 12/02 14:11
7F:→ mkopoi:a2是new出来的...有自已的独立Mem Space与address才对 12/02 14:13
※ 编辑: mkopoi 来自: 60.249.163.125 (12/02 14:14)
8F:推 derekQQ:如果是因为加了 a2= a1 ,reference到a1的位置了呢? 12/02 14:32
9F:→ FirstFan:A a2; a2=a1;这样会不会好理解些?这样你的a2就没有独立 12/02 14:45
10F:→ FirstFan:的mem space了。事实上你原来的A a2=new A()在a2=a1後, 12/02 14:48
11F:→ FirstFan:因为没有被引用,mem space就会被自动回收了 12/02 14:49
12F:推 legnaleurc:你想说的话应该是 a2 = a1.clone(); 才对 12/02 15:02
13F:→ adrianshum:和 OO 一点关系都没有..... =_= 12/02 15:03
15F:→ mkopoi:感谢各位,clone()应该是正解 12/03 00:14
16F:→ mkopoi:回adrianshum大,我对OO的等号理解是我文章第2段 12/03 00:15
17F:推 ogamenewbie:深层拷贝跟浅层拷贝我好像也不太常用... 12/03 01:25
18F:→ jej:^^ 我把java的物件理解成所有物件都是指标~ 12/03 08:22
19F:→ adrianshum:mkopoi: 等号 和 OO 还是一点关系都没有 12/03 10:58
20F:推 derekQQ:推a大,好像问题跟OO没关系... 12/03 13:47