【问题标题】:Implementing a method of interface is overriding or not in java在java中实现接口的方法是否覆盖
【发布时间】:2015-04-29 00:07:40
【问题描述】:

我知道这可能很疯狂,但今天我的一位朋友疑惑地问,当我们在 java 中实现一个接口时,它是否被认为是方法覆盖。我告诉他这不是压倒一切的,因为我们在实现任何接口时第一次提供方法的工作(定义)。支持多继承java提供接口但他不服气,一直在争论。请为这个话题带来一些启示。

【问题讨论】:

  • 它没有被覆盖。在接口中,您声明方法的签名,而不是实现。覆盖是当您有多个方法时,接口是接口中声明的签名的实现。在 java 5 中,重写接口实现会导致编译错误。从 java 6 开始,它不再是错误了。
  • 这似乎更适合programmers 网站,因为它的概念多于实际。

标签: java interface polymorphism multiple-inheritance overriding


【解决方案1】:

“覆盖”一词适用于方法的现有实现。正确的术语是接口和其他抽象声明的“实现”。

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

该方法确实会覆盖或实现在超类型中声明的方法。 --javadocs

来自Wikipedia

方法覆盖,在面向对象的编程中,是一种语言功能,它允许子类或子类提供方法的特定实现已由其超类或父类之一提供

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

当你扩展一个包含默认方法的接口时,你可以……重新定义默认方法,它会覆盖它。

除了链接到“规范”来源之外,我不确定要提供什么建议来赢得与您朋友的语义争论。或许你可以问他,“实现”和“覆盖”有什么区别,他会用什么词代替“覆盖”来重新定义现有方法的概念。

【讨论】:

  • +1 表示接口中的默认方法。我不认为我会想要使用它们,但我不知道它们。
  • 我同意它们令人不安,但如果没有它们,您将无法向面向公众的接口添加新声明。
【解决方案2】:

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

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

但这并不意味着实现方法会覆盖任何东西。

除了接口在很大程度上是一个在字节码中具有抽象方法的抽象类。抽象方法确实会覆盖。

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

【讨论】:

  • 但是你不会因为你的实现类不再正确实现接口而“捕捉到人们改变接口时发生的问题”吗?
猜你喜欢
  • 2011-08-04
  • 1970-01-01
  • 2012-09-01
  • 2014-07-17
  • 2021-11-02
  • 2016-08-12
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
相关资源
最近更新 更多