1. 程式人生 > >java中出現的一個遞迴的問題

java中出現的一個遞迴的問題

例子

我們知道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";

正確結果