Java重修笔记 第二十七天 匿名内部类
创始人
2024-11-11 15:08:52
0
  • 匿名内部类

1. 定义:无类名(底层自动分配类名“外部类名$1”),既是类也是对象,定义在外部类的局部位置,例如方法体和代码块中,通过new类或接口并在大括号里重写方法来实现

2. 使用场景:需要实现接口,重写接口或类的方法,但只需要用到一次的类,可以用匿名内部类来简化开发,省去开发人员手动创建类和实现接口的过程,将这些过程交给编译器底层实现。直接new接口或类,在大括号里面实现所需的方法就可以了。编译类型是接口,运行类型是匿名内部类。

3. 匿名内部类并不是真的没有类名,只是开发人员交给底层去分配,实际上系统底层会给匿名内部类分配类名,规则是“外部类名$X”,X是匿名内部类的编号,从1开始。

4. 使用匿名内部类必须new分配空间,所以它既是类也是对象,这个类分配完空间后就不能再使用了

public class AnonymousInnerClass {     public static void main(String[] args) {         Outer04 outer04 = new Outer04();         outer04.method();     } }  class Outer04 { // 外部类     private int n1 = 10; // 属性      // 基于接口的匿名内部类的使用     public void method() { // 方法         IA ia = new IA() {             @Override             public void cry() {                 // 重写接口中的方法                 System.out.println("重写的方法...");             }         };         ia.cry();         System.out.println("匿名内部类的运行类型是: " + ia.getClass());         System.out.println("============================");         // 基于类的匿名内部类的使用         Father father = new Father("jack") {             @Override             public void test() {                 System.out.println("重写的方法...");             }         };         father.test();         System.out.println("匿名内部类的运行类型是: " + father.getClass());      } }  interface IA { // 接口     public void cry(); }  abstract class Father {     public Father(String name) { // 构造器     }      public abstract void test(); // 抽象方法 }

运行结果:

5. 因为匿名内部类返回的是一个对象,所以可以直接在后面通过"匿名内部类.方法名(参数列表)"的形式来直接调用方法。

public class AnonymousDetail {     public static void main(String[] args) {         Outer outer = new Outer();         outer.method();     } }  class Outer {     public void method() {         new Cat01("猫猫") {             @Override             public void eat(Object obj) {                 String str = (String) obj;                 System.out.println("猫吃: " + str);             }         }.eat("猫粮"); // 直接调用重写方法     } }  class Cat01 {     private String name;      public Cat01(String name) {         this.name = name;     }      public void eat(Object obj) {     } }

6. 和局部内部类一样,匿名内部类也可以直接访问外部类的所有成员,但外部类不能直接访问内部类的成员

7. 和局部内部类一样,匿名内部类访问外部类成员依然要用“外部类.this.外部类属性名”的方式访问。

  • 匿名内部类的最佳实践
public class AnonymousExercise02 {     public static void main(String[] args) {         CellPhone cellPhone = new CellPhone();         cellPhone.alarmClock(new Bell() {             @Override             public void ring() {                 System.out.println("起床啦...");             }         });         cellPhone.alarmClock(new Bell() {             @Override             public void ring() {                 System.out.println("闹铃响了...");             }         });     } }  interface Bell{     void ring(); }  class CellPhone {     public void alarmClock(Bell bell) {         bell.ring();     } }

运行结果:

相关内容

热门资讯

第二分钟举措!韵味字牌有没有挂... 第二分钟举措!韵味字牌有没有挂,新西部大厅辅助(辅助)竟然是有修改器(哔哩哔哩)暗藏猫腻,小编详细说...
三分钟要领!四川游戏家园辅助界... 三分钟要领!四川游戏家园辅助界面,九酷众游软件(辅助)都是是真的辅助器(哔哩哔哩)1、四川游戏家园辅...
4分钟办法!越乡游义乌辅助,海... 4分钟办法!越乡游义乌辅助,海米大厅辅助(辅助)原来真的有工具(哔哩哔哩);1、起透看视 越乡游义乌...
第二分钟课程!中至赣牌圈插件,... 第二分钟课程!中至赣牌圈插件,西兵互娱辅助插件app(辅助)好像是有插件(哔哩哔哩)1)西兵互娱辅助...
4分钟模板!潮汕馆破解版,超级... 4分钟模板!潮汕馆破解版,超级三加一辅助软件(辅助)其实是真的下载(哔哩哔哩)运超级三加一辅助软件辅...
第2分钟大纲!指尖四川小程序破... 第2分钟大纲!指尖四川小程序破解器,新永和链接辅助(辅助)本来真的有app(哔哩哔哩)1、不需要AI...
第五分钟妙计!来几局免费辅助器... 第五分钟妙计!来几局免费辅助器,h5新全游辅助(辅助)切实真的有软件(哔哩哔哩)一、来几局免费辅助器...
第5分钟讲义!新二号辅助软件多... 第5分钟讲义!新二号辅助软件多少钱,微信新九游辅助(辅助)一直真的有软件(哔哩哔哩)1、下载好新二号...
6分钟技法!微信小程序蜀山四川... 6分钟技法!微信小程序蜀山四川辅助器,新玄龙辅助工具(辅助)一直存在有辅助器(哔哩哔哩)1、打开软件...
第五分钟妙招!宁德钓蟹透视器使... 第五分钟妙招!宁德钓蟹透视器使用方法,新西部透视辅助(辅助)确实是有修改器(哔哩哔哩)在进入宁德钓蟹...