1.前言
匿名内部类是什么东西?
没有名字的内部类就是匿名内部类。
什么场景使用?
匿名内部类适合创建那种只需要一次使用的类。
这是个很有用的东西,可想而知,如果不使用匿名内部类,哪些只需要使用一次的类岂不是需要单独做个文件存放?文件多起来,连名字都不好起,
这算是 给 起名字困难人群 巨大的福利啊!!!直接不要名字啦,哈哈哈哈哈
匿名内部类的使用需要接口或抽象类的使用,而使用抽象类又有点像Java多态知识点用法,当然区别还是有的。
2.操作
(1)使用接口实现匿名内部类
创建一个接口
package com.example.javabaisc.anonymous; public interface InterFood { public void eat(); public void count(); }
创建一个测试类
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
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)使用抽象类实现匿名内部类
创建一个抽象类
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; } }
测试类
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(); } }
打印结果