2.1 概述
我们已经学完了抽象类,抽象类中可以用抽象方法,也可以有普通方法,构造方法,成员变量等。那么什么是接口呢?接口是更加彻底的抽象,JDK7之前,包括JDK7,接口中全部是抽象方法。接口同样是不能创建对象的。
✅ 理论理解:
接口(interface
)是对“行为规范”的一种更彻底的抽象,它不能实例化对象,只能被类“实现”。相比抽象类,接口更偏向“协议设计”,强调“必须做什么”,而不是“怎么做”。
接口 = 全部是抽象方法 + 常量定义(JDK7以前)。
💼 企业实战理解:
-
阿里巴巴 Dubbo RPC 框架 中,所有服务提供方都必须实现统一接口(如
UserService
),这样才能被注册与远程调用。 -
字节跳动的推荐系统服务中,不同内容源通过实现统一的
ContentProvider
接口接入,保持系统可扩展。 -
OpenAI 的插件机制定义了统一接口格式,如
POST /run
,GET /status
,所有插件必须遵循。
2.2 定义格式
✅ 理论理解:
接口使用 interface
关键字声明,接口名应符合“首字母大写 + 驼峰命名”的规范。格式:
//接口的定义格式:
interface 接口名称{
// 抽象方法
}
// 接口的声明:interface
// 接口名称:首字母大写,满足“驼峰模式”
💼 企业实战理解:
-
在 Google Android 系统组件中,如
OnClickListener
、Callback
等都是接口,方便不同模块进行事件绑定与解耦。 -
腾讯 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 类实现接口的要求和意义
-
必须重写实现的全部接口中所有抽象方法。
-
如果一个类实现了接口,但是没有重写完全部接口的全部抽象方法,这个类也必须定义成抽象类。
-
意义:接口体现的是一种规范,接口对实现类是一种强制性的约束,要么全部完成接口申明的功能,要么自己也定义成抽象类。这正是一种强制性的规范。
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接口的,也表示重写2接口的。
-
实现类能不能继承A类的时候,同时实现其他接口呢?
继承的父类,就好比是亲爸爸一样 实现的接口,就好比是干爹一样 可以继承一个类的同时,再实现多个接口,只不过,要把接口里面所有的抽象方法,全部实现。
-
实现类能不能继承一个抽象类的时候,同时实现其他接口呢?
实现类可以继承一个抽象类的同时,再实现其他多个接口,只不过要把里面所有的抽象方法全部重写。
-
实现类Zi,实现了一个接口,还继承了一个Fu类。假设在接口中有一个方法,父类中也有一个相同的方法。子类如何操作呢?
处理办法一:如果父类中的方法体,能满足当前业务的需求,在子类中可以不用重写。 处理办法二:如果父类中的方法体,不能满足当前业务的需求,需要在子类中重写。
-
如果一个接口中,有10个抽象方法,但是我在实现类中,只需要用其中一个,该怎么办?
可以在接口跟实现类中间,新建一个中间类(适配器类) 让这个适配器类去实现接口,对接口里面的所有的方法做空重写。 让子类继承这个适配器类,想要用到哪个方法,就重写哪个方法。 因为中间类没有什么实际的意义,所以一般会把中间类定义为抽象的,不让外界创建对象
✅ 理论理解:
-
接口中不能有构造方法;
-
成员变量必须是常量;
-
不能写方法体(JDK8 之后允许默认实现);
-
接口设计强调“统一约定、最小实现”。
💼 企业实战理解:
-
在 阿里中间件组件系统中,接口字段被当作系统常量,如
MAX_RETRY
,TIMEOUT
等,所有组件自动读取; -
字节跳动的直播推流 SDK 接口中使用默认方法为不同平台提供兼容性;
-
NVIDIA Triton 推理引擎中,各接口字段和方法定义都以常量和抽象形式存在,用于统一协议格式与调度执行行为。