Java interface 接口

接口(interface)

接口的理解

接口就是规范,定义的是一组规则,体现了现实世界中"如果你是/要...则必须能..."的思想。继承是一个"是不是"的is-a关系,而接口实现则是 "能不能"的has-a关系。

接口的本质是契约、标准、规范,就像我们的法律一样。制定好后大家都要遵守。

接口的定义

定义接口的关键字:interface

声明格式:
java 复制代码
[修饰符] interface 接口名{
    //接口的成员列表:
    // 公共的静态常量
    // 公共的抽象方法
    
    // 公共的默认方法(JDK1.8以上)
    // 公共的静态方法(JDK1.8以上)
    // 私有方法(JDK1.9以上)
}
  • 声明属性:必须使用public static final修饰

  • 声明方法: jdk8之前,声明抽象方法,修饰为public abstract

    ​ jkd8: 声明静态方法、默认方法

    ​ jdk9:声明私有方法

    不可以使用interface声明: 构造器、代码块等

interface的使用

接口和类的关系:实现关系

java 复制代码
interface Flyable{
    //接口
    //全局常量
    public static final int MIN_SPEED = 0;      //最低速度
    //可以省略 public static final
    //自动默认为静态final的常量
    int MAX_SPEED = 7900;   //最高速度
    
    public abstract void fly(); //默认为抽象方法,可以省略public abstract 
    //抽象方法,无方法体
}

interface Attackable{
    //接口
    public abstract void attack();
}
class Plane implements Flyable,Attackable{
    //实现Flyable接口
    //接口中存在抽象方法:① 使用abstract修饰方法,使方法为抽象方法
    //                ② 重写抽象方法
    public void fly(){
        System.out.println("Plane.fly");
    }

    @Override
    public void attack() {
        System.out.println("Plane.attack");
    }
}
具体格式:
java 复制代码
class A extend SuperA implements B,c{
    
    
}
//A是SuperA的子类
//A 是 B,C的 实现类
注意点:

一个接口中的所有属性都默认为public final修饰,为常量,赋值后不可更改

一个接口中所有的方法,都为public abstrace修饰,为抽象方法

  • 一个类可以实现多个接口
  • 类针对于接口的多实现,一定程度上就弥补了类的单继承的局限性
  • 一个类实现了一个接口,这个类必须将实现接口中所有的抽象方法进行重写,否则要将此类声明为抽象类

接口和接口的关系:继承关系

使用关键字extends进行继承

java 复制代码
interface AA{
    void method1();	//抽象方法,无方法体
}

interface BB{
    void method2();
}

interface CC extends AA,BB{//接口可以多继承
    
}

接口的多态性

接口名 变量名 = new 实现类对象
java 复制代码
package interfaceTest;

public class UsbTest {
    public static void main(String[] args) {
        //1,创建接口实现类的对象
        Computer computer = new Computer();
        Printer printer = new Printer();
        //2.创建接口实现类的匿名对象
        computer.transferDate(printer);
        //多态的体现

        computer.transferDate(new Camera());
        
        //3. 创建接口匿名实现类的对象
        USB usb1 = new USB(){
            @Override
            public void start() {
                System.out.println("U盘开始工作");
            }

            @Override
            public void stop() {
                System.out.println("U盘停止工作");
            }
        };
        computer.transferDate();
    }
}

class Computer{ //电脑类
    public void transferDate(USB usb){
        System.out.println("设备连接成功");
        usb.start();
        System.out.println("数据传输细节操作");
        usb.stop();
    }
}

class Printer implements USB{
    @Override
    public void start() {
        System.out.println("打印机工作");
    }

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

class Camera implements USB{
    @Override
    public void start() {
        System.out.println("照相机工作");
    }

    @Override
    public void stop() {
        System.out.println("照相机结束工作");
    }
}
interface USB{
    //声明常量  省略
    public abstract void start();
    void stop();
}
相关推荐
Charles Ray9 分钟前
C++学习笔记 —— 内存分配 new
c++·笔记·学习
重生之我在20年代敲代码10 分钟前
strncpy函数的使用和模拟实现
c语言·开发语言·c++·经验分享·笔记
爱上语文11 分钟前
Springboot的三层架构
java·开发语言·spring boot·后端·spring
serve the people15 分钟前
springboot 单独新建一个文件实时写数据,当文件大于100M时按照日期时间做文件名进行归档
java·spring boot·后端
我要吐泡泡了哦1 小时前
GAMES104:15 游戏引擎的玩法系统基础-学习笔记
笔记·学习·游戏引擎
骑鱼过海的猫1231 小时前
【tomcat】tomcat学习笔记
笔记·学习·tomcat
qmx_071 小时前
HTB-Jerry(tomcat war文件、msfvenom)
java·web安全·网络安全·tomcat
为风而战1 小时前
IIS+Ngnix+Tomcat 部署网站 用IIS实现反向代理
java·tomcat
编程零零七2 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
贾saisai3 小时前
Xilinx系FPGA学习笔记(九)DDR3学习
笔记·学习·fpga开发