当前位置: 首页 > news >正文

Java重修笔记 第二十七天 匿名内部类

  • 匿名内部类

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() {@Overridepublic void cry() {// 重写接口中的方法System.out.println("重写的方法...");}};ia.cry();System.out.println("匿名内部类的运行类型是: " + ia.getClass());System.out.println("============================");// 基于类的匿名内部类的使用Father father = new Father("jack") {@Overridepublic 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("猫猫") {@Overridepublic 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() {@Overridepublic void ring() {System.out.println("起床啦...");}});cellPhone.alarmClock(new Bell() {@Overridepublic void ring() {System.out.println("闹铃响了...");}});}
}interface Bell{void ring();
}class CellPhone {public void alarmClock(Bell bell) {bell.ring();}
}

运行结果:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 用Python实现AI人脸识别
  • 如何开启idea中的断言功能?
  • 纯原创【车牌识别】基于图像处理的车牌识别——matlab项目实战(含GUI界面)详解
  • 最佳编程语言选择与学习路径探讨
  • 一文掌握Python全部条件执行语句(基础篇)
  • vue开启keep-alive缓存时,关于子组件上使用:key=“id“的问题以及解决方案
  • 5G三大场景:eMBB、mMTC、uRLLC
  • VMware Workstation17 安装 Windows 10 操作系统
  • 通过 ACM 论文模版学习 LaTeX 语法 【三、格式】
  • strimzi operator 部署kafka集群(可外部访问)
  • [M二分] lc3143. 正方形中的最多点数(二分答案+代码实现+模拟)
  • 19066 第K小子串
  • 将后台传来的数据,转成easyui-tree所需格式
  • Map遍历 32
  • 家用仪器血压测量仪电子方案
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 10个确保微服务与容器安全的最佳实践
  • express + mock 让前后台并行开发
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • magento2项目上线注意事项
  • python学习笔记-类对象的信息
  • React的组件模式
  • scala基础语法(二)
  • SQLServer之创建数据库快照
  • Vim 折腾记
  • vue-loader 源码解析系列之 selector
  • Web标准制定过程
  • 闭包--闭包之tab栏切换(四)
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 回流、重绘及其优化
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 来,膜拜下android roadmap,强大的执行力
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 移动端解决方案学习记录
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • ()、[]、{}、(())、[[]]命令替换
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (pojstep1.1.2)2654(直叙式模拟)
  • (二)斐波那契Fabonacci函数
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (十三)Flask之特殊装饰器详解
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (算法设计与分析)第一章算法概述-习题
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • .aanva
  • .axf 转化 .bin文件 的方法
  • .gitattributes 文件
  • .net dataexcel winform控件 更新 日志
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .net反混淆脱壳工具de4dot的使用