码迷,mamicode.com
首页 > 编程语言 > 详细

java8改进的接口

时间:2015-02-23 00:15:37      阅读:256      评论:0      收藏:0      [点我收藏+]

标签:接口

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单继承的不足 一个类最多只能有一个直接父类,包括抽象类

java8改进的接口

标签:接口

原文地址:http://blog.csdn.net/u014270902/article/details/43911007

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!