首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >接口可以包含有实现的方法吗?

接口可以包含有实现的方法吗?
EN

Stack Overflow用户
提问于 2022-09-10 21:19:27
回答 2查看 57关注 0票数 0

Oracle说:“抽象类类似于接口。不能实例化它们,它们可能包含有或没有实现声明的方法组合。但是,使用抽象类,您可以声明非静态和最终的字段,并定义公共、受保护和私有的具体方法.”

我认为接口只能包含抽象方法,而抽象方法在定义上没有实现。那么,为什么Java文档说抽象类类似于接口,因为它们可能包含有或没有实现声明的方法的组合?

链接到文档

EN

回答 2

Stack Overflow用户

发布于 2022-09-10 21:42:44

因为

我认为接口只能包含抽象方法和抽象方法。

是不正确的。或者说,它在Java1.7之前是正确的,并且从那时起一直是不正确的,因为java8引入了方法机制。换句话说,在这一点上,大约15年来一直是不正确的。

这是合法的java,现在:

代码语言:javascript
运行
复制
interface Map<K, V> {
  public V get(Object key);
  public boolean containsKey(Object key);

  public default V getOrDefault(Object key, V defaultValue) {
    return containsKey(key) ? get(key) : defaultValue;
  }
}

default方法进一步模糊了抽象类和接口之间的界限。任何实现都可以覆盖它们,如果需要的话。关于他们的几条规则:

  • 这些没有等级制度。如果您定义了一个类,该类以多个接口结束,而这会导致为同一方法继承多个这样的“默认实现”,则implements编译器将拒绝编译该,唯一的出路是显式定义该方法。如果你愿意的话,你可以用InterfaceName.super.methodName(params);来指代你想要的任何激励。这“解决”了这个“钻石问题”。换句话说,将接口类型放在implements子句中的顺序仍然无关紧要。
  • 接口仍然不能声明字段(或者更确切地说,它们变成常量-隐式public static final)。
  • 它们的目的是在版本更新中添加实用程序方法,这些方法构建在现有方法之上,例如getOrDefault (其中的实际存在),并且从java 8开始就这样做了。通常,它们并不是真正的“意思”来扩展接口所代表的内容,因为您不能挥舞魔杖,让实现者从任何地方扩展实现。在很少的情况下,您可以完全基于不涉及任何字段的默认行为来扩展接口所代表的内容。在这种情况下,您也可以使用default机制。
  • default关键字是必需的。
  • 同样的更新还包括了将static方法插入其中的能力,这很不错。
  • 现在还可以编写private方法。此功能只允许您为default方法编写助手方法。
票数 3
EN

Stack Overflow用户

发布于 2022-09-10 21:42:55

默认方法是将实现放在接口中的一种方法。

但是要注意:在Java中添加了默认方法,以解决添加对兰巴斯的支持而又不破坏Java著名的向后兼容性的问题。

通常,添加默认方法应该是最后的选择,而不是您的第一个选择。

通常最好将接口视为(严格地说是 合同 ),这是一个单独的类来实现特定行为的承诺。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73675218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档