簡體   English   中英

為什么執行方法不能有參數

[英]Why can't an implementing method have an argument

為了這:

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()刪除參數和代碼塊時,它會編譯,但顯然不執行任何操作。

當我實現一個接口時,我以為我可以編寫我想要的方法? 是因為它是一種抽象方法嗎? 我認為默認情況下所有接口方法都是抽象的,無論如何,我想如果您@Override一個方法,那么您可以使用它來做您想做的事情。

我認為我對抽象方法感到困惑。 請問我在哪里錯了,什么會使我更清楚地了解事情?

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

run(void)與run(SwingExample11)不同。

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

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

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

從接口實現方法時,必須覆蓋每個方法。 這意味着方法簽名必須匹配。 在這里,當您添加額外的參數時,

@Override
public void run(SwingExample11 ex) {
    ex.setVisible(true);
}  

您的方法不再是您需要實現的方法,而是一種全新的方法。

編輯:感謝糾正我的意見

想一想繼承的工作方式。 如果從Runnable接口實現run方法,則在接口本身上調用此run方法的任何人都應執行您已實現的run方法。

因此,如果在某處有代碼Runnable r = new SwingExample11() ,然后是r.run()這意味着可以在SwingExample11類中執行不帶任何參數的run方法,但是您覆蓋的方法實際上需要一個參數-它應該是什么值?

因此,簽名必須完全相同,否則類型系統中的整個繼承概念都會崩潰(特別是替代原理 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM