java — 接口(interface)详解,一文彻底搞懂

2025-12-02 17:34:18   生存训练营

进入正题之前,先给大家分享一个人工智能学习网站,前些天发现这个网站之后,就沉浸其中了,通俗易懂,风趣幽默!特别适合对人工智能和AI感兴趣的小伙伴,忍不住分享给大家,地址👇👇👇前言 – 人工智能教程https://www.captainbed.cn/bfsh

​ 🌈🌈文章目录

一、接口概述

二、定义格式

2.1 接口的声明格式

示例代码:

2.2 接口的成员说明

三、接口的使用规则

3.1 类实现接口(implements)

3.2 接口的多实现(implements)

3.3 接口的多继承(extends)

3.4 接口与实现类对象构成多态引用

3.5 使用接口的静态成员

3.6 使用接口的非静态方法

一、接口概述

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

例如:电脑都预留了可以插入USB设备的USB接口,USB接口具备基本的数据传输的开启功能和关闭功能。你能不能用USB进行连接,或是否具备USB通信功能,就看你能否遵循USB接口规范

例如:Java程序是否能够连接使用某种数据库产品,那么要看该数据库产品能否实现Java设计的JDBC规范

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

二、定义格式

接口的定义,它与定义类方式相似,但是使用 interface 关键字。它也会被编译成.class文件,但一定要明确它并不是类,而是另外一种引用数据类型。

引用数据类型:数组,类,枚举,接口,注解。

2.1 接口的声明格式

[修饰符] interface 接口名{

//接口的成员列表:

// 公共的静态常量

// 公共的抽象方法

// 公共的默认方法(JDK1.8以上)

// 公共的静态方法(JDK1.8以上)

// 私有方法(JDK1.9以上)

}

示例代码:

public interface USB3{

//静态常量

long MAX_SPEED = 500*1024*1024;//500MB/s

//抽象方法

void in();

void out();

//默认方法

default void start(){

System.out.println("开始");

}

default void stop(){

System.out.println("结束");

}

//静态方法

static void show(){

System.out.println("USB 3.0可以同步全速地进行读写操作");

}

}

2.2 接口的成员说明

在JDK8.0 之前,接口中只允许出现:

(1)公共的静态的常量:其中public static final可以省略

(2)公共的抽象的方法:其中public abstract可以省略

理解:接口是从多个相似类中抽象出来的规范,不需要提供具体实现

在JDK8.0 时,接口中允许声明默认方法和静态方法:

(3)公共的默认的方法:其中public 可以省略,建议保留,但是default不能省略

(4)公共的静态的方法:其中public 可以省略,建议保留,但是static不能省略

在JDK9.0 时,接口又增加了:

(5)私有方法

除此之外,接口中没有构造器,没有初始化块,因为接口中没有成员变量需要动态初始化。

三、接口的使用规则

3.1 类实现接口(implements)

接口不能创建对象,但是可以被类实现(implements ,类似于被继承)。

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

【修饰符】 class 实现类 implements 接口{

// 重写接口中抽象方法【必须】,当然如果实现类是抽象类,那么可以不重写

// 重写接口中默认方法【可选】

}

【修饰符】 class 实现类 extends 父类 implements 接口{

// 重写接口中抽象方法【必须】,当然如果实现类是抽象类,那么可以不重写

// 重写接口中默认方法【可选】

}

注意:

如果接口的实现类是非抽象类,那么必须重写接口中所有抽象方法。

默认方法可以选择保留,也可以重写。

重写时,default单词就不要再写了,它只用于在接口中表示默认方法,到类中就没有默认方法的概念了

接口中的静态方法不能被继承也不能被重写

举例:

interface USB{ //

public void start() ;

public void stop() ;

}

class Computer{

public static void show(USB usb){

usb.start() ;

System.out.println("=========== USB 设备工作 ========") ;

usb.stop() ;

}

};

class Flash implements USB{

public void start(){ // 重写方法

System.out.println("U盘开始工作。") ;

}

public void stop(){ // 重写方法

System.out.println("U盘停止工作。") ;

}

};

class Print implements USB{

public void start(){ // 重写方法

System.out.println("打印机开始工作。") ;

}

public void stop(){ // 重写方法

System.out.println("打印机停止工作。") ;

}

};

public class InterfaceDemo{

public static void main(String args[]){

Computer.show(new Flash()) ;

Computer.show(new Print()) ;

c.show(new USB(){

public void start(){

System.out.println("移动硬盘开始运行");

}

public void stop(){

System.out.println("移动硬盘停止运行");

}

});

}

};

3.2 接口的多实现(implements)

我在之前的文章讲解过,在继承体系中,一个类只能继承一个父类。而对于接口而言,一个类是可以实现多个接口的,这叫做接口的多实现。并且,一个类能继承一个父类,同时实现多个接口。

