学习Java42天

接口 (Interface)

一、接口的基本概念

1. 定义与性质
  • 定义:接口是 Java 中的一种引用数据类型,用于定义一组行为规范规则

  • 关键字interface

  • 格式

    java

    public interface 接口名 { // 接口内容 }
  • 核心性质

    • 接口不能被实例化(不能new接口)。

    • 接口主要用来定义类必须遵循的规则(方法声明)。

    • 它是一种纯粹的“是什么能做什么”的契约。

2. 实现关系
  • 关键字implements

  • 格式

    java

    public class 类名 implements 接口名 { // 类的内容 }

    实现了接口的类称为该接口的“实现类”

3. 实现类的规则

当一个普通类实现一个接口时:

  1. 必须重写接口中的所有抽象方法(推荐,成为具体类)

  2. 或者将自己声明为抽象类(如果不重写所有抽象方法)

java

// 定义接口 public interface Animal { void eat(); // 抽象方法(默认 public abstract) void sleep(); } // 实现方式1:重写所有方法 public class Dog implements Animal { @Override public void eat() { System.out.println("狗吃骨头"); } @Override public void sleep() { System.out.println("狗在睡觉"); } } // 实现方式2:成为抽象类 public abstract class Cat implements Animal { @Override public void eat() { System.out.println("猫吃鱼"); } // 没有重写 sleep() 方法,所以 Cat 必须是抽象类 }

二、接口与类的关系

1. 实现关系的特点
  • 单实现:一个类实现一个接口

  • 多实现:一个类可以实现多个接口

  • 继承与实现共存:一个类可以继承一个父类的同时实现多个接口

java

// 多实现示例 public interface Swimmable { void swim(); } public interface Flyable { void fly(); } // 一个类实现多个接口 public class Duck implements Swimmable, Flyable { @Override public void swim() { System.out.println("鸭子在游泳"); } @Override public void fly() { System.out.println("鸭子在飞"); } } // 继承与实现共存 public class Animal { public void breathe() { System.out.println("呼吸"); } } public class SuperDuck extends Animal implements Swimmable, Flyable { @Override public void swim() { System.out.println("超级鸭游泳"); } @Override public void fly() { System.out.println("超级鸭飞翔"); } }
2. 类、接口之间的各种关系总结
关系类型关键字特点
类与类extends单继承,不支持多继承,但支持多层继承
类与接口implements多实现,一个类可以实现多个接口
接口与接口extends多继承,一个接口可以继承多个接口

接口多继承示例

java

public interface A { void methodA(); } public interface B { void methodB(); } // 接口C继承接口A和B public interface C extends A, B { void methodC(); } // 实现类需要实现所有抽象方法 public class MyClass implements C { @Override public void methodA() { /* 实现 */ } @Override public void methodB() { /* 实现 */ } @Override public void methodC() { /* 实现 */ } }

三、接口的成员特点(JDK 7 及以前)

在 JDK 8 之前,接口中只能包含以下内容:

成员类型特点默认修饰符示例
成员变量常量,必须初始化public static finalint MAX_VALUE = 100;
构造方法没有--
成员方法抽象方法public abstractvoid doSomething();

示例

java

public interface MyInterface { // 常量(public static final 可以省略) public static final int MAX = 100; String NAME = "接口"; // 等价于 public static final String NAME = "接口"; // 抽象方法(public abstract 可以省略) public abstract void show(); void doWork(); // 等价于 public abstract void doWork(); // 不能有构造方法 // public MyInterface() {} // 编译错误! // 不能有普通方法 // public void normalMethod() { } // 编译错误! }

四、JDK 8 及以后接口的新特性

1. 默认方法(Default Method)
  • 目的:解决接口升级问题。当接口需要添加新方法时,如果直接添加抽象方法,会导致所有实现类都要修改。默认方法提供了默认实现,不会破坏现有代码。

  • 格式

    java

    public default 返回值类型 方法名(参数列表) { // 方法体 }
  • 特点

    • 使用default关键字修饰

    • 不是抽象方法,所以不强制重写

    • public可以省略,但default不能省略

    • 可以被实现类直接继承使用,也可以被重写

java

public interface USB { // 抽象方法 void connect(); // 默认方法(解决接口升级问题) default void transferData() { System.out.println("默认的数据传输方式"); } // JDK 8 也可以有静态方法 static void showVersion() { System.out.println("USB 3.0"); } } public class Mouse implements USB { @Override public void connect() { System.out.println("鼠标已连接"); } // 可以不重写 transferData(),使用默认实现 } public class Keyboard implements USB { @Override public void connect() { System.out.println("键盘已连接"); } // 也可以重写默认方法 @Override public void transferData() { System.out.println("键盘使用特殊方式传输数据"); } }
2. 默认方法的冲突规则

当实现类实现了多个接口,且这些接口有同名的默认方法时:

java

public interface A { default void show() { System.out.println("A的show方法"); } } public interface B { default void show() { System.out.println("B的show方法"); } } // 编译错误:必须重写show方法解决冲突 public class C implements A, B { @Override public void show() { // 可以选择调用某一个接口的默认方法 A.super.show(); // 调用A接口的show方法 // 或者提供自己的实现 System.out.println("C重写的show方法"); } }
3. 静态方法(JDK 8)
  • 格式public static 返回值类型 方法名(参数列表) { }

  • 特点

    • 属于接口本身,通过接口名.方法名()调用

    • 不能被子类继承或重写

    • 常用于工具方法

java

public interface MathUtils { static int max(int a, int b) { return a > b ? a : b; } } // 使用 int result = MathUtils.max(10, 20);
4. 私有方法(JDK 9)
  • 目的:为默认方法或静态方法提供内部辅助方法,抽取公共代码,提高代码复用性。

  • 格式

    java

    // 普通私有方法:为默认方法服务 private 返回值类型 方法名(参数列表) { } // 静态私有方法:为静态方法服务 private static 返回值类型 方法名(参数列表) { }
  • 特点:只能在接口内部使用

java

public interface DataProcessor { default void processData(String data) { String cleaned = cleanData(data); // 调用私有方法 System.out.println("处理数据: " + cleaned); } static void validate(String data) { if (isValid(data)) { // 调用私有静态方法 System.out.println("数据有效"); } } // 私有方法(JDK 9+) private String cleanData(String data) { return data.trim().toLowerCase(); } // 私有静态方法(JDK 9+) private static boolean isValid(String data) { return data != null && !data.isEmpty(); } }

五、接口总结对比

版本成员变量构造方法成员方法
JDK 7 及以前只能是常量
public static final
没有只能是抽象方法
public abstract
JDK 8同上同上抽象方法、默认方法(default)、静态方法(static)
JDK 9同上同上增加了私有方法(private)、私有静态方法

六、适配器设计模式

1. 问题场景

当一个接口中有大量抽象方法,但实现类只需要使用其中一部分时,如果直接实现接口,就需要重写所有方法(即使大部分方法体为空)。这会导致代码冗余。

2. 解决方案:适配器模式
  • 核心思想:创建一个中间适配器类,对接口中的所有方法进行空实现

  • 实现步骤

    1. 定义中间类XXXAdapter,用abstract修饰,防止被实例化。

    2. 空实现接口中的所有抽象方法(方法体为空{})。

    3. 真正的实现类继承适配器类,只重写需要的方法。

3. 完整示例

java

// 1. 定义接口(有很多方法) public interface WindowListener { void windowOpened(); void windowClosing(); void windowClosed(); void windowIconified(); void windowDeiconified(); void windowActivated(); void windowDeactivated(); } // 2. 创建适配器类(中间类) public abstract class WindowAdapter implements WindowListener { // 空实现所有方法 @Override public void windowOpened() {} @Override public void windowClosing() {} @Override public void windowClosed() {} @Override public void windowIconified() {} @Override public void windowDeiconified() {} @Override public void windowActivated() {} @Override public void windowDeactivated() {} } // 3. 真正的实现类 public class MyWindow extends WindowAdapter { // 只需要重写关心的方法 @Override public void windowClosing() { System.out.println("窗口正在关闭,执行清理操作..."); System.exit(0); } @Override public void windowOpened() { System.out.println("窗口已打开"); } // 其他方法使用适配器中的空实现,无需重写 } // 4. 使用 public class Test { public static void main(String[] args) { MyWindow window = new MyWindow(); // 只会执行重写的方法 window.windowOpened(); // 输出:窗口已打开 window.windowClosing(); // 输出:窗口正在关闭,执行清理操作... window.windowClosed(); // 无输出(使用空实现) } }

七、接口的应用场景

  1. 定义标准/规范:如 JDBC 接口、Servlet 接口

  2. 解耦:面向接口编程,降低模块间耦合度

  3. 扩展性:通过实现不同接口,为类添加不同能力

  4. 替代多继承:Java 不支持类的多继承,但支持接口的多实现

设计原则面向接口编程,而不是面向实现编程。这样可以提高代码的灵活性、可扩展性和可维护性。

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

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

相关文章

2026年GEO优化服务商推荐:基于多行业场景深度评测,解决品牌可见性与精准增长痛点

在生成式人工智能(AI)深度重塑信息分发与获取规则的当下,企业品牌面临着一个前所未有的战略抉择:如何在AI优先的搜索生态中构建并维持可见性,将技术浪潮转化为确定的商业增长。决策者们普遍焦虑于,在传统搜索引擎…

Emotion2Vec+ Large节省50%算力?高效推理部署实战案例

Emotion2Vec Large节省50%算力?高效推理部署实战案例 1. 引言:为什么语音情感识别需要更高效的方案? 你有没有遇到过这样的问题:想用一个语音情感识别模型做产品集成,结果发现模型太大、推理太慢、资源消耗太高&…

Qwen3-0.6B实战案例:智能问答系统搭建,GPU成本降低50%

Qwen3-0.6B实战案例:智能问答系统搭建,GPU成本降低50% 在AI应用快速落地的今天,如何以更低的成本部署高效、响应快的智能问答系统,是许多企业和开发者关注的核心问题。本文将带你通过一个真实可运行的案例,使用阿里云…

Speech Seaco Paraformer采样率适配指南:16kHz音频预处理完整流程

Speech Seaco Paraformer采样率适配指南:16kHz音频预处理完整流程 1. 引言:为什么采样率对语音识别如此关键? 你有没有遇到过这样的情况:明明录音很清晰,但语音识别结果却错得离谱?比如“人工智能”被识别…

如何选择GEO优化服务商?2026年GEO优化公司全面评测与推荐,直击效果验证与成本痛点

摘要 在生成式人工智能(AIGC)重塑信息分发与获取规则的当下,企业品牌在AI对话答案中的“可见性”与“权威性”已成为决定其未来增长潜力的关键战略资产。传统的搜索引擎优化(SEO)策略在AI优先的搜索环境中逐渐失效…

BERT与ERNIE语义理解对比:中文MLM任务部署评测

BERT与ERNIE语义理解对比:中文MLM任务部署评测 1. 引言:当语义填空变成智能交互 你有没有遇到过这样的场景?写文章时卡在一个成语上,明明知道意思却想不起完整的表达;或者读一段古诗,某个字模糊不清&…

告别高显存消耗!PaddleOCR-VL-WEB在4090上流畅运行OCR任务

告别高显存消耗!PaddleOCR-VL-WEB在4090上流畅运行OCR任务 1. 引言:为什么你需要关注PaddleOCR-VL-WEB? 你是不是也遇到过这样的问题:想本地部署一个强大的OCR模型,结果显存直接爆掉?尤其是当你用的是消费…

Unsloth + DeepSeek实战:快速搭建行业应用

Unsloth DeepSeek实战:快速搭建行业应用 1. 引言 你是否还在为大模型微调速度慢、显存占用高而烦恼?今天,我们来聊聊一个能让你的微调效率起飞的工具——Unsloth。它不仅能让训练速度快上2倍,还能将显存消耗降低70%&#xff0c…

GEO优化哪家强?2026年GEO公司权威排名与推荐,应对算法迭代与数据安全痛点

摘要 在生成式人工智能(AI)深度重构信息分发与商业决策流程的当下,企业品牌在AI对话答案中的“可见性”与“权威性”已成为全新的战略竞争维度。生成式引擎优化(GEO)服务应运而生,旨在系统化校准品牌在智能生态中…

verl多GPU训练配置:扩展性实测报告

verl多GPU训练配置:扩展性实测报告 1. 引言:为什么需要关注verl的多GPU扩展能力? 大型语言模型(LLM)的强化学习后训练,尤其是基于PPO等算法的流程,对计算资源的需求极高。传统的单卡训练方式在…

cv_unet_image-matting实战案例:电商产品图自动抠图系统搭建详细步骤

cv_unet_image-matting实战案例:电商产品图自动抠图系统搭建详细步骤 1. 项目背景与核心价值 在电商运营中,商品主图的质量直接影响转化率。传统人工抠图耗时耗力,尤其面对海量SKU时效率低下。本文将带你从零开始搭建一个基于 cv_unet_imag…

2026年GEO优化公司推荐:企业AI战略深度评测,涵盖工业与专业服务垂直场景痛点

在生成式人工智能(AI)深刻重塑信息分发与商业决策流程的当下,企业品牌在AI对话答案中的“可见性”与“权威性”已取代传统搜索引擎排名,成为决定其未来增长潜力的关键战略资产。然而,面对快速演进的AI平台算法与复…

2026年GEO公司推荐:企业AI战略适配深度评测,直击认知偏差与增长焦虑

摘要 在生成式人工智能重塑信息分发与商业决策流程的当下,企业品牌在AI对话答案中的“可见性”与“权威性”已成为关乎生存与增长的全新战略要地。生成式引擎优化正从一项前沿技术探索,迅速演变为企业决策者必须面对…

FunASR生态最佳实践:Paraformer-large+Gradio多场景应用指南

FunASR生态最佳实践:Paraformer-largeGradio多场景应用指南 1. 为什么你需要一个真正好用的离线语音识别工具? 你有没有遇到过这些情况? 在没有网络的会议室里,想把领导讲话实时转成文字整理纪要,却只能干瞪眼&…

Z-Image-Turbo环境推荐:集成ModelScope依赖的一键镜像使用指南

Z-Image-Turbo环境推荐:集成ModelScope依赖的一键镜像使用指南 1. 引言:为什么你需要一个开箱即用的文生图环境? 你有没有遇到过这种情况:兴致勃勃想试试最新的AI绘画模型,结果第一步下载权重就卡住——30GB、40GB甚…

批量压缩包自动生成,文件管理更省心

批量压缩包自动生成,文件管理更省心 1. 为什么批量处理需要自动化归档? 你有没有遇到过这种情况:手头有一堆图片要处理,比如给100张商品照抠背景,等全部跑完才发现结果散落在各个文件夹里,下载时还得一个…

Supertonic极速TTS镜像揭秘:轻量级设备端语音合成的技术突破

Supertonic极速TTS镜像揭秘:轻量级设备端语音合成的技术突破 你有没有遇到过这样的场景:在离线环境下需要播报一段文字,却因为网络延迟、API调用失败或隐私顾虑而束手无策?又或者,你的边缘设备算力有限,但…

Qwen3-Embedding-4B与Text2Vec模型系列对比实战

Qwen3-Embedding-4B与Text2Vec模型系列对比实战 1. Qwen3-Embedding-4B介绍 Qwen3 Embedding 模型系列是 Qwen 家族中专为文本嵌入和排序任务打造的最新成员,基于强大的 Qwen3 系列基础模型构建。该系列覆盖了从 0.6B 到 8B 不同参数规模的模型版本,满…

分批处理大文件夹,内存占用更稳定

分批处理大文件夹,内存占用更稳定 1. 为什么批量处理会卡顿? 你有没有遇到过这种情况:手头有一整个文件夹的图片要抠图,几百张照片堆在一起,点下“批量处理”按钮后,程序刚开始还跑得挺快,结果…

快速验证微调效果,三步测试模型新能力

快速验证微调效果,三步测试模型新能力 你是否也有过这样的疑问:辛辛苦苦跑完一轮LoRA微调,到底有没有改掉模型的“出厂设置”?它现在是不是真的听你的了? 别急着反复提问试探,更别一头扎进训练日志里找答…