接口的多态性,匿名对象,匿名实现类,匿名实现类的匿名对象,太优雅了
一、我的理解
二、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类型,至于底层是Mouse、Keyboard还是那个匿名的U盘,调用者根本不关心,只要你能start()和stop()就行。
总结
从定义单独的类,到匿名内部类,再到最后的匿名对象传参,这是一个不断做减法的过程。
| 方式 | 特点 | 适用场景 |
|---|---|---|
| 具名实现类 | 结构清晰,可复用 | 业务复杂,需要在多处使用的组件 |
| 匿名实现类(有变量) | 灵活,无需单独文件 | 逻辑稍复杂,需要多次调用该临时对象 |
| 匿名实现类(无变量) | 极致简洁,一次性 | 事件监听、线程启动、简单的回调策略 |
当你写出最后那种代码时,看着那一连串行云流水的操作,真的会忍不住感叹一句:Java,真香!