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

news2024/12/24 21:14:11
  • 匿名内部类

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();
    }
}

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1972913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自定义监控

代码说明: 导入必要的库 import time import psutil import GPUtil from prometheus_client import start_http_server, Summary, Counter, Gaugepsutil:用于获取系统的CPU、内存、磁盘和网络信息。GPUtil:用于获取GPU信息。prometheus_cli…

git拉完代码总是自动创建一个新的节点

git拉完代码,总是自动生成弹出这个信息 然后还会在git上面留下一个节点,这个节点没啥用,显示着感觉有点碍事。 而且后续的git push 之后,会覆盖掉自己的git commit 的提示,其他人cr代码的时候看到的是 解决方法&#…

【深度学习】【语音TTS】OpenVoice v2,测评,中英文语料,Docker镜像,对比GPT-SoVITS、FishAudio、BertVITS2

https://github.com/myshell-ai/OpenVoice/blob/main/docs/USAGE.md 实际体验OpenVoice v2的TTS效果。 文章目录 环境启动 jupyter代码代码分析主要模块和功能测试一些别的中文和中英文混合总结优点缺点对比GPT-SoVITS、FishAudio、BertVITS2使用我的Docker镜像快速体验OpenVo…

uni-app封装组件实现下方滑动弹出模态框

子组件 <template><div class"bottom-modal" :class"{show: showModal}"><div class"modal-content" :class"{show: showModal}"><!-- 内容区域 --><slot></slot></div></div></…

收银系统源码-分销商城视频介绍

系统介绍 专门为零售行业的连锁店量身打造的收银系统&#xff0c;适用于常规超市、生鲜超市、水果店、便利店、零食专卖店、服装店、母婴用品、农贸市场等类型的门店使用。同时线上线下数据打通&#xff0c;线下收银的数据与小程序私域商城中的数据完全同步&#xff0c;如商品…

欧科云链7月安全月报 | 私钥泄露损失约占总损失88%,超2.6亿美元

7 月全网累计造成损失约 2.9 亿美元&#xff0c;因私钥泄露所造成损失占总损失的 88.31%&#xff0c;其中 WazirX 因多签钱包私钥泄露&#xff0c;造成约 2.35 亿美元的损失&#xff0c;为 7 月最大安全事件。 最大安全事件-私钥泄漏 7 月 18 日&#xff0c;WazirX 多签钱包私…

Spring Boot集成Resilience4J实现断路器功能

1.什么是Resilience4J&#xff1f; Netflix Hystrix 断路器是 Spring Cloud 中最早就开始支持的一种服务调用容错解决方案&#xff0c;但是目前的 Hystrix 已经处于维护模式了&#xff0c;虽然这并不影响已经上线的项目&#xff0c;并且在短期内&#xff0c;你甚至也可以继续在…

【AD域】搭建AD域服务器

环境 服务器&#xff1a;Windows Server 2016 Standard&#xff0c;版本1607 准备 1、设置主机名 2、配置静态IP地址 3、以本地管理员权限登录服务器 步骤 1、在服务器添加【Active Directory】域服务功能 2、AD域服务器配置

ERP系统提高生产企业库存周转率的抓手

引言 生产企业库存积压&#xff0c;有市场波动的原因&#xff0c;也有内部管理的原因。常见的内部管理原因有&#xff1a; 物料买多了&#xff0c;长期积压在仓库 缺料&#xff0c;生产不能及时完工&#xff0c;在制品积压 物料买早了&#xff0c;在仓库呆滞时间过长 在ERP…

RIP路由协议之网络工程师软考中级

几种常见的路由协议 路由协议名称路由协议分类&#xff08;工作原理&#xff09;协议分类&#xff08;工作区域&#xff09;路由算法RIP距离矢量IGPBellman-FordOSPF-ISIS链路状态IGPDijkstraBGP路径向量EGP/ IGP称为内部网关协议&#xff08;I人&#xff0c;内向&#xff09…

