免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
java的“別名”以及clone機(jī)制

什么是別名?

用個(gè)簡(jiǎn)單的例子說(shuō)明

          public class Aliases{

                int i;

               public Aliases() { i=1; }

               public Aliases(int i) { this.i=i; }

                public static void main(String args[]) {

                      Aliases A=new Aliases();

                      Aliases B=A;      //A和B指向了同一個(gè)對(duì)象,A和B互為別名

                      System.out.println("A.i and B.i:"+A.i+" "+B.i);

                      System.out.println("增加B:");

                       B.i++;

                       System.out.println(("A.i and B.i:"+A.i+" "+B.i); } }

                     輸出:A.i and B.i:1 1

                             增加B:

                             A.i and B.i:2 2

很明顯,A和B指向了同一個(gè)對(duì)象,B=A這個(gè)操作只是把A的引用復(fù)制給了B,而對(duì)象并未拷貝。java是通過(guò)Rerference來(lái)操作對(duì)象的,上面是一個(gè)顯式別名的例子,當(dāng)你往函數(shù)內(nèi)傳遞對(duì)象時(shí)也會(huì)發(fā)生別名,如下:                 

                                 public class Aliases{                   

                                          int i;

                                          public Aliases() { i=1; }

                                          public Aliases(int i) { this.i=i; }

                                          public Increment(Aliases AS) { AS.i++; }

                                          public static void main(String args[]) {

                                                   Aliases A=new Aliases();

                                                   System.out.println("A.i before Increment:"+A.i);

                                                   Increment(A);

                                                    System.out.println("A.i after Increment:"+A.i);

                                            }

                                 }

         你可以看到A在經(jīng)過(guò)函數(shù)Increment()的調(diào)用后i的值發(fā)生了變化。在某種情況下,你可能不希望傳入的對(duì)象發(fā)生變化,希望函數(shù)內(nèi)的對(duì)象只是傳入對(duì)象的副本,對(duì)這個(gè)副本的改變不至于影響原來(lái)的對(duì)象,那該如何處理?我們知道C++是通過(guò)把參數(shù)聲明了const,就意味著此參數(shù)不可改變,但是別忘了,C++有所謂的拷貝構(gòu)造函數(shù),所以在函數(shù)中的對(duì)象確實(shí)是拷貝,而java并未支持拷貝構(gòu)造函數(shù),原因很明顯,java傳遞對(duì)象的引用,你就算拷貝也只是引用的拷貝而已(所以有人說(shuō)java本質(zhì)上只有傳值)。那么就沒(méi)辦法了嗎?有的,那就是“克隆機(jī)制”,在根類Object已經(jīng)定義了clone()方法,你所要做的只是實(shí)現(xiàn)cloneable接口,并覆寫(xiě)clone()方法,典型的應(yīng)用如下

                                class CloneClass implements Cloneable{

                                          public int aInt;

                                            public Object clone(){

                                             CloneClass o = null;

                                            try{

                                                   o = (CloneClass)super.clone();

                                                 }catch(CloneNotSupportedException e){

                                                  e.printStackTrace();

                                                 } return o;

                                            }

                              }

調(diào)用super.clone()方法,它會(huì)為你自動(dòng)處理存儲(chǔ)分配和復(fù)制操作,從而實(shí)現(xiàn)了對(duì)象的深層拷貝。我們又知道,同過(guò)serilization也可以實(shí)現(xiàn)對(duì)象的深層拷貝啊,為什么不用這個(gè)?根本原因在于效率上的巨大差異,clone()雖然一開(kāi)始好象很復(fù)雜,但畢竟沒(méi)有對(duì)象的讀寫(xiě)那么耗費(fèi)資源。有了clone機(jī)制,你就可以在方法調(diào)用內(nèi)部制造一個(gè)對(duì)象的副本了,它是局域性,對(duì)它的任何操作都不至于影響原對(duì)象的狀態(tài)了。我個(gè)人認(rèn)為,這點(diǎn)對(duì)于編寫(xiě)一個(gè)安全的大型程序是非常重要的。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
JAVA之關(guān)于This的用法
JAVA中的指針,引用及對(duì)象的clone (developerworks)
Java總結(jié)篇系列:java.lang.Object
Java中this關(guān)鍵字
Java對(duì)象克?。–lone)及Cloneable接口、Serializable接口的深入探討
原型模式(Prototype)解析例子
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服