Java 为什么可以';实现方法没有参数吗

Java 为什么可以';实现方法没有参数吗,java,Java,为此: import java.awt.EventQueue; import javax.swing.JFrame; public class SwingExample11 extends JFrame implements Runnable { public SwingExample11() { initUI(); } private void initUI() { setTitle("SwingExample1");

为此:

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()
中删除参数和代码块时,它会编译,但显然不会做任何事情


当我实现一个接口时,我认为我可以按照自己的意愿编写这个方法?是因为它是一种抽象的方法吗?我认为默认情况下所有接口方法都是抽象的,而且无论如何,我认为如果你覆盖一个方法,那么你可以用它做你想做的事情


我想我被抽象的方法弄糊涂了。请问我哪里出错了,什么能让我更清楚地理解事情呢?

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

运行(void)与运行(SwingExample11)不同


这是因为在运行时JVM将查找名为run且不带参数的方法。由于您只定义了一个名为“run”的方法,并使用了一个类型为“SwingExample11”的参数,因此没有一个名为“run”的方法不使用参数。

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

运行(void)与运行(SwingExample11)不同


这是因为在运行时JVM将查找名为run且不带参数的方法。由于您只定义了一个名为“run”的方法,并接受了一个类型为“SwingExample11”的参数,因此没有名为“run”的方法不带参数。

实现时不能更改方法签名。如果方法签名保持不变,则可以提供该方法的自己的实现。

实现时不能更改方法签名。如果方法签名保持不变,则可以提供该方法的自己实现完整。

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

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

@Override
public void run(SwingExample11 ex) {
    ex.setVisible(true);
}  
您的方法不再是您需要实现的方法,而是一种全新的方法


编辑:多亏了更正我的注释,方法的签名由3部分组成,返回类型、方法名称、参数和抛出子句

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

@Override
public void run(SwingExample11 ex) {
    ex.setVisible(true);
}  
您的方法不再是您需要实现的方法,而是一种全新的方法


编辑:感谢您对我的批改意见

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


因此,如果某个地方有代码
Runnable r=new SwingExample11()
,然后
r.run()
这意味着在
SwingExample11
类中执行
run
方法,不带任何参数,但重写的方法实际上需要一个参数-它的值应该是什么


由于这一点,签名必须完全相同,否则类型系统中的整个继承概念将崩溃(特别是)。如果从接口
Runnable
实现
run
方法,则在接口本身上调用此run方法的任何人都应执行您实现的run方法


因此,如果某个地方有代码
Runnable r=new SwingExample11()
,然后
r.run()
这意味着在
SwingExample11
类中执行
run
方法,不带任何参数,但重写的方法实际上需要一个参数-它的值应该是什么


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

“我想我可以按照自己的意愿编写方法”——这种假设是不正确的。我不知道还有什么要说的…因为如果你给方法添加一个参数,你就改变了它的签名,你不再重写这个方法,你就是在添加一个不同的方法。除了对抽象方法如何工作的基本误解之外,这似乎是一个XY问题,那你为什么不退一步告诉我你到底想做什么呢?你不能改变方法签名。。。但是,您可以让setter设置一个属性并使用它“我以为我可以按照自己的意愿编写方法”——这种假设是不正确的。我不知道还有什么要说的…因为如果你给方法添加一个参数,你就改变了它的签名,你不再重写这个方法,你就是在添加一个不同的方法。除了对抽象方法如何工作的基本误解之外,这似乎是一个XY问题,那你为什么不退一步告诉我你到底想做什么呢?你不能改变方法签名。。。不过,您可以让setter设置属性并使用itOK,但在这种情况下您可以添加/更改方法体,对吗?好的,但在这种情况下您可以添加/更改方法体,对吗?同样重要的是,要提到“匹配”比完全相同稍微复杂一些。还有一件事:抛出的异常也必须匹配。从技术上讲,4个部分——
throws
子句非常重要,值得一提的是,“匹配”比完全相同稍微复杂一些。还有一件事:抛出的异常也必须匹配。从技术上讲,4个部分——
throws
子句是您创建的类型为
Runnable
的引用变量(这是一个接口)。然后a
Swin