2014-10-09 148 views
2

我在主要方法中創建了一個對象d,在構造函數之後,然後是另一個對象,f。我需要了解爲什麼Output發生異常(Exception in thread "main" java.lang.StackOverflowError)。但是,如果我沒有在構造函數之後創建對象d,程序將成功運行。嵌套類,內部類

public class OuterTwo { 
    public OuterTwo() { 
     System.out.println("OUTER!"); 
    } 

    OuterTwo d = new OuterTwo(); 

    public static void main(String[] args) { 
     OuterTwo f = new OuterTwo();   
    } 
} 
+0

我也將是一個源感激一個良好的書面與有關JAVA嵌套類說明教程。 – Insanovation 2014-10-09 13:13:51

+2

我在這裏沒有看到任何嵌套類 – talex 2014-10-09 13:18:04

回答

5

因爲你的類被定義爲具有該領域,

OuterTwo d = new OuterTwo(); 

即相當於

OuterTwo d; 
public OuterTwo() { 
    d = new OuterTwo(); // <-- this is infinite recursion. 
    System.out.println("OUTER!"); 
} 
2

您的代碼就相當於

public class OuterTwo { 
     public OuterTwo() { 
      d =new OuterTwo(); 
      System.out.println("OUTER!"); 
     } 
     OuterTwo d; 
     public static void main(String[] args) { 
      OuterTwo f = new OuterTwo();   
     } 
    } 

這是導致無限的cursion。

+2

這是一個無限的_recursion_。 – BackSlash 2014-10-09 13:27:40

+0

是............. – 2014-10-09 13:28:17

0

您會遇到堆棧溢出。這是可以理解的。 您的OuterTwo類實例化OuterTwo類型的成員。 你有一個無限的構造函數調用來創建OuterTwo對象,該對象持有對OuterTwo對象的引用,on和on..all再次。

1

你在這裏犯了一個小錯誤。使用這樣的東西。

public class OuterTwo { 

    OuterTwo d; 

    public OuterTwo() { 
      d =new OuterTwo(); 
      System.out.println("OUTER!"); 
    } 

    public static void main(String[] args) { 
      OuterTwo f = new OuterTwo();   
    } 
} 

爲了更好地理解InnerNested類遵循這些鏈接。

Inner classNested class