细谈 Java 匿名内部类 【分别 使用 接口 和 抽象类实现】
2023-09-14 09:06:40 时间
1.前言
匿名内部类是什么东西?
没有名字的内部类就是匿名内部类。
什么场景使用?
匿名内部类适合创建那种只需要一次使用的类。
这是个很有用的东西,可想而知,如果不使用匿名内部类,哪些只需要使用一次的类岂不是需要单独做个文件存放?文件多起来,连名字都不好起,
这算是 给 起名字困难人群 巨大的福利啊!!!直接不要名字啦,哈哈哈哈哈
匿名内部类的使用需要接口或抽象类的使用,而使用抽象类又有点像Java多态知识点用法,当然区别还是有的。
2.操作
(1)使用接口实现匿名内部类
创建一个接口
package com.example.javabaisc.anonymous; public interface InterFood { public void eat(); public void count(); }
创建一个测试类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.example.javabaisc.anonymous; import org.junit.jupiter.api.Test; public class AnoTest { /** * 使用接口实现匿名内部类 */ @Test public void t1(){ //方法一:实例接口后直接配置内部方法来实现逻辑 InterFood interFood = new InterFood() { @Override public void eat() { System.out.println("吃苹果"); } @Override public void count() { System.out.println("100个"); } }; interFood.eat(); interFood.count(); //================================= System.out.println("=============================================="); //方法二:以接口实现的匿名内部类作为对象参数,直接传入方法内使用 AnoTest anoTest = new AnoTest(); anoTest.ano(new InterFood() { @Override public void eat() { System.out.println("这次要吃桃子。"); } @Override public void count() { System.out.println("500个桃子够吗"); } }); } public void ano(InterFood interFood){ interFood.eat(); interFood.count(); } }
打印结果
【注意:
使用接口实现匿名内部类有个明显的缺点,无法传入参数,只能在内部类里面定义死,
但是可以 引入外部的常量,jdk8以下的需要使用final
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.example.javabaisc.anonymous; import org.junit.jupiter.api.Test; public class AnoTest { /** * 使用接口实现匿名内部类 */ @Test public void t1(){ //jdk8以下的需要使用final // final int kk = 666; int kk = 666; //方法一:实例接口后直接配置内部方法来实现逻辑 InterFood interFood = new InterFood() { @Override public void eat() { System.out.println("吃苹果"); } @Override public void count() { System.out.println("100个"); } }; interFood.eat(); interFood.count(); //================================= System.out.println("=============================================="); //方法二:以接口实现的匿名内部类作为对象参数,直接传入方法内使用 AnoTest anoTest = new AnoTest(); anoTest.ano(new InterFood() { @Override public void eat() { System.out.println("这次要吃桃子。"+kk); } @Override public void count() { System.out.println("500个桃子够吗"); } }); } public void ano(InterFood interFood){ interFood.eat(); interFood.count(); } }
打印结果
】
(2)使用抽象类实现匿名内部类
创建一个抽象类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.example.javabaisc.anonymous; //抽象类 abstract public class AbstractFood { //抽象方法 abstract void getCount(); //无参构造函数方法 public AbstractFood() { } //有参构造函数方法 public AbstractFood(String name) { this.name = name; } //变量属性 private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
测试类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.example.javabaisc.anonymous; import org.junit.jupiter.api.Test; public class AnoTest { /** * 使用抽象类实现匿名内部类 */ @Test public void t2() { //方法一:传入参数 AbstractFood abstractFood = new AbstractFood("苹果") { // 初始化块 { System.out.println("匿名内部类的初始化块..."); } @Override void getCount() { System.out.println("200个"); } }; System.out.println(abstractFood.getName()); abstractFood.getCount(); System.out.println("=============================================="); // //方法二: 引用外部参数变量 String mname = "樱桃"; AbstractFood abstractFood2 = new AbstractFood() { // 初始化块 { System.out.println("匿名内部类的初始化块..."); } @Override void getCount() { System.out.println("50个"); } //即便不是抽象方法,也可以覆写类里面的普通方法 @Override public String getName() { return mname; } }; System.out.println(abstractFood2.getName()); abstractFood2.getCount(); System.out.println("=============================================="); // //方法三:匿名内部类作为参数传入方法中 AnoTest anoTest = new AnoTest(); anoTest.abs(new AbstractFood("火龙果") { // 初始化块 { System.out.println("匿名内部类的初始化块..."); } @Override void getCount() { System.out.println("10个"); } }); } public void abs(AbstractFood abstractFood) { System.out.println(abstractFood.getName()); abstractFood.getCount(); } }
打印结果
相关文章
- java基础知识回顾之接口
- Java泛型--泛型应用--泛型接口、泛型方法、泛型数组、泛型嵌套
- java笔记三:List接口
- Java实现 蓝桥杯 算法提高 菱形
- Java实现 LeetCode 590 N叉树的后序遍历(遍历树,迭代法)
- Java实现One-way traffic(单向交通)
- java实现取球博弈
- Java实现 蓝桥杯VIP 算法提高 超级玛丽
- Java中实现序列化的两种方式 Serializable 接口和 Externalizable接口
- mysql、sqlserver、oracle分页,java分页统一接口实现
- Java 三种方式实现接口校验
- Scala特质trait具备Java中类和接口的功能
- Java面向接口编程
- Java代码示例: 使用reflections工具类获取某接口下所有的实现类
- 表格存储新手指南:Java SDK异步接口的使用
- Atitit java func interface sumup 目录 1. 函数式接口1 1.1.1. 什么是函数式接口?1 1.2. Function, Supplier, Cons
- Java调用第三方http接口的方式总结(四种)
- java中接口的定义与实现
- java中集合类中Collection接口中的Map接口的常用方法熟悉
- java接口中的成员方法和成员变量
- java 泛型 -- 泛型类,泛型接口,泛型方法
- Java中如何动态创建接口的实现