2012-02-03 77 views
1

下面給出的代碼顯示了運行時出現Stackoverflow錯誤。但如果我讓另一個類CarChange創建Car的對象,它會成功運行。我是一個初學者,通過這個代碼來了解java中向上註解的重要性。Stackoverflow錯誤

public class Car { 

    int i; 
    Car[] c=new Car[2]; 

    Car() { 
     c[0] = new Polo(); 
     i=0; 
    } 



    void drive(){ 
     c[i].testdrive(); //the overloaded method in subclasses polo and swift 
    } 

    void change() { 
     if(i==0) { 
      i++; 
      c[i] = new Swift(); 
     } 
    } 

    public void testdrive() { 
     //overloaded method in subclasses polo and swift 
     System.out.println(" test drive car"); 
    } 



//class Tester { 
    //main 
    Car c= new Car(); 
    c.drive(); 
    c.change(); 
    c.drive(); 
+3

使用我的ESP我會猜測'Polo'是Car的一個子類,它遞歸地調用Car的構造函數 – 2012-02-03 06:51:02

+5

http://en.wikipedia.org/wiki/Indent_style – 2012-02-03 06:51:27

+3

爲了更好儘快提供幫助,發佈[SSCCE](http://sscce.org/)。請使用一致且合乎邏輯的縮進代碼塊形式。 – 2012-02-03 06:52:53

回答

2

stackoverflow通常意味着你有一個無限循環。

您收到此消息的原因是您從testdrive方法調用驅動器,並在該方法中再次調用驅動器。

+0

我已編輯它,我很抱歉代碼不清楚,但testdrive()不調用驅動器()在其方法體 - – coderaider 2012-02-03 07:23:26

+0

有任何錯誤關於在類中創建類的對象(主要方法之外),我以前沒有看到過這樣的例子,是否合法......事先感謝 – coderaider 2012-02-03 07:34:29

+0

我認爲Brian Roach有你正在尋找的答案對於:Polo是你的Car的子類,默認的構造函數將再次創建一個Polo的新實例。(因爲它每次創建一個新實例時都會調用Car的構造函數) – 2012-02-03 07:38:38

2

這聽起來像你可能會發生一些無限遞歸。

drive()調用testdrive()class drive()這就要求testdriver() ...永遠,或者直到你耗盡內存,因此您的堆棧溢出錯誤。

+0

我編輯了它,我很抱歉代碼不清楚,但testdrive()不調用驅動器()在其方法體 – coderaider 2012-02-03 07:22:14

+0

有任何錯誤與創建一個類的對象在類本身(主要方法之外),我沒有看過這樣的例子之前,是否合法......提前感謝 – coderaider 2012-02-03 07:34:10

4
Car() { 
    c[0] = new Polo(); 
    i=0; 
} 

作爲馬球是汽車()的子類 - 它必須以適合車[] - 它將調用汽車的構造被構造本身時。 汽車構造函數嘗試創建一個新的Polo()

作爲馬球是汽車()的子類 - 它必須以適合車[] - 它將調用汽車的構造被構造本身時。 汽車構造函數嘗試創建一個新的Polo()

作爲馬球是汽車()的子類 - 它必須以適合車[] - 它將調用汽車的構造被構造本身時。 汽車構造函數嘗試創建一個新的Polo()

...你得到的照片?

+0

是的,謝謝你詳細解釋它 – coderaider 2012-02-03 08:31:31