java8改进的接口

java8对接口进行了改进,允许在接口中定义默认方法,默认方法可以提供方法实现。

5.6.1 接口的概念

类是一种具体实现类,而接口定义了一种规范,接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心这些类里方法的实现细节,它只规定这批类里必须提供某些方法,提供这些方法的类就可满足实际需要。

接口是从多个类中抽象出来的规范,接口不提供任何实现。接口体现的是规范和实现分离的设计哲学。

5.6.2 java中接口的定义

示例:[修饰符]interface 接口名 extends 父接口1,父接口2…{ }

接口名通常能够使用形容词

不管是否使用public static final修饰符,接口里的成员变量总是使用这三个修饰符来修饰。

接口里定义的内部类、内部接口、内部枚举默认都采用public static 两个修饰符,系统会自动使用public static来对他们进行修饰

Output.java

package code;
public interface Output{
    //接口里定义的成员变量只能是常量
    int MAX_CACHE_LINE = 50;
    //接口里定义的普通方法只能是public的抽象方法
    void out();
    void getDate(String msg);
    //在接口中定义的默认方法,需要使用default修饰
    default void print(String ... msgs){
        for(String msg : msgs){
            System.out.println(msg);
        }
    }
    //在接口中定义的默认方法,需要使用default修饰
    default void test(){
        System.out.println("默认的test()方法");
    }
    //在接口中定义类方法,需要使用static修饰
    static String staticTest(){
        return "接口里的类方法";
    }
}

default与访问控制符的default不同

java8允许在接口中定义默认方法,默认方法必须使用default修饰,该方法不能使用static修饰,默认方法会自动使用public修饰(必须使用)。由于默认方法并没有static修饰,因此不能直接使用接口来调用默认方法,需要使用接口的实现类的实例来调用这些默认方法。

在接口中定义类方法,必须使用static修饰,不能使用default修饰,而且自动为类添加public(必须使用)。类方法可以直接使用接口来调用

package code;
public class OutputFieldTest{
    public static void main(String[]args){
        System.out.println(code.Output.MAX_CACHE_LINE);
        //code.Output.MAX_CACHE_LINE = 20;
        System.out.println(code.Output.staticTest());
    }
}

接口里的成员变量默认是使用public static final修饰的,不同包下也可以通过接口来访问接口里的成员变量。

5.6.3 接口的继承

接口支持多继承,

package code;
interface interfaceA{
    int PROP_A = 5;
    void testA();
}
interface interfaceB{
    int PROP_B = 6;
    void testB();
}
interface interfaceC extends interfaceA,interfaceB{
    int PROP_C = 7;
    void testC();
}
public class InterfaceExtendsTest{
    public static void main(String []args){
        System.out.println(interfaceC.PROP_A);
        System.out.println(interfaceC.PROP_B);
        System.out.println(interfaceC.PROP_C);
    }
}

5

6

7

5.6.4 使用接口

归纳:接口有如下用途:

  • 定义变量,也可用于进行强制类型转换
  • 调用接口中定义的常量
  • 被其他类实现

示例:[修饰符]class 类名 extends 父类 implements 接口1,接口2…{ 类体部分}

implements必须放在extends部分之后

一个类实现了一个或多个接口后,这个类必须完全实现这些接口里所定义的全部抽象方法(也就是重写这些抽象方法),否则将保留从父接口那里继承到的抽象方法, 该类也必须定义成抽象类。

Printer.java

package code;
interface Product{
    int getProduceTime();
}
public class Printer implements Output,Product{
    private String[] printData = new String[MAX_CACHE_LINE];
    private int dataNum = 0;
    public void out(){
        while(dataNum > 0){
            System.out.println("打印机打印:" + printData[0]);
            System.arraycopy(printData,1,printData,0 ,1);
            --dataNum;
        }
    }
    public void getData(String msg){
        if(dataNum >= MAX_CACHE_LINE){
            System.out.println("输出队列已满,添加失败");

        }
        else{
            printData[dataNum++] = msg;
        }
    }
    public int getProduceTime(){
        return 45;
    }
    public static void main(String[]args){
        Output o = new Printer();
        o.getData("轻量级JavaEE企业应用实战");
        o.getData("疯狂Java讲义");
        o.out();
        o.getData("疯狂Android讲义");
        o.getData("疯狂Ajax讲义");
        o.out();
        o.print("孙悟空","猪八戒","白骨精");
        o.test();
        Product p = new Printer();
        System.out.println(p.getProduceTime());
        Object obj = p ;
    }
}

打印机打印:轻量级JavaEE企业应用实战

打印机打印:疯狂Java讲义

打印机打印:疯狂Android讲义

打印机打印:疯狂Ajax讲义

孙悟空

猪八戒

白骨精

