java中出現的一個遞迴的問題
阿新 • • 發佈:2018-12-16
例子
我們知道Java中每一個類都是繼承自Object,容器類也不例外。Object有toString方法,那麼容器類也就擁有。先看下面一個例子。作用是:建立一個容器類,並通過toString方法打印出容器內部的子類。
package com.test; import java.util.ArrayList; import java.util.List; public class StringDiGui { public String toString(){ return "StringDiGui的呼叫類的地址是"+this+"\n"; } public static void main(String[] args) { List<StringDiGui> list =new ArrayList<StringDiGui>(); for(int i=0;i<5;i++){ list.add(new StringDiGui()); } System.out.println(list); } }
錯誤
在這裡我們重寫了toString方法,並在for迴圈中建立了五個這樣的類,最後呼叫列印,但是2這樣後臺會報錯,先看一下控制檯的出錯資訊:
這個出錯資訊是超級多的,而且可以說是永遠都在出錯。這是因為出現了遞迴呼叫的問題。
原因
那麼問題出現在哪呢?就在這一行
return "StringDiGui的呼叫類的地址是"+this+"\n";
這裡的this出現了遞迴呼叫。在這裡編譯器會將this自動轉換為String。但是this不是一個String,怎麼辦呢?此時this就會自己呼叫toString方法。在新的toString方法中又出現了this,那麼編譯器有想要把這個this轉化為String,此時this又繼續呼叫toString方法。就這樣迴圈往復成為了死迴圈的遞迴呼叫。
解決
如何去解決呢?在這裡我們不應該呼叫當前物件的this,而是super.toString方法。也就是把這一行程式碼換成。
return "StringDiGui的呼叫類的地址是"+super.toString()+"\n";