1、默认方法的定义和作用

在Java8以前的版本中,由接口定义的方法是抽象的,不包括方法体。JDK8版本的发布改变了这一点,其中给接口添加了一个新的功能:默认方法。默认方法允许为接口方法定义默认实现。也就是说,通过使用默认方法,现在可以为接口方法提供方法体,使其不再是抽象方法

默认方法的主要作用是,在不破坏现有代码的情况下,提供一种扩展接口的方式。回想一下,由接口定义的所有方法必须有实现。在过去,如果添加一个新方法到一个活跃的、广泛使用的接口,就会破坏现有的代码,因为该方法没有具体的实现,而现在默认方法解决了该问题。因此,默认方法的出现不会破坏现有的代码。
默认方法的另一个作用是让接口中定义的方法,变成是可选的。以前的时候,即使接口的方法不需要,实现类也得有一个空的实现。
interface InterfaceA {
default void say() {
System.out.println("InterfaceA");
}
}
public class DefaultMethod implements InterfaceA{
public static void main(String[] args) {
new DefaultMethod().say();
}
}
需要注意:默认方法仅适用于专用功能。接口仍主要用于指定要做什么,而并不说明如何去做。接口仍然不能通过自身来创建实例,而必须由类来实现。不过,包含默认方法可以带来更多的灵活性
总之,默认方法主要有以下两大优点:
在不破坏现有代码的情况下,能够合理地增强接口的功能。
在无需类提供占位符实现的情况下,提供了一种可选的功能

2、默认方法的多继承问题

第一种情况:InterfaceA和InterfaceB两个并行接口,DefaultMethod同时实现InterfaceA和InterfaceB接口,则DefaultMethod必须重定义默认方法才可以使用

public interface InterfaceA {
default void say() {
System.out.println("InterfaceA");
}
} public interface InterfaceB {
default void say() {
System.out.println("InterfaceB");
}
} public class DefaultMethod implements InterfaceA, InterfaceB {
public static void main(String[] args) {
DefaultMethod dm = new DefaultMethod();
dm.say();
} @Override
public void say() {
}
}

第二种情况:两个非并行接口,InterfaceB继承InterfaceA,则默认方法将会使用InterfaceB类的默认方法。

public interface InterfaceA {
default void say() {
System.out.println("InterfaceA");
}
} public interface InterfaceB extends InterfaceA {
default void say() {
System.out.println("InterfaceB");
}
} public class DefaultMethod implements InterfaceB {
public static void main(String[] args) {
DefaultMethod dm = new DefaultMethod();
dm.say();
}
}
如果使用InterfaceA的默认方法,DefaultMethod只能重定义默认方法。
@Override
public void say(){
InterfaceA.super.say();
}

3、在接口中使用静态方法

JDK 8还向接口添加了另一个新功能:定义一个或多个static方法的能力。与类中的static方法一样,接口定义的static方法可以由任何对象单独调用。因此,要调用static方法,接口的实现不是必需的,接口的实例也不是必需的。但对static方法的调用是通过指定接口名称,后跟一个句点和方法名称来实现的。调用static 方法的一般形式如下:

InterfaceName.staticMethodName
注意,这种调用方式与调用类中static 方法的方式类似。

最新文章

  1. 使用#锚点时,jsp中不能有basePath
  2. mac下开发IOS代码管理
  3. Combination Lock
  4. paip.函数式编程方法概述以及总结
  5. 160926、Java-SpringMVC统一异常处理
  6. jquery on off 方法
  7. EXPDP IMPDP 知识总结
  8. Sqlserver 正则替换函数的一种实现
  9. Zend Studio 10.6.0汉化教程(图文)
  10. Codeforces Round #354 (Div. 2)_Vasya and String(尺取法)
  11. 如何通过注解Bean类来封装SQL插入语句
  12. QtCreator pro中相对路径和debug文件夹下未放动态库时调试报QtCreator:during startup program exited with code 0xc0000135错误
  13. body中的onload()函数和jQuery中的document.ready()有什么区别?
  14. Vsftpd完全攻略(三)基于系统用户支持ftp上传 访问和vsftp安全设置
  15. How to check Logstash's pulse
  16. CString与UTF8互转代码
  17. C++11标准的类型别名
  18. [leetcode]199. Binary Tree Right Side View二叉树右侧视角
  19. 都是用 DllImport?有没有考虑过自己写一个 extern 方法?
  20. Servlet传统配置方式和Servlet3.0使用注解的方式

热门文章

  1. 全球百大最有前景AI公司出炉,中国成独角兽最强诞生地
  2. (3) esp8266 官方库文件,没有求逆函数
  3. scylladb docker-compose 用户密码认证配置
  4. uni-app input text-indent失效解决
  5. 第12组 Alpha事后诸葛亮
  6. mysql 创建主键,修改主键
  7. mysql 分组和排序
  8. Java中定义不了可变长数组怎么办---集合 泛型
  9. kvm错误:failed to initialize KVM: Permission denied
  10. 273道题目;更新到java题目里面 (已迁移到其他类目下面,存储)