隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數據加載中……

          如何防止覆蓋(override)toString方法時產生遞歸調用

          本文為原創,如需轉載,請注明作者和出處,謝謝!

              在Java中任何對象都繼承于Object類,因此,每個類都有一個toString方法用于返回當前對象的字符串形式(可能是對象地址或其他和對象相關的信息)。在每個類中也可以覆蓋toString方法以返回自定義的字符串。如下面的代碼將以一定的格式返回對象的地址:


          package string;

          public class InfiniteRecursion
          {
              
          public String toString()
              {
                  
          return "address:" + this;
              }
              
          public static void main(String[] args)
              {
                  System.out.println(
          new InfiniteRecursion().toString());
              }
          }

          如果運行上面的程序,將拋出StackOverflowError異常,這說明程序的工作棧溢出了。導致這種情況最常見的錯誤就是無限遞歸。這們發現在toString中使用this來返回對象的地址,如果這樣調用,將會無限調用InfiniteRecursion類的toString方法。如果要避免這種情況的出現,要將toString改成如下的形式:


          public String toString()
          {
              
          return "address:" + super.toString();
          }

              也就是說,不能再調用當前類的toString方法,必須調用當前類父類的toString方法才能返回正確的結果。




          Android開發完全講義(第2版)(本書版權已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2008-05-07 16:07 銀河使者 閱讀(1991) 評論(7)  編輯  收藏 所屬分類: java 原創

          評論

          # re: 如何防止重載toString方法時產生遞歸調用  回復  更多評論   

          我想,標題有誤吧,“重載”應改為“重寫”。
          重載與重寫是不一樣的!
          2008-05-07 22:52 | dotnetMac

          # re: 如何防止重載toString方法時產生遞歸調用  回復  更多評論   

          System.out.println(new InfiniteRecursion()) is good enough.
          2008-05-08 04:15 | Wendong

          # re: 如何防止覆蓋(override)toString方法時產生遞歸調用  回復  更多評論   

          沒錯,是覆蓋或重寫(override),已經改過來了!
          2008-05-08 08:48 | 銀河使者

          # re: 如何防止覆蓋(override)toString方法時產生遞歸調用  回復  更多評論   

          可能是對重載印象較深,哈哈,內容全都是覆蓋。
          2008-05-08 08:49 | 銀河使者

          # re: 如何防止覆蓋(override)toString方法時產生遞歸調用  回復  更多評論   

          另外System.out.println(new InfiniteRecursion());和 System.out.println(new InfiniteRecursion().toString());是完全一樣的,都會拋出java.lang.StackOverflowError異常
          2008-05-08 09:11 | 銀河使者

          # re: 如何防止覆蓋(override)toString方法時產生遞歸調用  回復  更多評論   

          誰會這樣重寫toString呢,我們知道,如果用戶沒有覆蓋toString拿直接print
          this 就默認調用toString方法啊
          2008-05-08 12:03 | 愛上對方

          # re: 如何防止覆蓋(override)toString方法時產生遞歸調用  回復  更多評論   

          本文只是個引子,雖然標簽是toString方法,但我們可以引申到其他的任何方法。
          2008-05-08 12:09 | 銀河使者
          主站蜘蛛池模板: 鹤岗市| 盖州市| 龙海市| 泰顺县| 苏尼特右旗| 灵石县| 昌图县| 恩施市| 称多县| 冀州市| 嵊泗县| 惠安县| 五寨县| 宾川县| 延川县| 前郭尔| 疏附县| 张掖市| 比如县| 江达县| 吉安县| 乌兰浩特市| 江口县| 长岛县| 探索| 东乡县| 伊宁市| 磐安县| 区。| 嘉定区| 班戈县| 哈尔滨市| 潼关县| 阜宁县| 商水县| 永州市| 安多县| 渝中区| 策勒县| 且末县| 绥阳县|