Java 8 接口

内容来自java核心技术(第十版 卷一),和本人总结与思考。

一、接口概念

重点
1、接口不是类,而是对类的一组需求描述。描述了类要具有什么功能。(其他理解:接口是一种规范)
2、不能有实例域,不能有静态方法(java 1.8 以前),可以定义常量。
3、所有方法自动属于public ,域(属性)自动属于public static final
【温馨提示】 Java语言规范建议不要书写多余的关键字。即接口方法定义不要写public,域定义不要写public static final。


二、接口特性

1、不能实例化对象

new Map(); //error 接口不是类

2、可以声明变量

Map map =...; //right

2.1变量必须引用实现了接口的类

map = new HashMap(); //right 
map = new ArrayList(); //error

3、接口可以扩展,允许存在多条从具有高通用性的接口到高专用性的接口的链。

Collection:
           |--List:
                 |--ArrayList
                 |--LinkedList
           |--Set:
                 |--HashSet
                 |--HashMap           
java代码演示:
public interface People {
    void eat();
    }

public interface Student extends People {
    void study();
    }

三、java SE 8 接口新特性

1、静态方法。

虽然违反了接口作为抽象规范的初衷。

Collection接口我们比较熟悉,它还有一个伴随类Collections,用来写和Collection相关的使用工具方法。其他(接口和伴随类Path/Paths去),为了熟悉下Collections,于是有了以下鸡肋的代码,各位看官迁就下。

这里写图片描述

也就是说:以前和接口相关的实用工具方法不能写在接口里面,因为java SE 8 以前接口中不能有静态方法。只能提供一个伴随类,将和接口相关的实用工具方法写在这里面。
现在可以这样:

public interface Collection {
    public static void copy(dest,src) {
    .......
    }
    .....

到目前,我也没有体会到接口中写静态方法带来的好处。 唯一就是在别人说接口中不能写静态方法时,故作深深沉的来上一句,这要分情况来看,java SE 8 可以。 受不了了,说下一特性。

2、默认方法

为避免接下来引起混淆,先扫下盲区。
java 有四种访问权限:public,protected,缺省,private 。许多网文缺省位置写的default(少数firendly), 这样容易引起误解,让人把default当成一个和public一样的代表访问权限的关键字。default可以理解为缺省的一种叫法。

下面的defalut 是java SE 8 才有的只能用在接口中来修饰方法。

java代码
public interface DataBase { //定义数据库接口
    // 定义方法
    int select();
    int delete();
    int update();
    ...
}

如果要实现Database接口,必须重写所有方法,不管是否需要。很麻烦,于是就有了适配器设计模式。

public class DataBaseAdapter implements DataBase{
      public int select(){}
      public int delete(){}
      public int update(){}
      }

这样就可以根据你的需求去实现具体方法了。 现在Java SE 8 闪亮登场,这种适配技术“退出历史舞台”

public class DataBaseAdapter implements DataBase{
      default int select(){}
      default int delete(){}
      default int update(){}
      }

默认方法更牛的用法是“接口演化”,即可以在原来的使用很久的接口中添加方法。

public interface DataBase { //定义数据库接口
    // 定义方法
    int select();
    int delete();
    int update();
    ...
    // 在原来接口添加insert方法
    int insert();
}

这样,可以吗?当然不行。所有的实现了这个接口的类都通不过编译。因为有未实现的抽象方法。

public interface DataBase { //定义数据库接口
    // 定义方法
    int select();
    int delete();
    int update();
    ...
    // 在原来接口添加insert方法
    default int insert();
}

总结下默认方法:
(1)提供默认实现,你以根据需求实现具体方法。
(2)接口演化,可以在接口中添加方法
补充一点:默认方法还可以调用接口中的 任意 方法。

猜你喜欢

转载自blog.csdn.net/gao_zhennan/article/details/80265786