2016-01-07 69 views
1

我是新來的java,我想了解什麼時候在類和主程序中創建對象我得到這個異常線程「主」java.lang.StackOverflowError異常執行時下面的程序。有人可以幫助我理解爲什麼它會進行遞歸嗎?java中的StackOverflowError - 遞歸

public class Test { 

    Test t = new Test(); 

    public static void main(String arg[]) { 

     Test t = new Test(); 
    } 
} 

回答

1

這裏的問題是變量t

如果創建了一個新的Test -object,t自動初始化 - 一個新的Test -object,這對創作又創建了一個新的Test -object。因此,對構造函數Test的每個調用都會導致另一個構造函數Test的調用。直到堆棧溢出。

0

因爲您在聲明Test t = new Test();本身在測試類中刪除頂部Test t = new Test();或更改變量,然後嘗試運行它。

2

您沒有構造函數。我認爲有以下就是你想要的東西:

class Test { 
    //constructor method 
    Test() { 
    System.out.println("Constructor method called."); 
    } 

    public static void main(String[] args) { 
    Test t = new Test; //creating object 
    } 
} 

來源:http://www.programmingsimplified.com/java/tutorial/java-constructor-tutorial

你得到一個堆棧溢出的原因是,每一個類實例化時,它聲明實例變量t被初始化爲另一個在類的新實例中,由於每個新對象都會創建另一個新對象,因此會導致無限遞歸等。

+0

在java中,如果您沒有聲明構造函數是好的,則編譯器將包含默認構造函數。 – saljuama

+0

是的,我知道,但輸出一個消息來證明構造函數被調用似乎很有用,因爲海報說他正試圖理解構造函數。 – pabrams

+0

我引用的來源可能不是一般的java教程最好的。這個可能更好,雖然構造函數的例子並不那麼簡單:https://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html – pabrams