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
注解,用于标识函数式接口,即只包含一个抽象方法的接口。 -
接口中的方法可以有方法体:除了默认方法和静态方法外,还可以在接口中直接定义方法体的普通方法。
-
接口中方法的可访问性:接口中的方法可以是
public
或default
访问级别,不允许使用private
或protected
访问级别。
示例:
@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
,和一个静态方法info
。Main
类实现了函数式接口,并展示了如何使用接口的不同方法。
二、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
的方法,从而将其适配成了一个智能手机可以使用的接口。
相关文章:

java面向对象进阶进阶篇--《JDK8,JDK9接口中新增的方法、接口的应用、适配器设计模式》
个人主页→VON 收录专栏→java从入门到起飞 接口→接口和接口与抽象类综合案例 一、JDK8接口中新增的方法 在JDK 8中,接口新增了几个重要的特性和方法,其中最显著的是默认方法(Default Methods)和静态方法(Static Met…...

15.2 zookeeper java client
15.2 zookeeper java client 1. Zookeeper官方1.1 依赖1.2 Zookeeper客户端连接测试1.3***************************************************************************************1. Zookeeper官方 1.1 依赖 <!-- 集成方式一:官方集成zookeeper依赖 --><dependenc…...

素材管理太繁琐?有这一个就够了!
引言: 在创意行业中,素材管理一直是设计师们的痛点。从灵感的捕捉到作品的完成,每一步都离不开素材的积累与整理。然而,传统的素材管理方式往往繁琐且效率低下,让人头疼不已。今天,我要介绍的这款智能素材管…...

KubeSphere 部署向量数据库 Milvus 实战指南
作者:运维有术星主 Milvus 是一个为通用人工智能(GenAI)应用而构建的开源向量数据库。它以卓越的性能和灵活性,提供了一个强大的平台,用于存储、搜索和管理大规模的向量数据。Milvus 能够执行高速搜索,并以…...

前端canvas——贝塞尔曲线
曲线之美,不在于曲线本身,而在于用的人。 所以就有了这期贝塞尔曲线。 新规矩,先上个GIT。 效果图 开局一张图,代码全靠编。 代码 画骨 先想着怎么画一个心形吧,等你想好了,就知道怎么画了。 首先就还…...
Elasticsearch模糊查询之Wildcard
{“wildcard” : { “LPR.keyword” : { “wildcard” : “${Keyword}”} }},你的示例中使用了 wildcard 查询,它适用于模糊搜索,允许使用通配符(* 和 ?)来匹配字段值。你使用了 keyword 子字段来确保精确匹配,这是一…...

【人工智能】穿越科技迷雾:解锁人工智能、机器学习与深度学习的奥秘之旅
文章目录 前言一、人工智能1. 人工智能概述a.人工智能、机器学习和深度学习b.人工智能发展必备三要素c.小案例 2.人工智能发展历程a.人工智能的起源b.发展历程 3.人工智能的主要分支 二、机器学习1.机器学习工作流程a.什么是机器学习b.机器学习工作流程c.特征工程 2.机器学习算…...
Nginx服务 rewrite、proxy_pass 用rewrite去除URL中的特定参数
Nginx 是一个高性能的开源反向代理服务器,可以用于处理跨域请求、负载均衡和缓存等功能。在本文中,我们将介绍如何使用 Nginx 配置文件来实现反向代理。 我们可以实现跨域请求的处理,同时保护用户的隐私和安全。此外,Nginx 还…...

RocketMQ事务消息机制原理
RocketMQ工作流程 在RocketMQ当中,当消息的生产者将消息生产完成之后,并不会直接将生产好的消息直接投递给消费者,而是先将消息投递个中间的服务,通过这个服务来协调RocketMQ中生产者与消费者之间的消费速度。 那么生产者是如何…...

【C++】选择结构- 嵌套if语句
嵌套if语句的语法格式: if(条件1) { if(条件1满足后判断是否满足此条件) {条件2满足后执行的操作} else {条件2不满足执行的操作} } 下面是一个实例 #include<iostream> using namespace std;int main4() {/*提示用户输入一个高考分数,根据分…...
scrapy解决管道阻塞问题采用threadpool库线程池+twisted同步语法异步编程
实现方法:process_item和download任务函数像下面编写即可,其他管道像往常一样写法 import time import threadpool import random from twisted.internet import deferclass VideoPipeline:def __init__(self):self.pool threadpool.ThreadPool(10) # …...

Axure RP:打造动态交互的大屏可视化设计利器
Axure大屏可视化是指使用Axure RP这款原型设计工具来创建具有视觉冲击力和数据展示功能的大屏幕界面。Axure以其强大的交互设计和丰富的组件库,成为了实现大屏可视化的重要工具之一。以下是对Axure大屏可视化的详细阐述: 一、Axure在大屏可视化中的优势 …...

“八股文”在实际工作中是助力、阻力还是空谈
目录 1.概述 1.1.对实际工作的助力 1.2.存在的问题 2.“八股文”对招聘过程的影响 2.1.“八股文”在筛选候选人时的作用 2.2.面试中的比重及其合理性 2.3.如何平衡“八股文”与实际编程能力的考察 3.“八股文”在日常工作中的实用价值 3.1.在团队协作环境中进行有效沟…...
项目开发:@ControllerAdvice注解的基本应用
目录 简介基本用法全局异常处理全局拦截器全局数据绑定 注解参数1.value(): String[]2.basePackages(): String[]3.basePackageClasses(): Class<?>[]4.assignableTypes(): Class<?>[]5.annotations(): Class<? extends Annotation>[] 三.注解组成总结 简…...

Jmeter三种方式获取数组中多个数据并将其当做下个接口参数入参【附带JSON提取器和CSV格式化】
目录 一、传统方式-JOSN提取器获取接口返回值 1、接口调用获取返回值 2、添加JSON提取器 3、调试程序查看结果 4、添加循环控制器 5、设置count计数器 6、添加请求 7、执行请求 二、CSV参数化 1、将结果写入后置处理程序 2、设置循环处理器 3、添加CSV文件 4、设置…...

C++入门基础:C++中的循环语句
循环语句是编程语言中用来重复执行一段代码直到满足特定条件的一种控制结构。它们对于处理需要重复任务的场景非常有用,比如遍历数组、累加数值、重复执行某项操作直到满足条件等。 但是在使用循环语句的时候需要注意下哈,有时候一不小心会构成死循环或者…...
VUE 基础(二)
1 v-show:根据表达值的真假,切换元素的显示和隐藏 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">&l…...

VMware Cloud Foundation ESXi 主机
一、准备嵌套 ESXi 主机环境# 1)物理 ESXi 主机信息 本次准备用于部署 VCF 嵌套实验环境的物理宿主机的配置信息如下图所示。其实,部署 VCF 环境主要对内存的大小要求比较高,部署完整的管理域相关组件下来差不多就要占用 200 GB左右内存,而对 CPU 和存储的需求可以根据实…...

PyTorch深度学习快速入门(下)
PyTorch深度学习快速入门(下) 一、现有网络模型的使用及修改(一)背景知识(二)修改网络模型的三种方法 二、网络模型的保存与加载(一)保存网络模型的两种方法(二ÿ…...

轻松入门Linux—CentOS,直接拿捏 —/— <1>
一、什么是Linux Linux是一个开源的操作系统,目前是市面上占有率极高的服务器操作系统,目前其分支有很多。是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统 Linux能运行主要的UNIX工具软件、应用程序和网络协议 Linux支持 32…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...