Day15 - 接口 -2.1 概述

2.1 概述

我们已经学完了抽象类,抽象类中可以用抽象方法,也可以有普通方法,构造方法,成员变量等。那么什么是接口呢?接口是更加彻底的抽象,JDK7之前,包括JDK7,接口中全部是抽象方法。接口同样是不能创建对象的

✅ 理论理解:

接口(interface)是对“行为规范”的一种更彻底的抽象,它不能实例化对象,只能被类“实现”。相比抽象类,接口更偏向“协议设计”,强调“必须做什么”,而不是“怎么做”。

接口 = 全部是抽象方法 + 常量定义(JDK7以前)。

💼 企业实战理解:
  • 阿里巴巴 Dubbo RPC 框架 中,所有服务提供方都必须实现统一接口(如 UserService),这样才能被注册与远程调用。

  • 字节跳动的推荐系统服务中,不同内容源通过实现统一的 ContentProvider 接口接入,保持系统可扩展。

  • OpenAI 的插件机制定义了统一接口格式,如 POST /run, GET /status,所有插件必须遵循。

2.2 定义格式

✅ 理论理解:

接口使用 interface 关键字声明,接口名应符合“首字母大写 + 驼峰命名”的规范。格式:

//接口的定义格式:
interface 接口名称{
    // 抽象方法
}
​
// 接口的声明:interface
// 接口名称:首字母大写,满足“驼峰模式”
💼 企业实战理解:
  • Google Android 系统组件中,如 OnClickListenerCallback 等都是接口,方便不同模块进行事件绑定与解耦。

  • 腾讯 IM SDK 中,定义了大量“事件回调接口”如 MessageObserver, NetworkListener 便于开发者灵活扩展。

2.3 接口成分的特点

在JDK7,包括JDK7之前,接口中的只有包含:抽象方法和常量

2.3.1.抽象方法

注意:接口中的抽象方法默认会自动加上public abstract修饰程序员无需自己手写!! ​ 按照规范:以后接口中的抽象方法建议不要写上public abstract。因为没有必要啊,默认会加上。

2.3.2 常量

在接口中定义的成员变量默认会加上: public static final修饰。也就是说在接口中定义的成员变量实际上是一个常量。这里是使用public static final修饰后,变量值就不可被修改,并且是静态化的变量可以直接用接口名访问,所以也叫常量。常量必须要给初始值。常量命名规范建议字母全部大写,多个单词用下划线连接。

2.3.3 案例演示

public interface InterF {
    // 抽象方法!
    //    public abstract void run();
    void run();
​
    //    public abstract String getName();
    String getName();
​
    //    public abstract int add(int a , int b);
    int add(int a , int b);
​
​
    // 它的最终写法是:
    // public static final int AGE = 12 ;
    int AGE  = 12; //常量
    String SCHOOL_NAME = "黑马程序员";
​
}
✅ 理论理解:
  • 抽象方法:默认带 public abstract 修饰(可省略);

  • 常量:默认带 public static final 修饰(必须初始化);

  • 无构造器、无普通方法(JDK8开始支持默认方法);

💼 企业实战理解:
  • 阿里 Sentinel 限流框架中,所有限流策略都实现接口 RuleChecker,并定义静态常量如 DEFAULT_LIMIT=1000

  • NVIDIA TensorRT 插件系统中,接口 IPluginV2 规范插件必须定义的行为,并且通过常量指定兼容版本或算法编号。

2.4 基本的实现

2.4.1 实现接口的概述

类与接口的关系为实现关系,即类实现接口,该类可以称为接口的实现类,也可以称为接口的子类。实现的动作类似继承,格式相仿,只是关键字不同,实现使用 implements关键字。

2.4.2 实现接口的格式

/**接口的实现:
    在Java中接口是被实现的,实现接口的类称为实现类。
    实现类的格式:*/
class 类名 implements 接口1,接口2,接口3...{
​
}

从上面格式可以看出,接口是可以被多实现的。大家可以想一想为什么呢?

2.4.3 类实现接口的要求和意义

  1. 必须重写实现的全部接口中所有抽象方法。

  2. 如果一个类实现了接口,但是没有重写完全部接口的全部抽象方法,这个类也必须定义成抽象类。

  3. 意义:接口体现的是一种规范,接口对实现类是一种强制性的约束,要么全部完成接口申明的功能,要么自己也定义成抽象类。这正是一种强制性的规范。

2.4.4 类与接口基本实现案例

假如我们定义一个运动员的接口(规范),代码如下:

/**
   接口:接口体现的是规范。
 * */
public interface SportMan {
    void run(); // 抽象方法,跑步。
    void law(); // 抽象方法,遵守法律。
    String compittion(String project);  // 抽象方法,比赛。
}

接下来定义一个乒乓球运动员类,实现接口,实现接口的实现类代码如下:

package com.itheima._03接口的实现;
/**
 * 接口的实现:
 *    在Java中接口是被实现的,实现接口的类称为实现类。
 *    实现类的格式:
 *      class 类名 implements 接口1,接口2,接口3...{
 *
 *
 *      }
 * */
public class PingPongMan  implements SportMan {
    @Override
    public void run() {
        System.out.println("乒乓球运动员稍微跑一下!!");
    }
​
    @Override
    public void law() {
        System.out.println("乒乓球运动员守法!");
    }
​
    @Override
    public String compittion(String project) {
        return "参加"+project+"得金牌!";
    }
}

