java8-默认方法

默认方法


  • 接口本应该是一种约定,不提供实现。但是如果一旦想在接口上增加新的方法,所有的实现类都需要调整。引入默认方法就是为了避免这种情况,向前兼容
  • 把默认方法作为库、框架向前兼容的手段(java8中新增了lambda表达式,使用default方法来进行向前兼容)
  • 继承有三种情况
    • 继承后重写方法
    • 继承后不重写方法
    • 继承后将默认方法重新声明为抽象方法
      参考:

为什么有默认方法、继承有三种:https://blog.csdn.net/u010003835/article/details/76850242
概述:http://www.runoob.com/java/java8-default-methods.html

多继承的冲突

  • 两个default方法如果不存在关系(重写和被重写的关系),则要手动自己解决。
interface Inter1 {
    default void print(){
        System.out.println("interface Inter1");
    }
}
interface Inter4 extends Inter1 {
    @Override
    default void print() {
        System.out.println("interface Inter4");
    }
}
interface Inter2 {
    default void print(){
        System.out.println("interface Inter2");
    }
}
class UseInter4Inter2 implements Inter4,Inter2{
    @Override
    public void print() {
        System.out.println("class UseInter4Inter2");
        Inter4.super.print();
    }
}
  • 继承的两个接口之间存在关系,调用“更加详细的方法”
/*
* Inter1-》Inter4(重写default方法)-》UseInter4Inter1
* Inter1-》UseInter4Inter1
* 调用的Inter4中的函数,Inter1和Inter4中的方法存在重写和被重写的关系,这种情况下自动用Inter4中的print()(“更加详细的方法”)
* */
interface Inter1 {
    default void print(){
        System.out.println("interface Inter1");
    }
}
interface Inter4 extends Inter1 {
    @Override
    default void print() {
        System.out.println("interface Inter4");
    }
}
class UseInter4Inter1 implements Inter4,Inter1{
}
  • 菱形问题,继承的两个接口都继承了同一个接口,然后都重写了默认方法。这时两个接口中的默认方法是没有关系的,需要手动解决
/*菱形问题
* Inter1->UseInter11(重写default方法)->UseUseInter11UseInter12
* Inter1->UseInter12(重写default方法)->UseUseInter11UseInter12
* 需要手动解决冲突
* */
interface Inter1 {
    default void print(){
        System.out.println("interface Inter1");
    }
}
interface UseInter11 extends Inter1{
    @Override
    default void print() {
        System.out.println("interface UseInter11");
    }
}
interface UseInter12 extends Inter1{
    @Override
    default void print() {
        System.out.println("interface UseInter12");
    }
}
class UseUseInter11UseInter12 implements UseInter11,UseInter12{

    @Override
    public void print() {
        System.out.println("class UseUseInter11UseInter12");
    }
}
  • 菱形问题的第二种,继承的两个接口都继承了同一个接口,然后其中一个重写了默认方法。此时认为两个默认方法存在关系,用重写后”更详细”的那个
/*菱形问题
 * Inter1->UseInter13(重写default方法)->UseUseInter13UseInter14
 * Inter1->UseInter14->UseUseInter13UseInter14
 * 调用UseInter13中的default方法
 * */
interface Inter1 {
    default void print(){
        System.out.println("interface Inter1");
    }
}
interface UseInter13 extends Inter1{
    @Override
    default void print() {
        System.out.println("interface UseInter13");
    }
}
interface UseInter14 extends Inter1{
}
class UseUseInter13UseInter14 implements UseInter13,UseInter14{
}

猜你喜欢

转载自blog.csdn.net/designer01/article/details/81672495