接口的概念及特性

article/2025/8/3 16:29:53

目录

  • 1、接口的概念
  • 2、语法规则
    • 2.1 接口的定义
    • 2.2、接口的使用
  • 3、特性
  • 4、实现多个接口
  • 5、接口中的继承
  • 6、接口使用实例

1、接口的概念

在现实生活中,接口的例子有很多,比如:笔记本的 USB 接口,电源插座等。在电脑的 USB 口上,可以插鼠标、键盘等符合 USB 协议的设备;在电源插座上,可以插电脑、电视机等符合插座规范的设备。
在这里插入图片描述
通过上述例子可以看出:接口是公共的行为规范标准,在实现时,只要符合规范标准,就可以通用。因此在 Java 中,接口可以定义为:多个类的公共规范,是一种引用数据类型。

2、语法规则

2.1 接口的定义

接口的定义格式和类的定义格式基本相同,只是将 class 关键字换成 interface 关键字。

public interface 接口名称 {// 变量变量类型 变量名 = 变量值;// 抽象方法void method();
}
  • 接口中抽象方法默认搭配是 public abstract,建议不写,保持代码的简洁性。
  • 创建接口时,接口的命名一般以大写字母 I 开头,一般使用形容词词性的单词。
  • 接口中的变量被隐式指定为 public static final 变量。

2.2、接口的使用

接口不能直接使用,必须要有一个“实现类”来实现接口,且实现接口中的所有抽象方法。

public class 类名称 implements 接口名称 {//...
}

以电脑上的 USB 接口为例,鼠标和键盘均插入该 USB 接口。

// IUSB 接口
public interface IUSB {void openUSBDevice();void closeUSBDevice();
}// 键盘类实现 USB 接口
public class KeyBoard implements IUSB{// 在 IDEA 中,按 Ctrl+I 可以快速重写接口中的方法@Overridepublic void openUSBDevice() {System.out.println("打开键盘");}public void input(){System.out.println("通过键盘进行输入");}@Overridepublic void closeUSBDevice() {System.out.println("关闭键盘");}
}// 鼠标类实现 USB 接口
public class Mouse implements IUSB{@Overridepublic void openUSBDevice(){System.out.println("打开鼠标");}public void click(){System.out.println("鼠标点击");}@Overridepublic void closeUSBDevice(){System.out.println("关闭鼠标");}
}// 电脑类中使用 USB 接口
public class Computer {public void powerOn(){System.out.println("开机...");}public void powerOff(){System.out.println("关机...");}public void useUSBDevice(IUSB usb){usb.openUSBDevice();// 向下转型不安全// Mouse mouse = (Mouse) usb;// 使用 instanceof if(usb instanceof Mouse){Mouse mouse = (Mouse) usb;mouse.click();}else if(usb instanceof KeyBoard){KeyBoard keyBoard = (KeyBoard)usb;keyBoard.input();}usb.closeUSBDevice();}
}// 测试电脑类
public class TestComputer {public static void main(String[] args) {// 注意:接口的引用可以指向任意实现该接口的对象// 接口的引用可以指向不同实现类的对象,因此就可以实现多态// IUSB usb = new Mouse();// IUSB usb = new KeyBoard();Computer computer = new Computer();computer.powerOn();computer.useUSBDevice(new Mouse());computer.useUSBDevice(new KeyBoard());computer.powerOff();}
}

输出:

在这里插入图片描述

3、特性

  1. 接口类型是一种引用类型,但是不能直接 new 接口的对象。

在这里插入图片描述

  1. 接口的方法都被隐式指定为 public abstract 类型,使用其他修饰符会报错。

在这里插入图片描述

  1. 接口中的变量都被隐式指定为 public static final 类型。

在这里插入图片描述

在这里插入图片描述

  1. 接口中的方法是抽象方法,不能在接口中实现,只能由实现接口的实现类来实现。

在这里插入图片描述

  1. 在类中重写接口中的方法时,必须使用 public 修饰符来修饰。这是因为重写的方法的修饰符优先级必须高于等于原方法,而接口中的抽象方法默认是 public,因此实现类中重写抽象方法时修饰符只能用 public。

在这里插入图片描述