测试代码

public class TestMain {
    public static void main(String[] args) {
        // 创建实现类对象。
        PingPongMan zjk = new PingPongMan();
        zjk.run();
        zjk.law();
        System.out.println(zjk.compittion("全球乒乓球比赛"));
​
    }
}

2.4.5 类与接口的多实现案例

类与接口之间的关系是多实现的,一个类可以同时实现多个接口。

首先我们先定义两个接口,代码如下:

/** 法律规范:接口*/
public interface Law {
    void rule();
}
​
/** 这一个运动员的规范:接口*/
public interface SportMan {
    void run();
}
​

然后定义一个实现类:

/**
 * Java中接口是可以被多实现的:
 *    一个类可以实现多个接口: Law, SportMan
 *
 * */
public class JumpMan implements Law ,SportMan {
    @Override
    public void rule() {
        System.out.println("尊长守法");
    }
​
    @Override
    public void run() {
        System.out.println("训练跑步!");
    }
}

从上面可以看出类与接口之间是可以多实现的,我们可以理解成实现多个规范,这是合理的。

✅ 理论理解:
  • 使用 implements 关键字;

  • 类可实现一个或多个接口;

  • 必须实现接口中所有抽象方法;

  • 接口 = 一种“规范集合”,实现类 = 具体执行者。

💼 企业实战理解:
  • 字节跳动的内容治理系统,不同审核模块实现 ContentChecker 接口,统一入口,动态加载;

  • 腾讯云监控平台中,插件实现 MetricCollector 接口,自动被框架识别并加载;

  • OpenAI 微服务架构中,多个微服务实现统一的 InferenceService 接口,支持跨模型调度、统一日志。

 

2.5 接口与接口的多继承

Java中,接口与接口之间是可以多继承的:也就是一个接口可以同时继承多个接口。大家一定要注意:

类与接口是实现关系

接口与接口是继承关系

接口继承接口就是把其他接口的抽象方法与本接口进行了合并。

案例演示:

public interface Abc {
    void go();
    void test();
}
​
/** 法律规范:接口*/
public interface Law {
    void rule();
    void test();
}
​
 *
 *  总结:
 *     接口与类之间是多实现的。
 *     接口与接口之间是多继承的。
 * */
public interface SportMan extends Law , Abc {
    void run();
}
✅ 理论理解:
  • 接口之间是“继承”关系;

  • 一个接口可以继承多个接口,最终子接口汇总全部抽象方法;

  • 这使得接口可以构建“组合协议”。

💼 企业实战理解:
  • 京东电商交易系统中,接口 TradeService 同时继承 Payment, Refund, Logistics 等多个接口,实现统一业务聚合;

  • OpenAI 多模型推理平台中,接口 ModelService 继承多个模块接口(如 Tokenizer, Encoder, Decoder),形成一体化访问结构;

  • Google Cloud SDK 中,CloudServiceInterface 整合了日志、监控、计算等多个子接口,使开发者通过一个接口完成多模块集成。

2.6扩展:接口的细节

不需要背,只要当idea报错之后,知道如何修改即可。

关于接口的使用,以下为语法上要注意的细节,虽然条目较多,但若理解了抽象的本质,无需死记硬背。

  1. 当两个接口中存在相同抽象方法的时候,该怎么办?

只要重写一次即可。此时重写的方法,既表示重写1接口的,也表示重写2接口的。

  1. 实现类能不能继承A类的时候,同时实现其他接口呢?

继承的父类,就好比是亲爸爸一样 实现的接口,就好比是干爹一样 可以继承一个类的同时,再实现多个接口,只不过,要把接口里面所有的抽象方法,全部实现。

  1. 实现类能不能继承一个抽象类的时候,同时实现其他接口呢?

实现类可以继承一个抽象类的同时,再实现其他多个接口,只不过要把里面所有的抽象方法全部重写。

  1. 实现类Zi,实现了一个接口,还继承了一个Fu类。假设在接口中有一个方法,父类中也有一个相同的方法。子类如何操作呢?

处理办法一:如果父类中的方法体,能满足当前业务的需求,在子类中可以不用重写。 处理办法二:如果父类中的方法体,不能满足当前业务的需求,需要在子类中重写。

  1. 如果一个接口中,有10个抽象方法,但是我在实现类中,只需要用其中一个,该怎么办?

可以在接口跟实现类中间,新建一个中间类(适配器类) 让这个适配器类去实现接口,对接口里面的所有的方法做空重写。 让子类继承这个适配器类,想要用到哪个方法,就重写哪个方法。 因为中间类没有什么实际的意义,所以一般会把中间类定义为抽象的,不让外界创建对象

✅ 理论理解:
  • 接口中不能有构造方法;

  • 成员变量必须是常量;

  • 不能写方法体(JDK8 之后允许默认实现);

  • 接口设计强调“统一约定、最小实现”。

💼 企业实战理解:
  • 阿里中间件组件系统中,接口字段被当作系统常量,如 MAX_RETRY, TIMEOUT 等,所有组件自动读取;

  • 字节跳动的直播推流 SDK 接口中使用默认方法为不同平台提供兼容性;

  • NVIDIA Triton 推理引擎中,各接口字段和方法定义都以常量和抽象形式存在,用于统一协议格式与调度执行行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值