• 接口


    概述

    电脑的USB口上,可以插:U盘、鼠标、键盘…所有符合USB协议的设备
    电源插座插孔上,可以插:电脑、电视机、电饭煲…所有符合规范的设备
    通过上述例子可以看出:接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。
    在这里插入图片描述
    在java中,接口(Interface)可以看成是:多个类的公共规范,是一种引用数据类型。是对抽象类的进一步抽象,类可以扩展接口,接口可以实现类似多继承的效果.

    接口中包含中只抽象方法和全局常量

    语法

    接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口。

    public interface 接口名称{
    // 抽象方法
    public abstract void method1(); // public abstract 是固定搭配,可以不写
    public void method2();
    abstract void method3();
    void method4();
    // 注意:在接口中上述写法都是抽象方法,跟推荐方式4,代码更简洁
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Tips:

    1. 创建接口时, 接口的命名一般以大写字母 I 开头
    2. 接口的命名一般使用 “形容词” 词性的单词
    3. 阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号, 保持代码的简洁性

    使用

    接口和抽象类一样不能直接使用,必须要有一个"实现类"来"实现"该接口从而实现接口中的所有抽象方法。

    public class 类名称 implements 接口名称{
    // ...
    }
    
    • 1
    • 2
    • 3

    注意:子类和父类之间是extends 继承关系,类与接口之间是 implements 实现关系。

    示例:实现笔记本电脑使用USB鼠标、USB键盘

    1. USB接口:包含打开设备、关闭设备功能
    2. 笔记本类:包含开机功能、关机功能、使用USB设备功能
    3. 鼠标类:实现USB接口,并具备点击功能
    4. 键盘类:实现USB接口,并具备输入功能
    // USB接口
    public interface USB {
        void openDevice();
    
        void closeDevice();
    }
    
    // 鼠标类,实现USB接口
    class Mouse implements USB {
        @Override
        public void openDevice() {
            System.out.println("打开鼠标");
        }
    
        @Override
        public void closeDevice() {
            System.out.println("关闭鼠标");
        }
    
        public void click() {
            System.out.println("鼠标点击");
        }
    }
    
    // 键盘类,实现USB接口
    class KeyBoard implements USB {
        @Override
        public void openDevice() {
            System.out.println("打开键盘");
        }
    
        @Override
        public void closeDevice() {
            System.out.println("关闭键盘");
        }
    
        public void inPut() {
            System.out.println("键盘输入");
        }
    }
    
    // 笔记本类:使用USB设备
    class Computer {
        public void powerOn() {
            System.out.println("打开笔记本电脑");
        }
    
        public void powerOff() {
            System.out.println("关闭笔记本电脑");
        }
    
        public void useDevice(USB usb) {
            usb.openDevice();
            if (usb instanceof Mouse) {
                Mouse mouse = (Mouse) usb;
                mouse.click();
            } else if (usb instanceof KeyBoard) {
                KeyBoard keyBoard = (KeyBoard) usb;
                keyBoard.inPut();
            }
            usb.closeDevice();
        }
    }
    
    // 测试类:
    class TestUSB {
        public static void main(String[] args) {
            Computer computer = new Computer();
            computer.powerOn();
            // 使用鼠标设备
            computer.useDevice(new Mouse());
            // 使用键盘设备
            computer.useDevice(new KeyBoard());
            computer.powerOff();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

    特性

    • 接口类型是一种引用类型,但是不能直接new接口的对象
    • 接口中每一个方法都是public的抽象方法, 即接口中的方法会被隐式指定为public abstract(只能是public abstract,其他修饰符都会报错)
    • 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现
    • 重写接口中方法时,不能使用默认的访问权限
    • 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量
    • 接口中不能有静态代码块和构造方法
    • 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class
    • 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类
    • jdk8中:接口中还可以包含default方法

    接口的继承

    在java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。即:用接口可以达到多继承的目的。接口可以继承一个接口, 达到复用的效果. 使用 extends 关键字

    interface IRunning {
    void run();
    
    }
    interface ISwimming {
    void swim();
    
    }
    // 两栖的动物, 既能跑, 也能游
    interface IAmphibious extends IRunning, ISwimming {
    
    }
    class Frog implements IAmphibious {
    ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    抽象类和接口的区别

    核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法
    在这里插入图片描述

  • 相关阅读:
    Springboot中slf4j日志的简单应用
    构建微服务的准备
    详解动态内存管理!
    当两界交汇:前端开发、后端开发与全栈开发的对比与选择
    MySQL 事务一致性的视线
    Ubuntu源码编译Mysql常见的错误
    【无标题】
    SpringBoot集成ES、使用Java API对其进行简单的测试
    前端设计模式之【外观模式】
    element的表格中添加复制文字操作
  • 原文地址:https://blog.csdn.net/qq_75209065/article/details/134349415