Java随笔 - Java 8特性之接口中的default方法和其他类、接口定义方法冲突

722 字
4 分钟
Java随笔 - Java 8特性之接口中的default方法和其他类、接口定义方法冲突

Java 1.8 引入一个新的特性. 接口中定义的方法可以使用 default 关键字提供默认的缺省实现.

这项新特性很便捷的帮助开发者在不修改接口的实现类的前提下,达到扩展功能的目的。可以说是非常的方便。但是这项特性带来便利的同时, 也带来了一些困惑。本文章记录笔者通过实例逐步学习这项变动的过程。

目录#

  1. Q1. Java 8 之前继承多个接口. 且父接口中定义的方法有冲突
  2. Q2: Java 8 之后继承多个接口. 且父接口中定义的方法有冲突
  3. Q3. 继承类和实现接口共存的情况
  4. 总结

Q1. Java 8 之前继承多个接口. 且父接口中定义的方法有冲突#

类结构如下图:

类结构图

示例代码:

public interface A {
void print(String str);
}
public interface B {
void print(String str);
}
public interface C extends A, B {
}

上述代码能编译通过。对 C 接口来讲. 父接口中定义的方法都没有具体的逻辑实现, 仅有一个定义。所以不会引起编译冲突. 子类必须实现接口定义的方法.

Q2: Java 8 之后继承多个接口. 且父接口中定义的方法有冲突#

而 Java 8 之后,接口中定义了冲突的方法,且有 default 实现时:

public interface A {
default void print(String str) {
System.out.println("A");
}
}
public interface B {
default void print(String str) {
System.out.println("B");
}
}
public interface C extends A, B {
/**
* <strong>必须重写父类的方法. 否则编译报错</strong>
*/
@Override
default void print(String str) {
// ...do something
}
}

结论: 当接口 A 和接口 B 任意一个有 default 实现时. 接口 C 必须 Override 接口中的冲突的方法.

可以通过 A.super.print(str)B.super.print(str) 来分别指定要继承的默认实现. 示例:C 的 print 方法的 default 实现。先执行 A 再执行 B

public interface C extends A, B {
/**
* <strong>必须重写父类的方法</strong>
*/
@Override
default void print(String str) {
A.super.print(str);
B.super.print(str);
}
}

Q3. 继承类和实现接口共存的情况#

类结构如下图:

类结构图
public class A {
public void print(String str) {
System.out.println("A");
}
}
public interface B {
default void print(String str) {
System.out.println("B");
}
}
public class C extends A implements B {
}
// => 编译成功。输出“A”

结论: 当父类中定义的方法和接口中定义的 default 实现冲突时。隐式的采用类中的方法.

总结#

  1. 当父类或接口中的定义的方法实现有冲突时, 子类必须覆写父中的方法. 或者把类定义为 abstract
  2. 当子类继承父类, 实现父接口的情况时。隐式的继承父类中的方法.
  3. 类中定义的方法实现,优先级高于接口中 default 实现

End

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
Java随笔 - Java 8特性之接口中的default方法和其他类、接口定义方法冲突
https://tinyzzh.github.io/posts/2019-09-30-java_class_implements_multiple_interfaces/
作者
TinyZ Zzh
发布于
2019-09-30
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
TinyZ Zzh
专注于高并发服务器、网络游戏相关(Java、PHP、Unity3D、Unreal Engine等)技术,热爱游戏事业, 正在努力实现自我价值当中。
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
211
分类
38
标签
200
总字数
337,853
运行时长
0
最后活动
0 天前

文章目录