2014-09-23 118 views
1

對於可憐的頭銜,我很抱歉,但我不確定我的問題是什麼。 (如果可以的話,請讓我知道答案)我有兩個課程,我正在嘗試與之交流。 'Setup'類具有我在'Begin'類中需要的變量,反之亦然。我試圖在「開始」類的繼承類的「設置」這樣做:當我參考兩個類時,出現StackOverflow錯誤。爲什麼?

public class Begin extends Setup { 

一些需要注意的,我引用了「開始」級的「設置」類以這種方式:

Begin b = new Begin(); 

我也嘗試在每個相應的類中引用'Setup'和'Begin'類。這沒有幫助。我在兩個類中都收到了'java.lang.StackOverflowError'錯誤。我在參考其他課程的時候遇到了錯誤。 ('開始'中的錯誤:'Setup s = new Setup();''Setup'中的錯誤:'Begin b = new Begin();')

我不知道爲什麼我得到這個錯誤,而且我不知道「正確引用」類是什麼。如果這是重複的,我很抱歉。如果是,請將我鏈接到頁面。如果沒有,請讓我知道我能做些什麼來讓我的程序再次正常工作。本主題中提到的代碼和類只是示例。他們不是我正在使用的課程。我認爲這可能有助於指出我正在使用JFrame。我只將一個類擴展到JFrame,但兩個類都使用JFrame。我在該類中創建了一個新的JFrame,但它並不擴展JFrame。如果你無法給出你認爲會有幫助的答案,我會在我的兩堂課上貼上代碼。 在此先感謝! 〜Rane

編輯:謝謝你們!我很高興你能以我給出的例子來幫助我。再次感謝!

+2

向我們展示您的代碼? – 2014-09-23 21:03:32

+0

你得到這個,因爲你有一個無限遞歸。 – shinjw 2014-09-23 21:06:10

+0

沒有看到你的代碼,這隻能是瘋狂的猜測,但因爲你似乎使用基類內的子類,這聽起來很可能,你是通過兩種方法觸發無限遞歸循環彼此。 – 5gon12eder 2014-09-23 21:06:28

回答

4

你已經有了無限的遞歸。

  • 開始延伸設置,
  • 等開始的構造必須呼叫建立的構造函數,並初始化它的超級安裝屬性
  • 和設置內部另一創建開始實例
  • 將初始化另一個超級設置實例
  • 它創建另一開始實例
  • 將初始化另一個超級安裝實例
  • 它創建另一開始實例
  • 將初始化另一個超級安裝實例
  • 它創建另一開始實例
  • ...等等,直到你用完內存

不要這樣做。你需要改變你的程序的整個結構,因爲超級類不應該知道它的子類,更不用說它的實例了。我敢打賭,Begin不應該延伸安裝程序,這就是我要開始的地方。實際上,這種情況:

「安裝」類在我的類'開始'中需要變量,反之亦然。

不是通過繼承,而是通過構圖解決。例如...

public class Begin { 
    private Setup setup; 

    public void setSetup(Setup setup) { 
    this.setup = setup; 
    } 

也許

public class Setup { 
    private Begin begin; 

    public void setBegin(Begin begin) { 
    this.begin = begin; 
    } 

然後在別處:

Begin begin = new Begin(); 
Setup setup = new Setup(); 

begin.setSetup(setup); 
setup.setBegin(begin); 

有注入依賴的其他方式和細節將取決於你的需要,所以不要把它當作福音,除了不要爲此而使用繼承。

相關問題