默认的test()方法

45

上面程序看出:Printer类实现了Output接口和Product接口,因此Printer对象既可直接赋给Output变量,也可直接赋给Product变量,仿佛Printer类既是Output类的子类,也是Product类的子类,这就是java提供的模拟多继承

Printer实现Output接口,即可获得Output接口中定义的print()和test()两个默认方法,因此Printer实例可以直接调用这两个默认的方法。

接口不能显式继承类,但所有接口类型的引用变量都可以直接赋给Object类型的引用变量。

5.6.5 接口和抽象类

共同特征:

  • 都不能被实例化,都位于继承树的顶端,用于被实现和继承
  • 都可以包含抽象方法,实现类和接口必须实现这些抽象方法

    差别:

接口类似于整个系统的“总纲”,制定了系统各模块应该遵循的标准,因此一个系统中的接口不应该经常改变,一旦接口被改变,对整个系统甚至其他系统的影响都是辐射式的,导致大部分类都需要重新改写。

抽象类所体现的是模块式的设计,它作为多个子类的抽象父类,可以被当成系统实现过程中的中间产品。这个中间产品已经实现了系统的部分功能(那些已经提供实现的方法),但是需要完善。

区 别 接口 抽象类
1 只能包含抽象方法和默认方法,不能为普通方法提供方法的实现 完全可以包含普通方法
2 不能定义静态方法 可以定义静态方法
3 只能定义静态变量,不能定义普通成员变量 既可以定义普通成员变量,也可以定义静态变量
4 不包含构造器 可以包含构造器,抽象类的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作
5 不能包含初始化块 完全可以包含初始化块
6 一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承的不足 一个类最多只能有一个直接父类,包括抽象类
时间: 2024-08-09 00:51:15

java8改进的接口的相关文章

Java8新特性——接口的默认方法和类方法

Java8新增了接口的默认方法和类方法: 以前,接口里的方法要求全部是抽象方法,java8以后允许在接口里定义默认方法和类方法: 不同的是: 默认方法可以通过实现接口的类实例化的对象来调用,而类方法只能在本接口中调用或在实现类中实现 下面是使用实例: 1 public interface MyInter { 2 default void df(){ //声明一个接口的默认方法 3 4 System.out.println("i'am default f"); 5 sf(); //调用本

JAVA8新特性——接口定义增强

JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~ 接口定义增强 在JDK1.8以前,接口是定义的: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 在JDK1.8之前,接口有如下特性: 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错). 接口中

java8中的接口

java8中接口可以有默认方法(用default修饰,可以有多个)和静态方法了. public interface Tran { default public String getName() { return "zhangsan"; } default public String getName1() { return "lisi"; } public static String getName2() throws Exception{ return "

乐字节-Java8新特性-接口默认方法之Stream流(下)

接上一篇:<Java8新特性之stream>,下面继续接着讲Stream 5.流的中间操作 常见的流的中间操作,归为以下三大类:筛选和切片流操作.元素映射操作.元素排序操作: 操作 描述 筛选和切片 filter(T -> boolean):保留 boolean 为 true 的元素 limit(long n):返回前 n 个元素 skip(long n):去除前 n 个元素 distinct():去除重复元素,这个方法是通过类的 equals 方法来判断两个元素是否相等的 映射 map

Java8之Iterable接口

Iterable接口是Java 集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素. 源码展示 // T:迭代器返回的类型 public interface Iterable<T> { // 返回一个内部元素为T类型的迭代器 Iterator<T> iterator(); // 对Iterable中的元素进行指定的操作 default void forEach(Consumer<? super T> action) { Objects.requireNo

java9新特性-7-语法改进:接口的私有方法

1.官方Feature 213: Milling Project Coin Support for private methods in interfaces was briefly in consideration for inclusion in Java SE 8 as part of the effort to add support for Lambda Expressions, but was withdrawn to enable better focus on higher pr

java8:函数式接口

1.Comparator接口 @FunctionalInterface public interface Comparator<T> { (1)普通方式: public static void main(String[] args) { List<String>list= Arrays.asList("ni","hao"); Collections.sort(list, new Comparator<String>() { @Ov

浅谈JAVA8引入的接口默认方法

参考 http://blog.csdn.net/wanghao_0206/article/details/52712736 public interface InterfaceTest { public static String oldOldName(){ return "王海"; } default String oldName(){ return "王陆"; } public String myNewName(String name); } public cl

java8常用函数式接口 Supplier 、Consumer、Predicate、Function总结

//无输入参数,返回T类型的一个结果. new Supplier<String>() { @Override public String get() { return null; } }; Supplier<String> supplier = () -> "Test supplier"; supplier.get(); //return String | Test supplier //接受一个T类型的参数,无返回. new Consumer<St