  1. 接口中不能有静态代码块、实例代码块和构造方法。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 接口虽然不是类,但是编译后仍然会生成字节码文件,且后缀仍然是 .class。

在这里插入图片描述

  1. 如果类没有实现接口中的所有抽象方法,那么类必须定义为抽象类。

在这里插入图片描述

  1. jdk8 中:接口中还可以包含 default 方法,便于接口的更新。

在这里插入图片描述

4、实现多个接口

在 Java 中,类和类之间是单继承的,一个类只能有一个基类,即不支持多继承,但是一个类可以实现多个接口。

// 动物类
public abstract class Animal {protected String name;protected String gender;protected int age;// 所有的动物都需要吃饭睡觉,这些是动物的公共方法public abstract void eat();public abstract void sleep();
}// 会飞的接口
public interface IFlying {void fly();
}
// 会跑的接口
public interface IRunning {void run();
}
// 会游泳的接口
public interface ISwimming {void swim();
}// 狗是动物,既会跑,又会游泳
public class Dog extends Animal implements IRunning , ISwimming{@Overridepublic void eat() {System.out.println(name + "在吃骨头~~~");}@Overridepublic void sleep() {System.out.println(name + "睡觉呼呼呼~~~");}@Overridepublic void run() {System.out.println(name + "用四个蹄子跑~~~");}@Overridepublic void swim() {System.out.println(name + "狗刨式~~~");}
}// 鱼是动物,只会游泳
public class Fish extends Animal implements ISwimming {@Overridepublic void eat() {System.out.println(name + "吃泥鳅~~~");}@Overridepublic void sleep() {System.out.println(name + "睁着眼睛睡觉~~~");}@Overridepublic void swim() {System.out.println(name + "水中自由翱翔~~~");}
}

5、接口中的继承

在 Java 中接口与接口之间可以继承,也可以多继承,从而可以用接口达到多继承的目的。

// 两栖的接口
public interface IAmphibious extends IRunning,ISwimming {}// 青蛙是两栖的
public class Frog implements IAmphibious {@Overridepublic void run() {System.out.println("用腿蹦");}@Overridepublic void swim() {System.out.println("用脚蹬");}
}

接口的继承相当于把多个接口合并在一起。

6、接口使用实例

可以利用 Arrays 的 sort 函数对数组进行排序。

public class TestInt {public static void main(String[] args) {int[] array = {4,9,1,8,0,5,7,3,2,6};// 对array数组进行排序Arrays.sort(array);for (int j : array) {System.out.print(j + " ");}System.out.println();// 输出:0 1 2 3 4 5 6 7 8 9 }
}

同样的,我们想要利用 Arrays 的 sort 函数对学生排序,但是尝试同样的方法会报错。

public class Student{String name;int score;public Student(String name, int score) {this.name = name;this.score = score;}public static void main(String[] args) {Student[] students = new Student[] {new Student("张三", 95),new Student("李四", 96),new Student("王五", 97),new Student("赵六", 92),};Arrays.sort(students);for (int i = 0; i < students.length; i++) {System.out.println(students[i]);}}
}

在这里插入图片描述
报错原因在于我们没有实现比较器,而利用 Arrays 的 sort 函数进行排序的对象要求必须实现比较器,即是可比较的。

public class Student implements Comparable<Student>{String name;int score;public Student(String name, int score) {this.name = name;this.score = score;}public static void main(String[] args) {Student[] students = new Student[] {new Student("张三", 95),new Student("李四", 96),new Student("王五", 97),new Student("赵六", 92),};Arrays.sort(students);for (int i = 0; i < students.length; i++) {System.out.println(students[i]);}}@Overridepublic int compareTo(Student o) {// 用 this 和 o 引用的对象的某些字段进行比较return score - o.score;}// 这里要重写 toString 方法,根据需要得到我们想要的输出@Overridepublic String toString() {return "[" + name + "," + score + "]";}
}

输出:

在这里插入图片描述
那么 sort 函数里面是如何工作的,我们可以自己实现冒泡排序。

public class Util {// 冒泡排序// 注意:通过sort方法进行排序时,传进来的元素必须要实现Comparable接口的方法public static void sort(Comparable[] c){// 外循环表示冒泡的趟数for (int i = 0; i < c.length-1; i++) {// 具体冒泡的方式:用相邻的两个元素去比较for (int j = 0; j < c.length - 1 - i; j++) {// 这里的 c 可以引用任何实现该接口的对象// 这里的排序方式是升序if(c[j].compareTo(c[j+1]) >= 0){Comparable temp = c[j];c[j] = c[j+1];c[j+1] = temp;}}}}
}

http://www.hkcw.cn/article/xnhgoFrguT.shtml

相关文章

品牌控价维护渠道生态与品牌价值的关键

在品牌发展的征程中&#xff0c;随着经销商队伍不断壮大&#xff0c;价格管控已成为关乎品牌存亡的核心命题。价格体系一旦失控&#xff0c;渠道乱象便如潮水般涌来。低价倾销不仅挤压正规经销商的生存空间&#xff0c;削弱其市场竞争力&#xff0c;更会引发消费者对产品价值的…

2011肠衣问题

1 D类竞赛题目---具体题目 D题 天然肠衣搭配问题 天然肠衣&#xff08;以下简称肠衣&#xff09;制作加工是我国的一个传统产业&#xff0c;出口量占世界首位。肠衣经过清洗整理后被分割成长度不等的小段&#xff08;原料&#xff09;&#xff0c;进入组装工序。 传统的生产…

Express教程【001】:Express创建基本的Web服务器

文章目录 1、初识express1.1 什么是Express1.2 主要特点1.3 Express的基本使用1.3.1 安装1.3.2 创建基本的Web服务器 1、初识express 目标&#xff1a; 能够使用express.static()快速托管静态资源能够使用express路由精简项目结构能够使用常见的express中间件能够使用express创…

CentOS 7 环境中部署 LNMP(Linux + Nginx + MySQL 5.7 + PHP)

在 CentOS 7 环境中部署 LNMP&#xff08;Linux Nginx MySQL 5.7 PHP&#xff09; 环境的详细步骤如下。此方案确保各组件版本兼容&#xff0c;并提供完整的配置验证流程。 1. 更新系统 sudo yum update -y 2. 安装 MySQL 5.7 2.1 添加 MySQL 官方 YUM 仓库 由于MySQL并不…

从零打造算法题刷题助手:Agent搭建保姆级攻略

我用Trae 做了一个有意思的Agent 「大厂机试助手」。 点击 https://s.trae.com.cn/a/d2a596 立即复刻&#xff0c;一起来玩吧&#xff01; Agent 简介 Agent名称为大厂机试助手&#xff0c;主要功能有以下三点。 解题&#xff1a; 根据用户给出的题目给出具体的解题思路引导做…

华院计算出席信创论坛,分享AI教育创新实践并与燧原科技共同推出教育一体机

5月21日&#xff0c;信创论坛于上海漕河泾会议中心举办。本次论坛以“聚力融合&#xff0c;繁荣生态”为主题&#xff0c;话题聚焦工业制造、交通运输、金融、教育、医疗等领域。华院计算技术&#xff08;上海&#xff09;股份有限公司&#xff08;以下简称“华院计算”&#x…

MyBatis操作数据库

1.MyBatis:MyBatis是一款优秀的持久层框架,用于简化JDBC的开发.(持久层通常指数据访问层,用来操作数据库). 创建userInfo表,并插入如下数据: 在model中建立userinfo实体类,属性与之一一对应. 配置数据库连接字符串,Mybatis中要连接数据库,需要数据库相关参数配置. 接下来就可…

OCC笔记:BRepMesh_IncrementalMesh的使用

1. 函数接口 2. 线性偏转与角度偏转 2.1. theLineDeflection&#xff1a;线性偏转 根据文档推导下 isRelative传入Standard_True时&#xff0c;theLineDeflection为相对值。 参看isRelative说明 //! param isRelative if TRUE deflection used for discretization of //! ea…

调试技巧总结

目录 一.调试1.什么是调试2.调试语义的分类2.1 静态语义2.2 动态语义 二.实用的调试技巧1.屏蔽代码2.借助打印3.查看汇编代码4.调试技巧总结 一.调试 1.什么是调试 调试&#xff0c;通俗易懂地说就是不断排查代码的错误&#xff0c;进行修正的过程&#xff0c;在写代码的时候…

通过实时动作捕捉加速人形机器人训练

通过实时动作捕捉加速人形机器人训练 用于训练、控制和性能优化的精确实时运动学——受到全球机器人创新者的信赖&#xff01; 为什么选择 Xsens 进行人形机器人训练&#xff1f; 无与伦比的运动数据精度-经过科学验证的运动数据&#xff0c;用于简化AI/ML训练。 轻松集成到…

【UE5 C++】绘制地表贴合线

目录 原理 效果 步骤 源码 原理 先设置绘制线段的起点和终点&#xff0c;然后我们将起点和终点的高度升高&#xff0c;然后通过插值&#xff0c;在起点和终点之间添加多个点&#xff0c;再由这些点向地心发出射线&#xff0c;这样我们就可以获取到这些点在地表的投影点&…

01 redis 的环境搭建

前言 这一系列文章主要包含的内容主要是 各种常用软件的调试环境的搭建 主要的目的是 搭建一个可打断点的一个调试环境 c 系列 主要是基于 clion 调试, java 系列主要是基于 idea 调试, js 系列主要是基于 webstorm 调试 需要有一定的 c, c, java, js 相关基础 基于的…

python打卡训练营打卡记录day40

知识点回顾&#xff1a; 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中展平操作&#xff1a;除第一个维度batchsize外全部展平dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模式关闭dropout 作业&#xff1a;仔细学习下测试和训练代码…

Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(五):语音合成输出与交互增强

Tailwind CSS 实战&#xff0c;基于Kooboo构建AI对话框页面&#xff08;一&#xff09; Tailwind CSS 实战&#xff0c;基于Kooboo构建AI对话框页面&#xff08;二&#xff09;&#xff1a;实现交互功能 Tailwind CSS 实战&#xff0c;基于 Kooboo 构建 AI 对话框页面&#x…

【MySQL】MVCC与Read View

目录 一、数据库并发的三种场景 二、读写场景的MVCC &#xff08;一&#xff09;表中的三个隐藏字段 &#xff08;二&#xff09;undo 日志 &#xff08;三&#xff09;模拟MVCC &#xff08;四&#xff09;Read View &#xff08;五&#xff09;当前读和快照读 三、RC和…

代码随想录打卡|Day53 图论(Floyd 算法精讲 、A * 算法精讲 (A star算法)、最短路算法总结篇、图论总结 )

图论part11 Floyd 算法精讲 代码随想录链接 题目链接 代码 三维DP数组 import java.util.Scanner;public class Main {// 定义最大距离值&#xff0c;避免使用Integer.MAX_VALUE防止加法溢出public static final int INF 100000000; // 10^8足够大且不会溢出public static…

CSS Day07

1.搭建项目目录 2.网页头部SEO三大标签 3.Favicon图标与版心 &#xff08;1&#xff09;Favicon图标 &#xff08;2&#xff09;版心 4.快捷导航 5.头部-布局 6.头部-logo 7.头部-导航 8.头部-搜索 9头部-购物车 10.底部-布局 11.底部-服务区域 12.底部-帮助中心 13.底部-版权…

leetcode hot100刷题日记——29.合并两个有序链表

解答&#xff1a; 方法一&#xff1a;递归 递归的边界条件是啥呢&#xff1f; 递归别想那么多具体步骤&#xff0c;考虑大步骤&#xff0c;小的递归自己会去做的 class Solution { public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {//递归比较大小//先考虑…

Spring Boot 整合 Spring Security

DAY30.1 Java核心基础 Spring Boot 整合安全框架 Spring Security 、Shiro Spring Security Spring Security 的核心功能包括认证、授权、攻击防护&#xff0c;通过大量的过滤器和拦截器进行请求的拦截和验证&#xff0c;实现安全校验的功能。 Spring Security 将校验逻辑…

深度剖析Node.js的原理及事件方式

早些年就接触过Node.js&#xff0c;当时对于这个连接前后端框架就感到很特别。尤其是以独特的异步阻塞特性&#xff0c;重塑了了服务器端编程的范式。后来陆陆续续做了不少项目&#xff0c;通过实践对它或多或少增强了不少理解。今天&#xff0c;我试着将从将从原理层剖析其运行…