我有很多概念都沒明白,現在反過頭來認識。

          Object是所有類的父類。
          java.lang.String也是繼承自java.lang.Object中。

          先比較一下2個類的toString()、equals()、= = (很多面試題都有),再來說一下String 的特殊。

          2個類toString()的比較:

          class Test {
              
          public static void
           main(String [] args) {
                  Object obj 
          = new
           Object();
                  Dog d 
          = new
           Dog();
                  String s 
          = new String("abc"
          );
                  
                  System.out.println(
          "obj = " +
           obj);    
                  System.out.println(
          "d = " +
           d);
                  System.out.println(
          "s = " +
           s);
              }
          }

          class
           Dog {}

          結果:

          obj 
          =
           java.lang.Object@c17164
          =
           Dog@1fb8ee3
          =
           abc


          查閱API文檔:

          Object類的 public String toString()   returns  
                              getClass().getName() 
          + '@' +
           Integer.toHexString(hashCode())
          String類的  
          public
           String toString()   returns  
                                the string itself.


          說明String類重寫了Object的toString方法。

          2個類equals()、= =比較:

          class Test {
              
          public static void
           main(String [] args) {
                  
                  
          //比較equals()和==

                  Dog d1 = new Dog(1);
                  Dog d2 
          = new Dog(1
          );
                  
                  System.out.println(
          "d1 == d2 " + (d1 == d2)); //false

                  System.out.println("d1.equals(d2) " + d1.equals(d2)); //false
                  
                  String s1 
          = new String("abc"
          );
                  String s2 
          = new String("abc"
          );
                  String s3 
          = "abc"
          ;
                  
                  System.out.println(
          "s1 == s2 " + (s1 == s2)); //false

                  System.out.println("s1.equals(s2) " + s1.equals(s2)); //ture
                  
                  System.out.println(
          "s1 == s3 " + (s1 == s3)); //false

                  System.out.println("s1.equals(s3) " + s1.equals(s3)); //true
              }
          }

          class
           Dog {
              
          private int
           i;
              Dog(){}
              Dog(
          int
           i){
                  
          this.i =
           i;
              }
          }

           

          "=="是比較2個對象的引用是否指向同一個地址,如果是比較2個基本類型,那么就是比較2個值是否相等。
          我new了2個Dog類,他們2個對象的棧引用肯定不能指向同一個堆地址。第二個String對象"=="的比較也是同樣道理。所以都返回了false(第三個比較體現了String的特殊類,等下說明)。

          查閱jdk的源代碼:"equals"在Object中定義為

          public boolean equals(Object obj) {
              
          return (this ==
           obj);
          }

          這就表示一個類如果沒有重寫該方法的話,它就是比較兩個的引用是否指向了同一個地址(和"=="比較是一致的)。
          類庫里的類基本都重寫的該方法,所以是比較2個對象的內容是否一樣的(String方法重寫了該方法,所以第二個equals比較返回ture),對于外面自己自定義的類,則需要自己重寫該方法來達到內容是否相等的邏輯。


          特殊對象String的equals()、= =比較

          String s = newString("abc");和String s = "abc";
          首先2個對象在內存分布上是不一樣的。第2個對象是s的棧引用指向數據片段區的地址(存放字符串常量,靜態成員變量)。第1個new出來的對象是s的棧引用指向堆中的地址(存放在堆中)。通過API文檔:新創建的字符串對象s是該參數字符串("abc")的副本。

          所以如代碼所表示:"=="比較是不一樣的,equals方法由于String重寫了,比較是字符序列。

           

          String s1 = "abc"    和  String s2 = "abc"比較;

          "=="和equals方法都返回ture;
          s1分配了字符常量"abc",那么再有"abc"要引用給對象,都不會再分配內存空間了。
          所以s1 和s2 指向的空間相同,內容也相同。

          posted on 2008-12-06 08:53 天長 閱讀(1625) 評論(1)  編輯  收藏
          Comments
          • # re: Object中的特殊類String(toString()、equals、==)[未登錄]
            conjs
            Posted @ 2008-12-06 11:07
            講的非常清楚  回復  更多評論   

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
           
          主站蜘蛛池模板: 遂溪县| 儋州市| 化州市| 安庆市| 华安县| 通化市| 威远县| 马山县| 随州市| 长兴县| 临夏县| 招远市| 右玉县| 镇平县| 天镇县| 洞口县| 晋城| 鹰潭市| 治多县| 肇源县| 仁怀市| 曲麻莱县| 海盐县| 东乡县| 长宁县| 凤庆县| 玉门市| 纳雍县| 工布江达县| 丽水市| 太康县| 邵阳县| 城口县| 茂名市| 宜阳县| 鸡西市| 高雄市| 南溪县| 朝阳县| 宁城县| 安岳县|