在 java 中实现接口方法是否被覆盖

Implementing a method of interface is overriding or not in java

我知道这可能很疯狂,但今天我的一位朋友困惑地问,当我们在 java 中实现一个接口时,它是否被视为方法重写。我告诉他这不是覆盖,因为我们在实现任何接口时第一次提供方法的工作(定义)。支持多重继承 java 提供接口,他不服气,还在争论。请阐明这个话题。

术语 "overriding" 适用于存在该方法的现有实现的情况。接口和其他抽象声明的正确术语是 "implementing"。

@Override 标签用于两种情况 - 它在以下情况下使用:

The method does override or implement a method declared in a supertype. --javadocs

并且来自 Wikipedia

Method overriding, in object oriented programming, is a language feature that allows a subclass or child class to provide a specific implementation of a method that is already provided by one of its superclasses or parent classes.

请注意,接口可以有 default methods - 重新定义这些方法 覆盖 它们:

When you extend an interface that contains a default method, you can ... redefine the default method, which overrides it.

除了链接到 "canonical" 来源之外,我不确定要提供什么建议来赢得与您朋友的语义争论。也许你可以问他 "implementing" 和 "overriding" 之间的区别是什么,以及他会用什么词代替 "overriding" 来表示重新定义现有方法的概念。

乍一看,接口只是定义API。由于没有要覆盖的超级方法,因此实现是第一个方法。

但是从 Java 5 开始,习惯上添加 @Override 注释,即使是来自接口的方法也是如此。这里的主要原因是为了捕获人们更改接口时发生的问题:现在你有一个方法 "dangling" - 没有 API 表示该方法必须存在。如果您从接口中删除一个方法,注释会导致错误,捕获它以便您可以正确清理所有代码。

但这仍然不意味着实现方法会覆盖任何内容。

除了接口是非常抽象的 class,在字节码中有抽象方法。抽象方法确实会覆盖。

我的感觉是你可以用两种方式争论,但争论是没有实际意义的,除非你有一个用例,问题的答案实际上对代码有真正的影响。在这里,这并不重要,因为编译器隐藏了所有丑陋的细节。