深入理解 Java 中的接口(Interface)

在 Java 中,接口(Interface) 是一种特殊的抽象类型,用于定义类的行为规范。它是面向对象编程中实现多态解耦的重要工具,常用于设计模块化、可扩展的系统。

本文将全面介绍 Java 接口的概念、特性、实现方法以及使用场景,并通过示例代码帮助你更好地掌握它。


1. 什么是接口?

接口(Interface)是 Java 中一种特殊的类型,它是一个完全抽象的类,只能包含方法的声明和常量。接口定义了某一类对象的行为,但不涉及具体实现。

接口的特点:

  1. 不能包含实例变量,只能包含常量(static final 修饰)。
  2. 不能包含具体实现的方法(Java 8 之前)。
  3. 可以被类实现(implements),一个类可以实现多个接口。
  4. 支持默认方法和静态方法(Java 8 引入)。
  5. 可以包含私有方法(Java 9 引入,仅供接口内部使用)。

2. 定义接口

在 Java 中,接口通过关键字 interface 定义。以下是接口的基本定义语法:

public interface InterfaceName {// 常量int CONSTANT_VALUE = 100; // 默认 public static final// 抽象方法(默认 public abstract)void abstractMethod();// 默认方法(Java 8 引入)default void defaultMethod() {System.out.println("This is a default method in the interface.");}// 静态方法(Java 8 引入)static void staticMethod() {System.out.println("This is a static method in the interface.");}
}

3. 接口的实现

接口中的方法需要由类来实现。一个类可以通过 implements 关键字实现接口,并需要实现接口中所有的抽象方法。

示例:接口的实现

// 定义接口
public interface Animal {void eat();void sleep();
}// 实现接口的类
public class Dog implements Animal {@Overridepublic void eat() {System.out.println("Dog is eating.");}@Overridepublic void sleep() {System.out.println("Dog is sleeping.");}
}// 测试类
public class Main {public static void main(String[] args) {Animal dog = new Dog();dog.eat();dog.sleep();}
}

输出

Dog is eating.
Dog is sleeping.

4. 接口的多继承和多实现

接口的多继承

接口可以继承多个其他接口。这是 Java 中唯一允许多继承的情况。

interface A {void methodA();
}interface B {void methodB();
}// 接口 C 继承了 A 和 B
interface C extends A, B {void methodC();
}

类的多实现

一个类可以实现多个接口,这使得接口成为实现多态的工具。

interface A {void methodA();
}interface B {void methodB();
}class MyClass implements A, B {@Overridepublic void methodA() {System.out.println("Implementing methodA");}@Overridepublic void methodB() {System.out.println("Implementing methodB");}
}public class Main {public static void main(String[] args) {MyClass obj = new MyClass();obj.methodA();obj.methodB();}
}

输出

Implementing methodA
Implementing methodB

5. Java 8 中的接口新特性

Java 8 对接口进行了扩展,增加了默认方法(default)和静态方法(static),使得接口可以拥有部分实现。

5.1 默认方法(Default Method)

默认方法是接口中的一种普通方法,使用 default 关键字修饰。实现类可以直接使用,也可以选择重写。

interface Greeting {void sayHello();// 默认方法default void sayGoodbye() {System.out.println("Goodbye from Greeting interface.");}
}class EnglishGreeting implements Greeting {@Overridepublic void sayHello() {System.out.println("Hello!");}// 重写默认方法@Overridepublic void sayGoodbye() {System.out.println("Goodbye in English.");}
}public class Main {public static void main(String[] args) {Greeting greeting = new EnglishGreeting();greeting.sayHello();greeting.sayGoodbye();}
}

展开

输出

Hello!
Goodbye in English.

5.2 静态方法(Static Method)

接口中的静态方法只能通过接口名调用,不能被实现类继承或重写。

