繁体   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