为什么实现方法不能有参数

时间:2015-11-08 18:51:26

标签: java

为此:

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一个方法,那么你就可以用它做你想做的事。

我认为我对抽象方法感到困惑。请问我哪里出错,什么会让我更清楚地理解事情?

4 个答案:

答案 0 :(得分:2)

在java方法中,签名由方法名称及其参数类型组成。这是方法重载的基础(相同的方法名称,但不同的参数类型)。

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

这是因为在运行时,JVM将查找名为run的方法,并且不接受任何参数。因为你只定义了一个名为" run"的方法。并且接受一个类型" SwingExample11"的参数,没有名称的方法"运行"没有参数。

答案 1 :(得分:1)

您无法在实施时更改方法签名。如果方法签名保持不变,您可以提供自己的方法实现。

答案 2 :(得分:1)

方法的签名由3部分组成,返回类型,方法名称,参数和throws子句。

从接口实现方法时,必须覆盖每个方法。这意味着方法签名必须匹配。在这里添加了一个额外的参数,

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

您的方法不再是您需要实现的方法,而是一种全新的方法。

编辑:感谢有关纠正我的评论

答案 3 :(得分:1)

想想继承的工作方式。如果从接口run实现Runnable方法,那么在接口上调用此run方法的任何人都应该执行您已实现的run方法。

因此,如果代码位于Runnable r = new SwingExample11()然后r.run(),则意味着在run类中执行SwingExample11方法,不带任何参数,但实际上是重写的方法期待一个参数 - 它应该是什么价值?

因此,签名必须完全相同,否则类型系统中的整个继承概念将会崩溃(特别是substitution principle)。