複製對象 or 複製引用
在Java中,如下相似的代碼很是常見:
Person p = new Person(23, "zhang");
Person p1 = p;
System.out.println(p);
System.out.println(p1);
當Person p1 = p;執行以後, 是建立了一個新的對象嗎? 首先看打印結果:
com.pansoft.zhangjg.testclone.Person@2f9ee1ac
com.pansoft.zhangjg.testclone.Person@2f9ee1ac
可已看出,打印的地址值是相同的,既然地址都是相同的,那麼確定是同一個對象。p和p1只是引用而已,他們都指向了一個相同的對象Person(23, "zhang") 。 能夠把這種現象叫作引用的複製。上面代碼執行完成以後, 內存中的情景以下圖所示:
而下面的代碼是真真正正的克隆了一個對象。
Person p = new Person(23, "zhang");
Person p1 = (Person) p.clone();
System.out.println(p);
System.out.println(p1);
從打印結果能夠看出,兩個對象的地址是不一樣的,也就是說建立了新的對象, 而不是把原對象的地址賦給了一個新的引用變量:
com.pansoft.zhangjg.testclone.Person@2f9ee1ac
com.pansoft.zhangjg.testclone.Person@67f1fba0
以上代碼執行完成後, 內存中的情景以下圖所示: