接口与抽象类区别和接口jdk8新特性

jdk8之前特点对比抽象类
1 接口用interface表示,和类是并列的,定义接口就是定义接口的成员
2 接口只能定义公共抽象方法(public abstract)和全局静态最终变量(public final static),但这些在接口中都是可以省略的,因为接口中的方法和属性只能这样定义,可知接口是没有非抽象方法的,而抽象类中即有抽象方法,也可以有普通方法;
3、接口没有抽象类,彻底无法实例化,抽象方法有构造器但依然无法实例化
4、接口可以通过被类实现implement来使用,此时继承接口的类要么全部实现接口的抽象方法,要么被声明为抽象类;
5、java接口可以多实现,弥补了类(抽象类)的单继承的不足;
6、类和类关系是继承(继承是is-a的关系),类和接口关系是实现(接口的实现是能不能的关系),接口与接口之间可以多继承
7、接口实际上是一种规范,同时也体现了多态性,接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类则是对某一具事物共性的提取,代码实现方面发挥作用,可以实现代码的重用,适合做基类

接口的典型案例:
典型的应用jdbc,对于全部数据库(mysql,orcle,sql server)共有的操作,删改查事物…用继承数据库接口的形式,规范并统一方法名,即不同的数据库针对统一功能提供相同的方法名(重写的缘故),但其内部的实现细节是和数据库种类相关的,程序员不必关系具体的方法体,只需要熟练地调用数据库操作方法即可顺利完成工作。反之,如果没有jdbc这个接口用于规范,那么各大数据库厂商闭门造车,就会产生各种五花八门甚至非常奇葩的语法API,最终苦的还是程序员,java生态也会受到污染

jdk8新特征
除了定义全局常量和抽象方法外还可以定义默认方法public default/defalut和静态方法public static/static,有以下几个影响;
1、这就使工具类的地位受到威胁,例如,接口有了public static方法那么Collction(接口)就可以逐步取代Collections(普通类)了。
2、接口的适配器模式adapter也会由于接口的default方法的诞生而被淘汰;

interface USB{
    
    
    //相当于public static final String name = "USB";
    String name = "USB";
    //相当于public abstract void start();
    void start();
    void stop();
    //jdk8新特征
    public static void show(){
    
    
        System.out.println("这是USB接口");
    }
    //接口实现类或匿名实现类都可以调用
    default void say(){
    
    
        System.out.println("这个实现类是USB接口的实现类");
    }
}

class Flash implements  USB{
    
    
    public static final int a = 1;
    @Override
    public void start() {
    
    
        System.out.println("U盘开始工作");
    }

    @Override
    public void stop() {
    
    
        System.out.println("U盘结束工作");
    }
}

class Printer implements  USB{
    
    

    @Override
    public void start() {
    
    
        System.out.println("打印机开始工作");
    }

    @Override
    public void stop() {
    
    
        System.out.println("打印机结束工作");
    }
}

class Computer {
    
    
    public void transmit(USB usb) {
    
    
        usb.start();
        System.out.println("传输数据.......");
        usb.stop();
    }

    public static void main(String[] args) {
    
    
        Flash flash = new Flash();
        Computer computer = new Computer();
        computer.transmit(flash);

        //传入USB的匿名类对象参数的方式一
        USB phone = new USB() {
    
    
            @Override
            public void start() {
    
    
                System.out.println("手机传输开始");
            }

            @Override
            public void stop() {
    
    
                System.out.println("手机传输结束");
            }
        };
        computer.transmit(phone);
        //传入USB的匿名类对象参数的方式二
        computer.transmit(new USB() {
    
    
            @Override
            public void start() {
    
    
                System.out.println("MP3传输开始");
            }

            @Override
            public void stop() {
    
    
                System.out.println("MP3传输结束");
            }
        });

        //jdk8新特性测试
        USB.show();
        phone.say();
    }
}

运行结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wwwwwww31311/article/details/113172631