瑞芯微Android设备指定应用开启性能模式

本文档主要针对特定应用&#xff08;如 安兔兔&#xff09;如何进行加速及性能的提升做相关说明。 快速开启方法 开启与关闭 在 device/rockchip/rk3xxx/下配置文件:package_performance.xml&#xff0c;在其中的节点中加入需要使用性能模式的包名&#xff1a;&#xff08;…

Java零基础之多线程篇:如何保证线程安全?

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

使用swiftui自定义圆形进度条实现loading

实现的代码如下&#xff1a; // // LoadingView.swift // SwiftBook // // Created by Song on 2024/8/2. //import SwiftUIstruct LoadingView: View {State var process 0.5var body: some View {VStack(spacing: 20) {ZStack {Circle().stroke(.gray.opacity(0.3), lin…

【QGroundControl二次开发】八. QT实现播放gstreamer视频

上篇写到如何搭建gstreamer在Windows和linux下的环境&#xff0c;以及新建VS工程解码视频流。gstreamer 配置解析编解码 本篇主要讲述c源码移植到QT工程。 一. QT工程配置 gstreamer环境参考上面链接。 在项目的.pro文件中加入如下代码。&#xff08;以linux项目为例&#xff…

【Python 逆向滑块】(实战四)逆向滑块,并实现用Python+Node.js 生成滑块、识别滑块、验证滑块、发送短信

逆向日期&#xff1a;2024.08.02 使用工具&#xff1a;python、Node.js 本章知识&#xff1a;逆向网易易盾【data】参数里的【d】【p】【f】【ext】参数 文章难度&#xff1a;中等&#xff08;没耐心的请离开&#xff09; 文章全程已做去敏处理&#xff01;&#xff01;&#x…

物理学是研究‘’物质一般的运动规律‘’和‘’物质基本结构‘’的自然科学

物理学是一门研究物质最一般的运动规律和物质基本结构的自然科学学科。作为自然科学的带头学科&#xff0c;物理学研究大至宇宙&#xff0c;小至基本粒子等一切物质最基本的运动形式和规律&#xff0c;因此成为其他各自然科学学科的研究基础。 以下是对物理学的详细解析&#x…

儿童安全门和围栏美国CPC认证ASTM F1004测试16CFR1239测试

什么是儿童安全门和围栏&#xff1f; ASTM F1004-22将“伸缩门”定义为“旨在安装在门口等开口处的障碍物&#xff0c;以防止儿童通过&#xff0c;但可以由能够操作锁定装置的老年人拆除”(第3.1.7节)。 ASTM F1004-22将“可扩展围栏”定义为“旨在完全包围幼儿可能被限制在其…

数据结构与算法--栈

文章目录 知识回顾顺序存储结构的优缺点链式存储结构的优缺点 数据结构的三个方面栈的定义与特点栈的基本运算栈的存储结构与实现顺序栈入栈操作出栈操作 链栈入栈操作入栈操作 栈的应用数制转换表达式求值中缀表达式向后缀表达式的转换后缀表达式的求值过程 总结 知识回顾 顺…

Telnet和SSH配置学习笔记

1. Telnet应用场景 为方便通过命令行管理设备&#xff0c;可以使用Telnet协议对设备进行管理。 Telnet协议与使用Console接口管理设备不同&#xff0c;无需专用线缆直连设备的Console接口&#xff0c;只要IP地址可达、能够和设备的TCP 23端口通信即可。 支持通过Telnet协议进…

Redis基础总结、持久化、主从复制、哨兵模式、内存淘汰策略、缓存

文章目录 Redis 基础Redis 是什么&#xff0c;有哪些特点为什么要使用 Redis 而不仅仅依赖 MySQLRedis 是单线程吗Redis 单线程为什么还这么快 Redis 数据类型和数据结构五种基本数据结构及应用场景其他数据类型Redis 底层数据结构 Redis 持久化数据不丢失的实现AOF 日志RDB 快…