乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      java的“別名”以及clone機制...

       ShangShujie 2007-05-03

      什么是別名?

      用個簡單的例子說明

                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指向了同一個對象,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指向了同一個對象,B=A這個操作只是把A的引用復制給了B,而對象并未拷貝。java是通過Rerference來操作對象的,上面是一個顯式別名的例子,當你往函數(shù)內傳遞對象時也會發(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在經過函數(shù)Increment()的調用后i的值發(fā)生了變化。在某種情況下,你可能不希望傳入的對象發(fā)生變化,希望函數(shù)內的對象只是傳入對象 的副本,對這個副本的改變不至于影響原來的對象,那該如何處理?我們知道C++是通過把參數(shù)聲明了const,就意味著此參數(shù)不可改變,但是別忘了,C+ +有所謂的拷貝構造函數(shù),所以在函數(shù)中的對象確實是拷貝,而java并未支持拷貝構造函數(shù),原因很明顯,java傳遞對象的引用,你就算拷貝也只是引用的 拷貝而已(所以有人說java本質上只有傳值)。那么就沒辦法了嗎?有的,那就是“克隆機制”,在根類Object已經定義了clone()方法,你所要 做的只是實現(xiàn)cloneable接口,并覆寫clone()方法,典型的應用如下

                                      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;

                                                  }

                                    }

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

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多