interface MathUtils {static int add(int a, int b) {return a + b;}
}public class Main {public static void main(String[] args) {int result = MathUtils.add(5, 3); // 通过接口名调用静态方法System.out.println("Result: " + result);}
}

输出

Result: 8

6. Java 9 中的接口新特性

Java 9 引入了接口的私有方法,私有方法只能在接口内部调用,用于重用代码。

interface Printer {default void print() {printHeader();System.out.println("This is the content.");}private void printHeader() {System.out.println("Header: Private method in interface.");}
}class MyPrinter implements Printer {}public class Main {public static void main(String[] args) {Printer printer = new MyPrinter();printer.print();}
}

输出

Header: Private method in interface.
This is the content.

7. 接口的应用场景

  1. 定义行为规范:接口用于定义行为规范,比如 Comparable 接口规范了对象的比较行为。
  2. 解耦:通过接口编程可以降低模块间的耦合度。
  3. 多态:一个类可以实现多个接口,从而实现多态。
  4. 函数式编程:Java 8 的函数式接口(FunctionalInterface)广泛用于 Lambda 表达式。

8. 接口与抽象类的区别

特性接口(Interface)抽象类(Abstract Class)
定义关键字interfaceabstract class
变量只能包含 static final 常量可以包含实例变量
方法只能包含抽象方法、默认方法和静态方法可以包含抽象方法和具体方法
构造方法不允许可以包含构造方法
继承关系一个类可以实现多个接口一个类只能继承一个抽象类
使用场景定义行为规范共享代码并定义通用行为

9. 总结

Java 中的接口是一个非常强大的工具,提供了行为规范和多态支持。从 Java 8 开始,接口的功能被进一步扩展,可以包含默认方法、静态方法以及私有方法,变得更加灵活和实用。

什么时候使用接口?

  • 当需要定义一组行为规范,而不涉及实现时。
  • 当需要支持多继承时。
  • 当希望通过接口实现解耦和多态时。

通过灵活运用接口,可以让代码更加规范、模块化和可扩展。希望这篇文章能帮助你更好地理解和使用 Java 中的接口!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/497238.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Quartz任务调度框架实现任务动态执行

说明:之前使用Quartz,都是写好Job,指定一个时间点,到点执行。最近有个需求,需要根据前端用户设置的时间点去执行,也就是说任务执行的时间点是动态变化的。本文介绍如何用Quartz任务调度框架实现任务动态执行…

HarmonyOS Next 实现登录注册页面(ARKTS) 并使用Springboot作为后端提供接口

1. HarmonyOS next ArkTS ArkTS围绕应用开发在 TypeScript (简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集 ArkTS在TS的基础上扩展了struct和很多的装饰器以达到描述UI和状态管理的目的 以下代码是一个基于…

基于 Ragflow 搭建知识库-初步实践

基于 Ragflow 搭建知识库-初步实践 一、简介 Ragflow 是一个强大的工具,可用于构建知识库,实现高效的知识检索和查询功能。本文介绍如何利用 Ragflow 搭建知识库,包括环境准备、安装步骤、配置过程以及基本使用方法。 二、环境准备 硬件要…

加载Tokenizer和基础模型的解析及文件介绍:from_pretrained到底加载了什么?

加载Tokenizer和基础模型的解析及文件介绍 在使用Hugging Face的transformers库加载Tokenizer和基础模型时,涉及到许多文件的调用和解析。这篇博客将详细介绍这些文件的功能和它们在加载过程中的作用,同时结合代码片段进行解析。 下图是我本地下载好模…

链式二叉树的基本操作,前序、中序以及后序遍历(递归实现,非递归实现)【有图解】

文章目录 结点设置二叉树的遍历前序、中序以及后序遍历 递归实现前序、中序以及后序遍历 非递归实现层序遍历 结点的个数叶子结点的个数第k层结点的个数值为x的结点树的最大深度二叉树的销毁 结点设置 既然是链式二叉树,那必须得有自己的结点类型,以下是…

使用 Docker 搭建 Hadoop 集群

1.1. 启用 WSL 与虚拟机平台 1.1.1. 启用功能 启用 WSL并使用 Moba 连接-CSDN博客 1.2 安装 Docker Desktop 最新版本链接:Docker Desktop: The #1 Containerization Tool for Developers | Docker 指定版本链接:Docker Desktop release notes | Do…

3.若依前端项目拉取、部署、访问

因为默认RuoYi-Vue是使用的Vue2,所以需要另外去下载vue3来部署。 拉取代码 git clone https://gitee.com/ys-gitee/RuoYi-Vue3.git 安装node才能执行npm相关的命令 执行命令npm install 如果npm install比较慢的话,需要添加上国内镜像 npm install --registrhttp…

Docker安装体验kuboard-k8s多集群管理工具

文章目录 1.kuboard是什么?2.docker安装命令2.1 Linux上docker环境安装命令2.2 Windows上docker环境安装命令 3.登录访问3.1首页访问地址3.2 默认账号密码3.3 登录页3.4 首页 4总结 1.kuboard是什么? 参看官网: https://kuboard.cn/gitHub项目地址&…

重学设计模式-责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它通过将请求沿着链传递,使多个对象都有机会处理该请求,从而避免了请求的发送者与接收者之间的耦合关系。本文将详细介绍责任链模式的定义、优缺点、应…

SuperMap iClient3D for Cesium等高线标注

kele 前言 在三维地形分析中,等高线分析是一种非常重要的分析方法,它能直观的表达出地形的高低起伏特征,在三维系统中受到广泛应用。在SuperMap iClient3D for Cesium中,等高线分析是前端GPU分析,能够分析并渲染出等高…

简易共享屏幕工具改进版

昨天心血来潮写了一篇关于简易共享屏幕工具的文章,发现也有一些阅读量,并且我对于它的效果不是很满意 ,实际呈现的帧率还是太低了。所以我今天换了更高效的方式来实现。 50 行代码简易屏幕共享工具 改进 降低分辨率 昨天那个测试的帧率低&a…

4.银河麒麟V10(ARM) 离线安装 MySQL

1. 系统版本 [rootga-sit-cssjgj-db-01u ~]# nkvers ############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server release V10 (Lance)Kernel: 4.19.90-52.39.v2207.ky10.aarch64Build: Kylin Linux Advanced Server release V10 (SP3) /(La…

图像处理-Ch5-图像复原与重建

Ch5 图像复原 文章目录 Ch5 图像复原图像退化与复原(Image Degradation and Restoration)噪声模型(Noise Models)i.i.d.空间随机噪声(Generating Spatial Random Noise with a Specified Distribution)周期噪声(Periodic Noise)估计噪声参数(Estimating Noise Parameters) 在仅…

「下载」智慧园区及重点区域安全防范解决方案:框架统一规划,建设集成管理平台

智慧园区在基础设施建设和管理上仍存在诸多挑战。园区内场景碎片化、系统独立化、数据无交互、应用无联动等问题普遍存在,导致管理效率低下,安全隐患频发。 各安保系统如视频监控系统、报警管理系统、门禁管理系统等独立运行,数据不共享&…

LeetCode - Google 校招100题 第6天 回溯法(Backtracking) (8题)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/144743505 LeetCode 合计最常见的 112 题: 校招100题 第1天 链表(List) (19题)校招100题 第2天 树(Tree) (21题)校招100题 第3天 动态规划(DP) (20题)

Elasticsearch检索之三:官方推荐方案search_after检索实现(golang)

Elasticsearch8.17.0在mac上的安装 Kibana8.17.0在mac上的安装 Elasticsearch检索方案之一:使用fromsize实现分页 快速掌握Elasticsearch检索之二:滚动查询(scrool)获取全量数据(golang) 1、search_after检索 在前面的文章介绍了fromsize的普通分页…

网易企业邮箱登陆:保障数据安全

网易企业邮箱是一款为企业提供安全可靠的电子邮件服务的工具。通过网易企业邮箱,企业可以实现员工之间的高效沟通和信息共享,同时保障数据的安全性。 企业邮箱的安全性是企业信息保护的重要组成部分。网易企业邮箱采用了多层加密技术,确保邮件…

3.银河麒麟V10 离线安装Nginx

1. 下载nginx离线安装包 前往官网下载离线压缩包 2. 下载3个依赖 openssl依赖,前往 官网下载 pcre2依赖下载,前往Git下载 zlib依赖下载,前往Git下载 下载完成后完整的包如下: 如果网速下载不到请使用网盘下载 通过网盘分享的文件…

Hive其十,优化和数据倾斜

目录 Hive优化 1、开启本地模式 2、explain分析SQL语句 3、修改Fetch操作 4、开启hive的严格模式【提高了安全性】 5、JVM重用 6、分区、分桶以及压缩 7、合理设置map和reduce的数量 合理设置map数量: 设置合理的reducer的个数 8、设置并行执行 9、CBO优…

uniapp通过v-if进行判断时,会出现闪屏?【已解决】

1.问题:按钮切换时,通过v-if来判断,会出现闪烁情况,影响用户体验 2.v-if 闪烁问题可能的原因 ‌条件切换频繁‌:如果 v-if 指令的条件在短时间内频繁切换,会导致元素不断被销毁和重新创建,从而…