Java内部类的使用与应用

news2024/10/5 14:53:48

HashMap.java

内部类的使用与应用

1. 内部类用法

  • 普通内部类
    • 实例化内部类对象需要先实例化外部类对象,然后再通过OuterClassName.new InnerClassName()方式实例化内部类。
    • 内部类对象在创建后会与外部类对象秘密链接,因此无法独立于外部类创建内部类对象。
    • 无法直接从外部类外部访问,需要使用OuterClassName.InnerClassName方式,例如Map.Entry
    • 内部类可以访问外围类的所有成员,包括私有成员。
    • 在内部类中可以使用OuterClassName.this来访问外围类对象。
public class A {
    public void f() {
        A.B b = A.new B();
        B b2 = new B();
    }

    public class B {
        void g(){
            System.out.println(A.this);
        }
    }

    public static void main(String[] args) {
        A a = new A();
        A.B b = a.new B();
    }
}
  • 匿名内部类
    • 在内部类的基础上减少了对class的定义,通过new关键字后跟一个接口或者基类,然后在类体中实现方法即可。
    • JVM会调用编译器生成的构造器来生成这个内部类对象。
    • 典型应用如java.util.Comparator
public class Main {
    public static void main(String[] args) {
        // 创建一个包含整数的列表
        List<Integer> numbers = new ArrayList<>();
        numbers.add(5);
        numbers.add(3);
        numbers.add(8);
        numbers.add(1);

        // 使用匿名内部类实现Comparable接口进行排序
        Collections.sort(numbers, new Comparable<Integer>() {
            @Override
            public int compareTo(Integer o) {
                return this.compareTo(o);
            }
        });

        // 输出排序后的列表
        System.out.println("排序后的列表:" + numbers);
    }
}
  • 静态嵌套类
    • 是一种静态内部类,不需要外围类对象来初始化。【静态嵌套类说到底就是一个静态类,只不过是其位置位于某个类的内部罢了】
    • 嵌套类可以有static数据和字段。
    • 可以访问外围类的静态成员,但不能访问外部类的非静态成员。
    • 可以作为接口的一部分,这样在接口中就可以用公用代码出现;。
    • 可以多重嵌套,访问所有外围类成员。
public class OuterClass {
    private static String outerStaticField = "Outer static field";

    // 静态嵌套类
    static class NestedStaticClass {
        void printMessage() {
            System.out.println("Message from nested static class: " + outerStaticField);
        }
    }

    public static void main(String[] args) {
        // 创建静态嵌套类的实例
        NestedStaticClass nestedStaticObj = new NestedStaticClass();

        // 调用静态嵌套类的方法
        nestedStaticObj.printMessage();
    }
}

2. 应用场景

Java内部类具有多种应用场景和用途:

  • 封装: 提高代码的可读性和可维护性,隐藏内部实现细节。
  • 实现多重继承: 内部类可以继承一个类并实现多个接口,实现多重继承的效果。
  • 简化回调函数的使用: 内部类可以作为回调函数的实现方式,简化代码结构。
  • 编写事件驱动程序: 通过内部类实现事件监听器接口,监听和处理外部类中发生的事件。
  • 编写线程代码: 简化多线程代码的编写,提高可读性和可维护性。
  • 访问外部类的私有成员: 内部类可以访问外部类的私有成员,实现封装和访问控制。
  • 字节码文件大小: 减少类文件编译后的字节码文件大小。
  • 闭包和回调: 实现Java版的闭包和回调。

这些应用场景在你的工作实践中是否有所涉及呢?期待你的分享和补充实例,让我们一起探讨如何更好地利用内部类来提高代码的质量和可维护性!

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

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

相关文章

智慧农业—农业资源数据中心

综述 农业资源数据中心建设的目标是将大量的农业生产信息通过采集、清洗、核准后实现统一存储、统一管理,实现数据的共享和集中管理,保障数据的安全,也为数据的挖掘分析提供决策分析创造条件。 农业资源数据中心的数据架构如下图所示: (1)农业专家数据库。主要收录国内、…

手撕Transformer(二)| Transformer掩码机制的两个功能,三个位置的解析及其代码

文章目录 1 掩码的两个功能1.1 功能1 输入掩码&#xff0c;统一长度1.2 功能2 遮挡未预测信息 2 掩码存在的三个位置3 代码实现 Transformer的掩码机制是非常重要的 三个位置&#xff0c;两个功能 1 掩码的两个功能 1.1 功能1 输入掩码&#xff0c;统一长度 实现不同的长度句…

使用C++和SFML库创建2D游戏

FML&#xff08;Simple and Fast Multimedia Library&#xff09;是一个跨平台的C库&#xff0c;用于开发2D游戏和多媒体应用程序。它提供了许多功能&#xff0c;包括图形、声音、网络、窗口管理和事件处理等。 ———————————————不怎么完美的分割线——————…

使用命令符用cd切换不了

bug:cd 切换不进去 解决办法&#xff1a; 在cd后面加 /d

(HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕

一、电路接法 电路接法参照江科大视频。 二、相关代码及文件 说明&#xff1a;代码采用hal库&#xff0c;通过修改江科大代码实现。仅OLED.c文件关于引脚定义作了hal库修改&#xff0c;并将宏定义OLED_W_SCL(x)、OLED_W_SDA(x)作了相关修改。 1、OLED.c void OLED_I2C_Init(voi…

32单片机基础:旋转编码器计次

接线图如上图所示。 我们初始化一下PB0和PB1两个GPIO口外设中断&#xff0c;当然&#xff0c;这里只初始化一个外部中断也能完成功能的对于编码器而言&#xff0c;下图所示为正转的波形。如果把一相的下降沿用作触发中断&#xff0c;在中断时刻读取另一相的电平&#xff0c;正…

普中51单片机学习(红外通信)

红外通信 红外线系统的组成 外线遥控器已被广泛使用在各种类型的家电产品上&#xff0c;它的出现给使用电器提供了很多的便利。红外线系统一般由红外发射装置和红外接收设备两大部分组成。红外发射装置又可由键盘电路、红外编码芯片、电源和红外发射电路组成。红外接收设备可由…

Spring Boot中的@Scheduled注解:定时任务的原理与实现

1. 前言 本文将详细探讨Spring Boot中Scheduled注解的使用&#xff0c;包括其原理、实现流程、步骤和代码示例。通过本文&#xff0c;读者将能够了解如何在Spring Boot应用中轻松创建和管理定时任务。 2. Scheduled注解简介 在Spring框架中&#xff0c;Scheduled注解用于标记…

面试经典150题【21-30】

文章目录 面试经典150题【21-30】6.Z字形变换28.找出字符串中第一个匹配项的下标68.文本左右对齐392.判断子序列167.两数之和11.盛最多水的容器15.三数之和209.长度最小的子数组3.无重复字符的最长子串30.串联所有单词的子串 面试经典150题【21-30】 6.Z字形变换 对于“LEETC…

五种多目标优化算法(MOBA、NSWOA、MOJS、MOAHA、MOPSO)性能对比(提供MATLAB代码)

一、5种多目标优化算法简介 多目标优化算法是用于解决具有多个目标函数的优化问题的一类算法。其求解流程通常包括以下几个步骤: 1. 定义问题:首先需要明确问题的目标函数和约束条件。多目标优化问题通常涉及多个目标函数,这些目标函数可能存在冲突,需要在不同目标之间进…

udp服务器【Linux网络编程】

目录 一、UDP服务器 1、创建套接字 2、绑定套接字 3、运行 1&#xff09;读取数据 2&#xff09;发送数据 二、UDP客户端 创建套接字&#xff1a; 客户端不用手动bind 收发数据 处理消息和网络通信解耦 三、应用场景 1、服务端执行命令 2、Windows上的客户端 3…

DiceCTF 2024 -- pwn

baby-talk 题目给了 Dockerfile&#xff0c;但由于笔者 docker 环境存在问题启动不起来&#xff0c;所以这里用虚拟机环境做了&#xff08;没错&#xff0c;由于不知道远程 glibc 版本&#xff0c;所以笔者远程也没打通&#xff09;笔者本地环境为 glibc 2.31-0ubuntu9.9。然后…

Shell grep命令练习题

目录 1含有“48“字符串的行的总数 2显示含有“48“字符串的所有行的行号 3精确匹配只含有“48”字符串的行 4抽取代码为484和483的城市位置 5显示使行首不是4或8 6显示含有九月份(Sept)的行 7显示以K开头&#xff0c;以D结尾的所有代码 8显示头两个是大写字母&#xff0c;中间…

规则持久化(Sentinel)

规则持久化 基于Nacos配置中心实现推送 引入依赖 <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId> </dependency> 流控配置文件 [{"resource":"/order/flow",…

《Docker 简易速速上手小册》第6章 Docker 网络与安全(2024 最新版)

文章目录 6.1 Docker 网络概念6.1.1 重点基础知识6.1.2 重点案例&#xff1a;基于 Flask 的微服务6.1.3 拓展案例 1&#xff1a;容器间的直接通信6.1.4 拓展案例 2&#xff1a;跨主机容器通信 6.2 配置与管理网络6.2.1 重点基础知识6.2.2 重点案例&#xff1a;配置 Flask 应用的…

【Java程序设计】【C00302】基于Springboot的校园失物招领管理系统(有论文)

基于Springboot的校园失物招领管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的校园失物招领网站&#xff0c;本系统有管理员以及用户二种角色权限&#xff1b; 系统整体功能有&#xff1a;操作日志管理、…

Escalate_Linux靶机详解(1)

Escalate_Linux靶机详解&#xff08;1&#xff09; 一&#xff0c;信息收集 首先扫描存活主机 目标地址&#xff1a;192.168.236.131 使用nmap扫描保存为linux.nmap 2&#xff0c;HTTP探测 发现开放了80端口http 打开站点是apache的默认站点 默认页面&#xff0c;尝试对w…

PyTorch概述(六)---View

Tensor.view(*shape)-->Tensor 返回一个新的张量同之前的张量具有相同的数据&#xff0c;但是具有不同的形状&#xff1b;返回的张量同之前的张量共享相同的数据&#xff0c;必须具有相同数目的元素&#xff0c;可能具有不同的形状&#xff1b;对于经过view操作的张量&…

Android 内存优化内存泄漏处理

一:匿名内部类/非静态内部类 匿名内部类的泄漏原因&#xff1a;匿名内部类会隐式地持有外部类的引用.当外部类被销毁时&#xff0c;内部类并不会自动销毁&#xff0c;因为内部类并不是外部类的成员变量&#xff0c; 它们只是在外部类的作用域内创建的对象&#xff0c;所以内部…

《艾尔登法环 黄金树幽影》是什么?Mac电脑怎么玩《艾尔登法环》艾尔登法环下载

全体起立&#xff0c;《艾尔登法环 》最新DLC《黄金树幽影》将在6月21日发布&#xff0c;steam售价198元&#xff0c;现在就可以预订了。宫崎英高在接受FAMI通的采访时表示&#xff0c;新DLC的体量远超《黑暗之魂》和《血源诅咒》资料片。好家伙&#xff0c;别人是把DLC续作&am…