实现格式:

【修饰符】 class 实现类 implements 接口1,接口2,接口3。。。{

// 重写接口中所有抽象方法【必须】,当然如果实现类是抽象类,那么可以不重写

// 重写接口中默认方法【可选】

}

【修饰符】 class 实现类 extends 父类 implements 接口1,接口2,接口3。。。{

// 重写接口中所有抽象方法【必须】,当然如果实现类是抽象类,那么可以不重写

// 重写接口中默认方法【可选】

}

接口中,有多个抽象方法时,实现类必须重写所有抽象方法。如果抽象方法有重名的,只需要重写一次。

举例:

定义多个接口:

public interface A {

void showA();

}

public interface B {

void showB();

}

定义实现类:

public class C implements A,B {

@Override

public void showA() {

System.out.println("showA");

}

@Override

public void showB() {

System.out.println("showB");

}

}

测试类

public class TestC {

public static void main(String[] args) {

C c = new C();

c.showA();

c.showB();

}

}

3.3 接口的多继承(extends)

一个接口能继承另一个或者多个接口,接口的继承也使用 extends 关键字,子接口继承父接口的方法。

定义父接口:

public interface Chargeable {

void charge();

void in();

void out();

}

定义子接口:

public interface UsbC extends Chargeable,USB3 {

void reverse();

}

定义子接口的实现类:

public class TypeCConverter implements UsbC {

@Override

public void reverse() {

System.out.println("正反面都支持");

}

@Override

public void charge() {

System.out.println("可充电");

}

@Override

public void in() {

System.out.println("接收数据");

}

@Override

public void out() {

System.out.println("输出数据");

}

}

所有父接口的抽象方法都有重写。

方法签名相同的抽象方法只需要实现一次

3.4 接口与实现类对象构成多态引用

实现类实现接口,类似于子类继承父类,因此,接口类型的变量与实现类的对象之间,也可以构成多态引用。通过接口类型的变量调用方法,最终执行的是你new的实现类对象实现的方法体。

接口的不同实现类:

public class Mouse implements USB3 {

@Override

public void out() {

System.out.println("发送脉冲信号");

}

@Override

public void in() {

System.out.println("不接收信号");

}

}

public class KeyBoard implements USB3{

@Override

public void in() {

System.out.println("不接收信号");

}

@Override

public void out() {

System.out.println("发送按键信号");

}

}

测试类

public class TestComputer {

public static void main(String[] args) {

Computer computer = new Computer();

USB3 usb = new Mouse();

computer.setUsb(usb);

usb.start();

usb.out();

usb.in();

usb.stop();

System.out.println("--------------------------");

usb = new KeyBoard();

computer.setUsb(usb);

usb.start();

usb.out();

usb.in();

usb.stop();

}

}

3.5 使用接口的静态成员

接口不能直接创建对象,但是可以通过接口名直接调用接口的静态方法和静态常量。

public class TestUSB3 {

public static void main(String[] args) {

//通过“接口名.”调用接口的静态方法 (JDK8.0才能开始使用)

USB3.show();

//通过“接口名.”直接使用接口的静态常量

System.out.println(USB3.MAX_SPEED);

}

}

3.6 使用接口的非静态方法

对于接口的静态方法,直接使用“接口名.”进行调用即可

也只能使用“接口名."进行调用,不能通过实现类的对象进行调用

对于接口的抽象方法、默认方法,只能通过实现类对象才可以调用

接口不能直接创建对象,只能创建实现类的对象

public class TestMobileHDD {

public static void main(String[] args) {

//创建实现类对象

MobileHDD b = new MobileHDD();

//通过实现类对象调用重写的抽象方法,以及接口的默认方法,如果实现类重写了就执行重写的默认方法,如果没有重写,就执行接口中的默认方法

b.start();

b.in();

b.stop();

//通过接口名调用接口的静态方法

MobileHDD.show();//错误写法

b.show(); //错误写法

Usb3.show();//正确写法

}

}

到此这篇文章就介绍到这了,更多精彩内容请关注本人以前的文章或继续浏览下面的文章,创作不易,如果能帮助到大家,希望大家点点收藏+关注 ~💕

更多专栏订阅推荐:

🥕 JavaScript深入研究

👍 前端工程搭建 💕 vue从基础到起飞

✈️ HTML5与CSS3

🖼️ JavaScript基础

⭐️ uniapp与微信小程序

📝 前端工作常见问题与避坑指南

✍️ GIS地图与大数据可视化

📚 常用组件库与实用工具

💡 java入门到实战

泰山儒风烟价格表和图片
【马桶优惠】哪里买马桶便宜,性价比高的马桶推荐