接口小总结(四)

默认方法

可以为接口提供一个默认实现,使接口方法含有方法体(内容)。在方法前面加上default 关键字实现。

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

}

实现该接口的类,默认方法可以不用重写(不是抽象的)。不过大部分情况下,需要覆盖默认方法实现其他的功能。

默认方法可以调用其他方法。例如:

public interface Collection
{
int size();// an abstract method
default boolean isEmpty(){return size()==0;}
}

默认方法的一个重要用法是“接口演化”。

例如:

public class Bag implements Collection

在java 8后,Collection接口增加了一个stream 方法。

如果stream 方法不是默认方法,那么Bag无法编译(没实现stream方法)。

因此,使用默认方法可以使程序运行并调用Collection.stream方法。

解决默认方法的冲突

如果先在一个接口中定义了一个默认方法,然后在父类或另一个接口定义了同样方法(签名一样)。

会实现哪个方法?

1.超类优先。

public interface hello
{
default void hello(){System.out.println("hello");}
}
class person
{
  public void hello(){System.out.println("hello,world");}、、
}
class student extends person implements hello
{
}
父类优先,默认方法会被忽略。
//默认方法只存在接口中哦。😊

2.接口冲突

如果一个接口提供了默认方法,另一个接口提供了一个同名而且参数类型(不论是否是默认参数)相同的方法,必须覆盖这个方法来解决问题。

例如:

interface Person
{
default String getName(){return "";};
}
interface Named
{
default String getName(){return getClass().getName()+"-"+hashCode();}
}
class Student implements Person,Named{....}

之后java 编译器会报告一个错误,让程序员自己解决这个问题。可以选择一个方法,也可以自己重写一个。

拓展:假如Named接口没有为getName方法提供默认实现。Student类会从Person接口继承默认方法吗?

答案:不会。如果至少有一个接口提供了一个实现,编译器就会报告错误,程序员就必须解决这个二义性。

//好吧今天到这,goodgoodbye!😃

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值