Java8 新特性——默认方法

默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。

我们只需在方法名前面加个 default 关键字即可实现默认方法。

添加的默认方法,其所有的子类都默认继承,而无需重写。

为什么要有默认方法

在 java 8 之前,接口与其实现类之间的 耦合度 太高了,当需要为一个接口添加方法时,所有的实现类都必须随之修改。默认方法解决了这个问题,它可以为接口添加新的方法,而不会破坏已有的接口的实现。这在 lambda 表达式作为 java 8 语言的重要特性而出现之际,为升级旧接口且保持向后兼容提供了途径。

使用默认方法的好处:

  • 定义静态默认方法:在接口中定义静态默认方法,使得其所有继承接口的子类都可以调用这些静态方法,这样可以在接口中集中静态方法,其子类都可以分享,而无需将静态方法分开定义。
  • 提供兼容性,如果已经发布的接口想要添加新的方法,只需要添加默认方法即可,子类无需做出任何改变。

 默认方法语法格式:

public interface Vehicle {
   default void print(){
      System.out.println("我是一辆车!");
   }
}

默认方法继承发生冲突如何解决

接口默认方法可以被继承,如果一个类实现了多个接口,且这些接口中有命名相同的默认方法,此时就会产生冲突。

public interface Vehicle {
   default void print(){
      System.out.println("我是一辆车!");
   }
}
 
public interface FourWheeler {
   default void print(){
      System.out.println("我是一辆四轮车!");
   }
}

解决方法有两个:

1、子类重写默认方法覆盖接口的默认方法;

2、使用 super 来调用指定接口的默认方法

//1、重写覆盖
public class Car implements Vehicle, FourWheeler {
   default void print(){
      System.out.println("我是一辆四轮汽车!");
   }
}
//2、精确调用
public class Car implements Vehicle, FourWheeler {
   public void print(){
      Vehicle.super.print();
   }
}

 静态默认方法

java8支持接口中定义静态方法(需要提供默认实现),写法上将默认方法的default关键字换成static关键字即可。 

public interface Vehicle {
   default void print(){
      System.out.println("我是一辆车!");
   }
    // 静态方法
   static void blowHorn(){
      System.out.println("按喇叭!!!");
   }
}

注意点

  • default 关键字只能在接口中使用(以及用在 switch 语句的 default 分支),不能用在抽象类中。

  • 接口默认方法不能覆写 Object 类的 equalshashCode 和 toString 方法。

  • 接口中的静态方法必须是 public 的,public 修饰符可以省略,static 修饰符不能省略。

  • 即使使用了 java 8 的环境,一些 IDE 仍然可能在一些代码的实时编译提示时出现异常的提示(例如无法发现 java 8 的语法错误),因此不要过度依赖 IDE。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值