2014-02-17 57 views
-1

當我有樂趣,我發現了一個很奇怪的有關方法爲什麼這種方法永遠重複?

public class T { 
    static void m() { 
     System.out.println("M"); 
     m1(); 
    } 

    static void m1() { 
     System.out.println("MM"); 
     m(); 
    } 

    public static void main(String[] args) { 
     m(); 
    } 
} 

有這個代碼也不例外,但它不重複永遠

回答

7

此代碼不能編譯,因爲你打電話一個沒有類實例的static方法的非static方法。

一旦你解決了這個問題,你將以無限遞歸結束。

在典型的JVM上,這會導致代碼最終耗盡堆棧空間。在優化尾遞歸的JVM上,代碼將等同於無限循環。

+0

「*在優化尾遞歸的JVM上,代碼將相當於一個無限循環*」 - 這很有趣,請您詳細解釋一下這個問題嗎?有什麼區別? – Maroun

+0

@MarounMaroun:它將永遠運行,而不是用完堆棧空間。 – NPE

+0

謝謝。爲什麼這稱爲優化?我認爲,用完堆棧是更好的選擇,因爲它會表明可能存在泄漏/錯誤。雖然它真的取決於程序員的「更好」。 – Maroun

1

如果你做mm1靜態,該代碼將編譯,你會得到無限遞歸,因爲:

m你打電話m1,並在m1你打電話mm你打電話m1和在m1你叫mm你叫m1和...

0

它會永遠重複,如果使方法static或正確調用它。由於方法(編輯後)static現在它將永遠重複。

相關問題