java面向对象进阶进阶篇--《JDK8,JDK9接口中新增的方法、接口的应用、适配器设计模式》

个人主页→VON

收录专栏→java从入门到起飞

接口→接口和接口与抽象类综合案例

 

一、JDK8接口中新增的方法

在JDK 8中,接口新增了几个重要的特性和方法,其中最显著的是默认方法(Default Methods)和静态方法(Static Methods)。这些特性使得接口在Java编程语言中变得更加灵活和功能强大。

默认方法(Default Methods):

默认方法允许在接口中定义具体的方法实现,而不再是纯粹的抽象方法集合。主要特点包括:

  • 实现方法:接口可以包含带有默认实现的方法体
  • 兼容性:默认方法的引入不会破坏现有的接口实现,因为现有实现不需要强制重写新增的默认方法。
  • 多继承冲突解决:如果一个类实现了多个接口,并且这些接口具有相同的默认方法,编译器会要求显式重写冲突的方法,以明确指定使用哪个接口的方法

注意事项:

1. 默认方法不是抽象方法,所以不强制重写,但是重写时别忘了去掉default关键字。

 示例:
InterA接口
package com.von.day15b;public interface InterA {public default void showA(){System.out.println("showA");}
}
InterImpl类
package com.von.day15b;public class InterImpl implements InterA{@Overridepublic void showA() {System.out.println("重写showA");}
}
结果展示: 

2. 定义默认方法时default不能省略。

3. 如果实现多个接口,并且多个接口中有相同的名字,子类就必须对该方法重写。 

示例: 
InterA
package com.von.day15b;public interface InterA {public default void showA(){System.out.println("A接口中的showA");}
}
InterB
package com.von.day15b;public interface InterB {public default void showA(){System.out.println("B接口中的showA");}public default void showB(){System.out.println("showB");}
}
InterImpl
package com.von.day15b;public class InterImpl implements InterA,InterB{}
结果展示:

静态方法(Static Methods):

接口中还可以定义静态方法,这些方法可以直接通过接口名调用,不需要实现类的实例。

接口中其他新增方法:

除了默认方法和静态方法,JDK 8中还新增了一些其他方法,以增强接口的功能:

  • 函数式接口(Functional Interface):引入了 @FunctionalInterface 注解,用于标识函数式接口,即只包含一个抽象方法的接口。

  • 接口中的方法可以有方法体:除了默认方法和静态方法外,还可以在接口中直接定义方法体的普通方法。

  • 接口中方法的可访问性:接口中的方法可以是 publicdefault 访问级别,不允许使用 privateprotected 访问级别。

 示例:

