Java中接口的默认方法(Java 8新特性)

Java中接口的默认方法(Java 8新特性)

1 Java中的修饰符

​ Java中的修饰符有public,private,protected和default四种,它们四种的区别如下表:

作用域当前类同一包内子类其他包
public
private
protected
default

​ 作用域从大到小依次是:public,protected,default,private

2 接口中的默认方法

​ Java 8中新增了接口的默认方法,新增后接口中就可以有实现方法,而不需要实现类去实现其方法。在之前的接口中,如果新增方法后,其实现类则必须重写每个方法,这样带来的问题是改变接口后所有实现类也必须改变。

​ 定义默认方法只需要用default修饰符标记一下即可:

public interface Comparable<T> {
	default int compareTo(T other) { return 0; }
}

3 用处

​ 默认方法的一个重要用法就是“接口演化”,比如,Collection接口已经作为Java的一部分有很多年了,假设你很早前就创建过一个类:public class Bag implements Collection,而在Java 8中这个接口又增加了一个stream方法。如果此时stream方法不是默认方法,那么Bag类将不能编译,因为它没有实现这个新方法。即为接口增加一个非默认方法不能保证“源代码兼容”。

可能的疑问?

​ 这时候很多人会想,接口中新增了默认方法后,编译是通过了,但我还能在我的类中调用新增的方法吗?同样以Collection接口为例,如果没有重新编译而直接加载这个类,并且在Bag实例上调用stream方法,这时候会调用Collection.stream方法。

4 带来的问题以及Java的解决方案

​ 思考这样一个场景:如果先在一个接口中将一个方法定义为默认方法,然后又在超类或另一个接口中定义同样的方法,会发生什么情况?Java中对这种情况有如下的规则:

    1. 超类优先:如果超类提供了一个具体方法,同名而且有相同参数类型的默认方法会被忽略。
    1. 接口冲突:如果一个接口提供了一个默认方法,另一个接口提供了一个同名而且参数类型(不论是否是默认参数)相同的方法,必须覆盖这个方法来解决冲突。(在实现类中覆盖指定要调用的方法。)
    1. 类优先原则:如果一个类扩展了一个超类,同时实现了一个接口,并且从超类和接口继承了相同的方法。这时只会考虑超类方法,接口中的默认方法会被忽略。这就是类优先原则。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值