2015-11-08 58 views
0

對於這一點:爲什麼不能在實現方法有一個參數

import java.awt.EventQueue; 
import javax.swing.JFrame; 

public class SwingExample11 extends JFrame implements Runnable { 
    public SwingExample11() { 
     initUI(); 
    } 
    private void initUI() { 
     setTitle("SwingExample1"); 
     setSize(300, 200); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 
    @Override 
    public void run(SwingExample11 ex) { 
     ex.setVisible(true); 
    } 
    public static void main(String[] argv) { 
     SwingExample11 ex = new SwingExample11(); 
     EventQueue.invokeLater(ex); 
    } 
} 

我得到:

6: error: SwingExample11 is not abstract and does not override abstract method run() in Runnable 
public class SwingExample11 extends JFrame implements Runnable { 
^ 
16: error: method does not override or implement a method from a supertype 
@Override 
^ 

當我刪除了參數,並從run()代碼塊彙編,但顯然沒有按什麼都不做。

當我實現一個接口時,我想我可以編寫該方法,但是我想要嗎?這是因爲它的抽象方法嗎?我認爲所有的接口方法默認都是抽象的,無論如何,我認爲如果你使用一種方法,那麼你可以用它來做你想做的事情。

我想我對抽象方法感到困惑。請問我哪裏錯了,什麼讓我更清楚地理解事情?

+5

「我想我可以編寫這個方法,但是我想要」 - 這個假設是不正確的。我不知道還有什麼要說的...... –

+3

因爲如果你爲方法添加一個參數,你改變了它的簽名,你不再覆蓋該方法,你正在添加一個不同的方法。 – bhspencer

+2

除了根本的誤解是如何抽象方法的工作,這似乎是一個XY問題,那麼你爲什麼不回過頭來告訴你,你該怎麼做? – fge

回答

1

的思維方式繼承工作的意見。如果您從接口Runnable實施run方法,則任何在接口上調用此運行方法的人都應該執行您實施的運行方法。

所以,如果有某個地方的代碼和Runnable r = new SwingExample11()然後r.run()這意味着在你的SwingExample11類執行run方法,不帶任何參數,但你重寫的方法實際上需要一個參數 - 應該是什麼它的價值呢?

因爲這個簽名必須完全相同,否則類型系統中的整個繼承概念將崩潰(特別是substitution principle)。

+0

你創建的類型的參考變量'Runnable'(這是一個接口)。然後是一個SwingExample11對象。然後將該對象分配給參考。我不知道你可以將對象分配給不是他們的類的引用。例如'SwingExample11 ex = new SwingExample11()'。什麼是'r'? – jdurston

+0

這是面向對象編程的基本概念之一。我會建議閱讀一本書或一個教程。 –

+0

'Runnable r = new SwingExample11()'。 '新的SwingExample11()'告訴Java使用'SwingExample11()'藍圖創建一個新對象。 Java創建一個對這個新對象的引用,稱爲'r',你可以使用它來訪問這個新對象。有什麼具有'Runnable'這個詞在那行?這意味着'r'的類型是'Runnable'。例如它是一個遙控器,它有按鈕來控制實現了'Runnable'接口的東西嗎? – jdurston

2

在java方法中,簽名由方法名和它的參數類型組成。這是方法重載的基礎(相同的方法名稱,但是不同的參數類型)。

run(void)與run(SwingExample11)不一樣。

這是因爲在運行時,JVM將查找名稱爲run且不帶參數的方法。由於您只定義了一個名爲「run」的方法,並且接受了一個類型爲「SwingExample11」的參數,因此沒有名稱爲「run」的方法不帶任何參數。

1

您不能在實現時更改方法簽名。您可以提供您自己的該方法的實現,但方法簽名保持不變。

+0

OK,但你可以在這種情況下添加/更改方法體,對不對? – jdurston

+0

是的,你確定你可以改變身體。 –

1

方法的簽名由3部分組成,返回類型,方法名稱,參數和throws子句。

當您從接口實現方法時,您必須覆蓋每個方法。這意味着方法簽名必須匹配。這裏當你添加一個額外的參數時,你的方法不再是你需要實現的方法,而是一種全新的方法。

編輯:感謝指正

+1

同樣重要的是要提到「匹配」比僅僅完全相同稍微複雜一些。另一件事:拋出的異常也必須匹配。 – biziclop

+0

技術上,4份 - 的'throws'子句是第四 –

相關問題