@FunctionalInterface
interface MathOperation {int operate(int a, int b);default void log() {System.out.println("MathOperation interface");}static void info() {System.out.println("Static method in MathOperation interface");}
}public class Main {public static void main(String[] args) {MathOperation addition = (a, b) -> a + b;MathOperation subtraction = (a, b) -> a - b;System.out.println(addition.operate(10, 5)); // 输出 15System.out.println(subtraction.operate(10, 5)); // 输出 5addition.log(); // 输出 "MathOperation interface"MathOperation.info(); // 输出 "Static method in MathOperation interface"}
}

在这个示例中,MathOperation 接口定义了一个抽象方法 operate,一个默认方法 log,和一个静态方法 infoMain 类实现了函数式接口,并展示了如何使用接口的不同方法。 

二、JDK9接口中新增的方法

JDK 9 在接口方面的改进相对于 JDK 8 并不多,但是在整体 Java 平台和语言的功能上有一些显著的变化和新增特性。

私有方法(Private Methods)

JDK 9 允许接口中定义私有方法,这些方法只能在接口内部使用,对实现类和其他类不可见。这使得接口能够更好地组织和重用代码逻辑。

interface MyInterface {default void publicMethod() {// 可调用私有方法privateMethod();}private void privateMethod() {// 接口内部私有方法的实现}
}

接口中的静态私有方法(Static Private Methods)

除了实例私有方法,JDK 9 还引入了接口中的静态私有方法,这些方法可以在接口的静态方法和默认方法中重复使用。

interface MyInterface {static void staticMethod() {// 可调用静态私有方法staticPrivateMethod();}private static void staticPrivateMethod() {// 接口内部静态私有方法的实现}
}

兼容性注解(@Deprecated, @DeprecatedSince)

JDK 9 引入了两个新的注解 @Deprecated@DeprecatedSince,用于指定一个方法或接口已被弃用以及自从哪个版本开始弃用。

@Deprecated(since="9.0")
interface MyDeprecatedInterface {@Deprecated(since="9.0")void deprecatedMethod();
}

三、接口的应用

接口在Java中是一种非常重要的概念,它提供了一种定义方法签名而不实现方法体的方式,这使得接口在Java编程中具有广泛的应用场景和优势。

实现多态: 接口允许类在不同的上下文中具有不同的行为。通过实现相同的接口,不同的类可以按照自己的方式实现接口中的方法,从而实现多态性,增加代码的灵活性和可扩展性。

interface Animal {void makeSound();
}class Dog implements Animal {public void makeSound() {System.out.println("Woof");}
}class Cat implements Animal {public void makeSound() {System.out.println("Meow");}
}

 实现服务提供者接口: 接口可以用于定义服务的契约,不同的实现类可以提供不同的服务实现。这种模式在插件化和模块化系统中特别有用。

interface DatabaseConnector {void connect();
}class MySQLConnector implements DatabaseConnector {public void connect() {System.out.println("Connecting to MySQL database...");}
}class PostgreSQLConnector implements DatabaseConnector {public void connect() {System.out.println("Connecting to PostgreSQL database...");}
}

 解耦合: 接口有助于解耦合,即减少代码间的依赖性。程序员可以编写针对接口的代码,而不是具体的实现类,从而使得代码更容易维护和扩展。

interface Logger {void log(String message);
}class FileLogger implements Logger {public void log(String message) {// Log message to file}
}class ConsoleLogger implements Logger {public void log(String message) {// Log message to console}
}

 实现回调机制: 接口可以用于实现回调机制,即某个对象在特定事件发生时调用另一个对象的方法。这在事件驱动编程和异步处理中非常常见。

interface Callback {void onComplete(String result);
}class Task {void execute(Callback callback) {// Perform some task and invoke callbackcallback.onComplete("Task completed successfully");}
}

函数式接口和Lambda表达式: Java 8 引入了函数式接口的概念,即只包含一个抽象方法的接口。这种接口可以用Lambda表达式来实现,提供了更加简洁和灵活的函数式编程方式。 

@FunctionalInterface
interface MyFunction {void perform();
}public class Main {public static void main(String[] args) {MyFunction func = () -> System.out.println("Performing function");func.perform();}
}

四、适配器设计模式

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许接口不兼容的对象可以相互合作。适配器模式通常用于旧接口与新系统之间的适配,或者不同接口之间的适配。

结构和角色

适配器模式涉及以下几个角色:

  • 目标接口(Target): 目标接口是客户端期待使用的接口。客户端通过目标接口与适配器交互,调用在目标接口中定义的方法。

  • 适配器(Adapter): 适配器实现了目标接口,并且包装了一个被适配者(Adaptee)。它将客户端的请求转换为对被适配者的相应调用。

  • 被适配者(Adaptee): 被适配者是原本存在的接口,但它与客户端要求的接口不兼容。适配器通过包装被适配者,使其与客户端能够兼容。

工作原理和应用场景

适配器模式的工作原理是通过创建一个中间层(适配器),将客户端的请求转换为被适配者可以理解的请求。这种模式常见于以下几种情况:

  • 系统升级与兼容:当系统进行升级或者集成时,可能需要与旧系统进行适配,以保证新旧系统能够无缝衔接。

  • 第三方库或组件的使用:当使用第三方库或组件时,其接口可能与当前系统的接口不匹配,需要通过适配器进行适配。

  • 接口的转换:当需要将一个接口转换成另一个接口时,可以使用适配器模式。

示例:

// 目标接口
interface Smartphone {void charge();
}// 被适配者(电子书阅读器)
class EBookReader {void powerOn() {System.out.println("EBookReader is powering on.");}void turnPage() {System.out.println("EBookReader is turning the page.");}
}// 适配器
class EBookReaderAdapter implements Smartphone {private EBookReader reader;EBookReaderAdapter(EBookReader reader) {this.reader = reader;}@Overridepublic void charge() {reader.powerOn();System.out.println("Charging EBookReader...");}
}// 客户端代码
public class Client {public static void main(String[] args) {EBookReader kindle = new EBookReader();Smartphone smartphone = new EBookReaderAdapter(kindle);smartphone.charge(); // 使用智能手机充电}
}

 在上面的示例中,EBookReader是被适配者,它有自己的一些方法,但是没有charge()方法。通过EBookReaderAdapter适配器,我们实现了Smartphone接口,并在charge()方法中调用了EBookReader的方法,从而将其适配成了一个智能手机可以使用的接口。

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

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

相关文章

Linux嵌入式学习——数据结构——线性表的链式结构

线性表的链式存储 解决顺序存储的缺点,插入和删除,动态存储问题。 特点: 线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素,存储单元可以是连续的,也可以不连续。可以被存储在任意内存未被占…

使用lotusscript控制台吧!

大家好,才是真的好。 我们的公众号通常会涉及到很多lotusScript代码功能,写lotusScript代码时,我常常在想,这行语句明明是对的,为什么会有报错? 为此,常常会在语句中加入on error goto语句&am…

【Git多人协作开发】不同的分支下的多人协作开发模式

目录 0.前言背景 1.开发者1☞完成准备工作&协作开发 1.1查看分支情况 1.2创建本地分支feature-1 1.3三板斧 1.4push推本地分支feature-1到远程仓库 2.开发者2☞完成准备工作&协作开发 2.1创建本地分支feature-2 2.2三板斧 2.2push推送本地feature-2到远程仓库…

黑马JavaWeb企业级开发(知识清单)01——前端介绍,HTML实现标题:排版

文章目录 前言一、认识web前端、HTML、CSS二、VS Code开发工具&#xff08;插件弃用问题&#xff09;三、HTML结构标签介绍1. 标签页标题< title >2. 图片标签< img >1) 常见属性2) src路径书写方式 3. 标题标签< h >4. 水平分页线标签< hr > 四、用Vs…

生成树协议配置与分析

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、相关知识 1、生成树协议简介 生成树协议&#xff08;STP&#xff09;是一种避免数据链路层逻辑环路的机制&#xff0c;它通过信息交互识别环路并…

ZLMRTCClient配置说明与用法(含示例)

webRTC播放视频 后面在项目中会用到通过推拉播放视频流的技术&#xff0c;所以最近预研了一下webRTC 首先需要引入封装好的webRTC客户端的js文件ZLMRTCClient.js 下面是地址需要的自行下载 http://my.zsyou.top/2024/ZLMRTCClient.js 配置说明 new ZLMRTCClient.Endpoint…

AI/机器学习(计算机视觉/NLP)方向面试复习2

1. 用pytorch写一个self-attention 继承pytorch.nn.Module的类 代码&#xff1a; import torch import torch.nn as nn import torch.nn.functional as Fclass SelfAttention(nn.Module):def __init__(self, embed_size): # (B,T,C)super(SelfAttention, self).__init__()sel…

如何优化 Selenium 和 BeautifulSoup 的集成以提高数据抓取的效率?

摘要 在互联网时代&#xff0c;数据的价值日益凸显。对于电商网站如京东&#xff0c;其商品信息、用户评价等数据对于市场分析、产品定位等具有重要意义。然而&#xff0c;由于这些网站通常使用 JavaScript 动态生成内容&#xff0c;传统的爬虫技术难以直接获取到完整数据。本…

手机空号过滤批量查询的意义及方法

手机空号过滤批量查询是现代营销和通信管理中常用的技术手段&#xff0c;旨在通过批量处理手机号码&#xff0c;筛选出活跃号码和空号等无效号码&#xff0c;以提高营销效率和减少不必要的通信成本。以下是关于手机空号过滤批量查询的详细解答&#xff1a; 一、手机空号过滤批…

逆向笔记-某贴

逆向环境搭建 雷电模拟器9LsposedMagisk DeltaMTNP管理器算法助手2.1.2 软件链接&#xff1a; https://llzai.lanzouv.com/iWgV125h6vwj 密码:a0zy 主要注释代码 捕获窗口&#xff0c;查看日志&#xff0c;定位代码 找到show的里面的alertdialog的相关行都注释掉就好了&am…

HTML5-canvas1

1、canvas&#xff1a;创建画布 <canvas id"canvas"></canvas>2、画一条直线 var canvasdocument.getElementById(cancas&#xff09;; canvas.width800; canvas.height800; var contextcanvas.getContext(2d); //获得2d绘图上下文环境 //画一条直线 c…

全新AI工具——PaintsUndo:一键自动还原图像绘画过程!

ControlNet 作者 Lvmin Zhang 又开始整活了&#xff01;这次发布的PaintsUndo 只需要上传一张图片&#xff0c; 就能够一键生成绘画过程&#xff01;快来了解学习&#xff01; 1、核心技术 PaintsUndo 是一项突破性的技术&#xff0c;旨在通过输入静态图像&#xff0c;自动生…

基于vue-grid-layout插件(vue版本)实现增删改查/拖拽自动排序等功能(已验证、可正常运行)

前端时间有个需求&#xff0c;需要对33&#xff08;不一定&#xff0c;也可能多行&#xff09;的卡片布局&#xff0c;进行拖拽&#xff0c;拖拽过程中自动排序&#xff0c;以下代码是基于vue2&#xff0c;可直接运行&#xff0c;报错可评论滴我 部分代码优化来自于GPT4o和Clau…

Live555源码阅读笔记:哈希表的实现

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

Air780EP模块 LuatOS开发-MQTT接入阿里云应用指南

简介 本文简单讲述了利用LuatOS-Air进行二次开发&#xff0c;采用一型一密、一机一密两种方式认证方式连接阿里云。整体结构如图 关联文档和使用工具&#xff1a;LuatOS库阿里云平台 准备工作 Air780EP_全IO开发板一套&#xff0c;包括天线SIM卡&#xff0c;USB线 PC电脑&…

【时时三省】unity test 测试框架 下载

目录 1&#xff0c;unity test 测试框架介绍 2&#xff0c;源码下载 3&#xff0c;目录架构 4&#xff0c;git for window 下载安装方法&#xff1a; 1&#xff0c;unity test 测试框架介绍 Unity是一个用于C语言的轻量级单元测试框架。它由Throw The Switch团队开发&#…

LINUX客户端client(socket、connect,write)实现客户端发送,服务器接收

SERVICE端见前一篇文章 5. 客户端连接函数 connect()&#xff08;与前面的bind一样&#xff09; int connect (int sockfd, struct sockaddr * serv_addr, int addrlen) 参数&#xff1a; sockfd: 通过 socket() 函数拿到的 fd addr:struct sockaddr 的结构体变量地址 addr…

深入指南:VitePress 如何自定义样式

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

二级医院LIS系统源码,医学检验系统,支持DB2,Oracle,MS SQLServer等主流数据库

系统概述&#xff1a; LIS系统即实验室信息管理系统。LIS系统能实现临床检验信息化&#xff0c;检验科信息管理自动化。其主要功能是将检验科的实验仪器传出的检验数据经数据分析后&#xff0c;自动生成打印报告&#xff0c;通过网络存储在数据库中&#xff0c;使医生能够通过医…

[Vulnhub] Acid-Reloaded SQLI+图片数据隐写提取+Pkexec权限提升+Overlayfs权限提升

信息收集 IP AddressOpening Ports192.168.101.158TCP:22,33447 $ nmap -p- 192.168.101.158 --min-rate 1000 -sC -sV Not shown: 65534 closed tcp ports (conn-refused) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.7p1 Ubuntu 5ubuntu1.3 (Ubuntu Lin…