news 2026/4/27 13:54:20

接口的多态性,匿名对象,匿名实现类,匿名实现类的匿名对象,太优雅了

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
接口的多态性,匿名对象,匿名实现类,匿名实现类的匿名对象,太优雅了

接口的多态性,匿名对象,匿名实现类,匿名实现类的匿名对象,太优雅了

一、我的理解





二、AI 的理解

接口的多态性,匿名对象,匿名实现类,匿名实现类的匿名对象,太优雅了

写Java这么久,最让我觉得“代码如诗”的瞬间,往往不是用了什么高深的设计模式,而是把接口多态和匿名内部类用得炉火纯青的那一刻。

那种“即插即用、用完即走”的潇洒,配合上接口带来的解耦,简直是程序员的浪漫。今天咱们不聊枯燥的概念,直接上代码,看看这四种写法是如何层层递进,最终达到“优雅”的巅峰。

准备工作:舞台搭建

首先,我们需要一个接口和一个使用这个接口的“消费者”。为了演示方便,我们定义一个简单的USB设备接口,和一个Computer类。

// 1. 定义USB接口interfaceUSB{voidstart();// 开始工作voidstop();// 停止工作}// 2. 电脑类,它只认USB接口,不关心具体是什么设备(多态的体现)classComputer{publicvoiddataTransfer(USBusb){System.out.println("电脑:设备已连接,准备传输数据...");usb.start();System.out.println("电脑:数据传输中...");usb.stop();System.out.println("-------------------------");}}
第一层:老老实实的实现类

最开始,我们通常会为每个设备写一个具体的类。这是最基础的多态:父类/接口引用指向子类/实现类对象

// 具体的实现类:鼠标classMouseimplementsUSB{@Overridepublicvoidstart(){System.out.println("鼠标:光标亮起,开始工作");}@Overridepublicvoidstop(){System.out.println("鼠标:光标熄灭,结束工作");}}// 测试代码publicclassTest{publicstaticvoidmain(String[]args){Computercomputer=newComputer();// 【方式一】:创建具名的实现类对象USBmouse=newMouse();computer.dataTransfer(mouse);}}

这种方式中规中矩,但如果你的Mouse类只在当前方法里用一次,专门建一个Mouse.java文件是不是有点浪费?于是,匿名内部类登场了。

第二层:匿名实现类(赋予变量)

我们可以直接在代码逻辑中,“现场”创建一个接口的实现类,并把它赋值给一个变量。这就是匿名实现类

publicclassTest{publicstaticvoidmain(String[]args){Computercomputer=newComputer();// 【方式二】:创建匿名实现类的对象,并赋值给变量 usb1USBusb1=newUSB(){@Overridepublicvoidstart(){System.out.println("匿名键盘:噼里啪啦开始打字");}@Overridepublicvoidstop(){System.out.println("匿名键盘:停止输入");}};computer.dataTransfer(usb1);}}

这里new USB(){...}其实就是创建了一个没有名字的类(编译器会命名为OuterClass$1),并且实现了USB接口。我们把这个“无名氏”的对象交给了usb1变量来保管。

第三层:匿名实现类的匿名对象(极致优雅)

既然这个类只用这一次,那变量名是不是也可以省了?直接把创建对象的过程塞到方法参数里!这就是匿名实现类的匿名对象

publicclassTest{publicstaticvoidmain(String[]args){Computercomputer=newComputer();// 【方式三】:匿名实现类的匿名对象// 既没有类名,也没有变量名,直接作为参数传递computer.dataTransfer(newUSB(){@Overridepublicvoidstart(){System.out.println("匿名U盘:读取扇区,开始工作");}@Overridepublicvoidstop(){System.out.println("匿名U盘:安全弹出");}});}}

这才是真正的优雅!

  • 代码极简:不需要额外定义类文件,不需要额外定义变量。
  • 逻辑内聚:设备的实现逻辑直接就在调用的地方,读代码时一眼就能看懂传进去的是什么行为。
  • 多态的完美体现dataTransfer方法接收的是USB类型,至于底层是MouseKeyboard还是那个匿名的U盘,调用者根本不关心,只要你能start()stop()就行。
总结

从定义单独的类,到匿名内部类,再到最后的匿名对象传参,这是一个不断做减法的过程。

方式特点适用场景
具名实现类结构清晰,可复用业务复杂,需要在多处使用的组件
匿名实现类(有变量)灵活,无需单独文件逻辑稍复杂,需要多次调用该临时对象
匿名实现类(无变量)极致简洁,一次性事件监听、线程启动、简单的回调策略

当你写出最后那种代码时,看着那一连串行云流水的操作,真的会忍不住感叹一句:Java,真香!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 13:52:20

ZYNQ硬件健康监控实战:用XADC和FreeRTOS打造系统状态看门狗

ZYNQ硬件健康监控实战:用XADC和FreeRTOS打造系统状态看门狗 在工业自动化和边缘计算领域,嵌入式系统的可靠性直接关系到生产安全和设备寿命。想象一下,一台24小时运行的工业控制器突然因为芯片过热而宕机,或者由于电源波动导致数据…

作者头像 李华
网站建设 2026/4/27 13:51:39

量化AI编程助手真实贡献:CodeStat工具实战与采纳率分析

1. 项目概述:量化AI在代码库中的真实贡献作为一名在软件开发一线摸爬滚打了十多年的程序员,我最近对一个问题特别着迷:我们每天都在用AI编程助手(比如Cursor、GitHub Copilot、Qoder),它们确实能“唰唰唰”…

作者头像 李华
网站建设 2026/4/27 13:49:52

VetClaw开源兽医诊所管理系统:微服务架构部署与核心模块实战指南

1. 项目概述:一个为兽医诊所量身定制的开源管理利器 如果你在经营一家兽医诊所,或者参与过诊所的日常运营,你大概率会和我有同样的感受:市面上那些通用的客户关系管理(CRM)或企业资源规划(ERP&a…

作者头像 李华
网站建设 2026/4/27 13:49:50

ArabicWeb24:构建高质量阿拉伯语预训练数据集的技术实践

1. 项目背景与核心价值在自然语言处理领域,高质量预训练数据集对模型性能的影响往往比算法本身更重要。阿拉伯语作为全球第五大语言,拥有4.2亿母语使用者,却长期面临优质语料匮乏的困境。传统解决方案主要依赖以下三种数据源:新闻…

作者头像 李华
网站建设 2026/4/27 13:49:33

Agent架构安全分析:模式、风险与实战防护策略

1. 项目概述"2. Agent Architecture Patterns - Security Analysis - NO BS Guide 2"这个标题直指现代分布式系统中的关键安全议题。作为一名在安全架构领域摸爬滚打多年的从业者,我深知agent架构在带来灵活性的同时,也引入了独特的安全挑战。…

作者头像 李华
网站建设 2026/4/27 13:48:47

Agentic-R:智能搜索场景的检索器训练框架解析

1. 项目概述Agentic-R是一个专门为智能搜索场景设计的检索器训练框架。我在实际构建搜索系统时发现,传统检索模型在面对复杂查询意图时表现往往不尽如人意。这个框架的核心理念是通过模拟人类搜索行为中的主动决策过程,让检索器具备类似"智能体&quo…

作者头像 李华