JAVA接口

本章目标

  1. 接口的语法

  2. 接口的应用

  3. jdk1.8 接口新特性

  4. 接口和抽象类的区别

  5. 匿名内部类

本章内容

一、接口语法:
  1. 概念,接口是一种规则和标准,而这些规则和标准需要实现类来实现,侧重于can do

  2. 接口的实现:使用implements关键字

  3. 接口的定义:

  4. 接口中也可以存放全局常量,默认为:public static final

  5. 一个类可以实现多个接口

  6. 一个类既可以实现多个接口也可以同时继承一个类,但是继承需要写到实现的前面,先继承后实现

  7. 一个接口可以继承多个接口(接口和接口之间的关系)

  8. 接口语法总结

    • 接口中定义的方法,默认为:public abstract

    • 接口中没有构造器,代码块

    • 接口不能被实例化,主要作用就是被实现类实现,接口的主要是体现为标准

    • 一个类可以实现多个接口,测试的时候,一个接口类型的变量指向实现类对象后,接口类型的变量只能调用出来本接口中定义过的方法,实现类独有的方法不能调用

    • 一个类既可以实现多个接口也可以同时继承一个类,但是继承需要写到实现的前面,先继承后实现

    • 一个接口可以继承多个接口

    • 接口中也可以存放全局常量,默认为:public static final

  9. 练习

    Usb

    分析:

    USB接口本身没有任何实现

    USB接口规定了数据的传输要求

    USB接口可以被多种USB设备实现

    USB: service()

    java实现:

    步骤一:编写USB接口 —-> 根据需求设计方法

    步骤二:实现USB接口 —-> 实现所有方法

    步骤三:使用USB接口 —-> 使用多态的方式使用接口

    /**
    * USB接口
    *
    */
    public interface UsbInterface {
        /**
        * USB接口提供服务
        */
        void service();
    }
    示例代码:(USB风扇)
    示例代码:(USB U盘)
    package com.woniu.usb;
    /**
    * USB风扇
    *
    */
    public class UsbFan implements UsbInterface {
        @Override
        public void service() {
            System.out.println("连接USB接口,获得电流,风扇开始转动");
        }
    }
    package com.woniu.usb; 
    示例代码:(测试类)
    /**
    * U盘
    *
    */
    public class UDisk implements UsbInterface{
        @Override
        public void service() {
            System.out.println("连接USB接口,开始传输数据");
        }
    }
    package com.woniu.usb;
    public class Test {
        public static void main(String[] args) {
            //1、创建U盘
            UsbInterface uDisk = new UDisk(); //多态方式
            uDisk.service();
            //2、创建风扇
            UsbInterface usbFan = new UsbFan();//多态方式
            usbFan.service();
        }
    }

二、接口应用场景

有很多重复代码,但是没有办法用is a的原则找到一个共同的父类,我们可以考虑将重复代码所体现的能力提取到接口中,让不同的实现类实现,调用者传递不同的实现类对象,调用不同类重写过的方法,体现了多态特性,提高项目的可扩展性和可维护性

打补丁 ,规定可以做什么,对已有功能进行扩展,但是并不想修改已有类型或者并不想让继承体系变得复杂,就可以使用接口扩展以后的功能

分析:

防盗门是一个门 ——> is a 的关系

不是所有的门都有防盗能力,防盗门可以上锁,可以开锁

如果使用继承,将门分为防盗门和普通门,会导致继承关系复杂,使用接口表示防盗的这种能力

img

练习:

1、原始的手机,可以发短信,通电话。随着发展,

手机增加了功能:音频、视频播放、拍照、上网

面向接口的编程:主体结构使用接口去进行搭建

三、接口和抽象类的区别:
  1. 接口中不能写实例属性(非静态属性),但是抽象类中可以写实例属性,如果说在父类中想定义一些实例属性体现所有子类通用的属性,那么只能选择使用抽象类,如果没有上述需求,接口和抽象类都可以,那么优先使用接口,因为接口会更灵活一些。

  2. 抽象类中可以写构造方法,代码块等,接口没有构造方法,代码块

  3. 接口和类之间的关系是实现关系,不一定满足is a的原则,但是抽象类是属于继承体系,需要满足is a的原则

  4. 接口和接口之间可以有继承关系,并且是多继承,类和类之间的继承关系是单继承

  5. 一个类可以实现多个接口,但是一个类只能继承一个类

四、Jdk1.8之后可以在接口中定义非抽象方法:default方法以及静态方法

静态方法:

使用接口名称调用

Default方法

如果一个类同时实现接口A和B,接口A和B中有相同的default方法,这时,该类必须重写接口中的default方法

如果子类继承父类,父类中有b方法,该子类同时实现的接口中也有b方法(被default修饰),那么子类会继承父类的b方法而不是继承接口中的b方法

五、内部类

匿名内部类

匿名内部类在创建的时候使用一次,必然是一个实现类或者,子类,每次创建对象都想对接口中的方法或者父类中的方法做不同的实现,可以考虑使用匿名内部类,内部类编译之后的字节码文件中包含$符号