Java内部类的使用与应用

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>() {@Overridepublic 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.mzph.cn/news/702609.shtml

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

相关文章

JWT学习笔记

了解 JWT Token 释义及使用 | Authing 文档 JSON Web Token Introduction - jwt.io JSON Web Token (JWT&#xff0c;RFC 7519 (opens new window))&#xff0c;是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准&#xff08;(RFC 7519)。该 token 被设计为紧凑…

微服务-微服务Spring Security OAuth 2实战

1. Spring Authorization Server 是什么 Spring Authorization Server 是一个框架&#xff0c;它提供了 OAuth 2.1 和 OpenID Connect 1.0 规范以及其他相关规范的实现。它建立在 Spring Security 之上&#xff0c;为构建 OpenID Connect 1.0 身份提供者和 OAuth2 授权服务器产…

高等数学(极限)

目录 一、数列 二、极限 2.1 讲解 2.2 例题 一、数列 按照一定次数排列的一列数&#xff1a; 其中 叫做通项。 对于数列&#xff0c;如果当n无限增大时&#xff0c;其通项无限接近于一个常数A&#xff0c;则称该数列以A为极限或称数列收敛于A&#xff0c;否则称数列为发散…

OpenCV(2)

1.OpenCV的模块 其中core、highgui、imgproc是最基础的模块&#xff0c;该课程主要是围绕这几个模块展开的&#xff0c;分别介绍如下&#xff1a; core模块实现了最核心的数据结构及其基本运算&#xff0c;如绘图函数、数组操作相关函数等。highgui模块实现了视频与图像的读取…

【JVM】计数器引用和可达性分析

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;JVM ⛺️稳中求进&#xff0c;晒太阳 C/C的内存管理 在C/C这类没有自动垃圾回收机制的语言中&#xff0c;一个对象如果不再使用&#xff0c;需要手动释放&#xff0c;否则就会出现内存泄漏…

一文get,最容易碰上的接口自动化测试问题汇总

本篇文章分享几个接口自动化用例编写过程遇到的问题总结&#xff0c;希望能对初次探索接口自动化测试的小伙伴们解决问题上提供一小部分思路。 sql语句内容出现错误 空格&#xff1a;由于有些字段判断是变量&#xff0c;需要将sql拼接起来&#xff0c;但是在拼接字符串时没有…

对象池模板

概述 对象池的引入也是嵌入式开发的常用方法&#xff0c;也是内存预分配的一种&#xff0c;主要是用来隐藏全局对象的跟踪&#xff0c;通常预内存分配是通过数组来实现。 CMake配置 cmake_minimum_required(VERSION 3.5.1)project(objpool)add_executable(objpool objpool.cp…

C语言《数据结构与算法》安排教学计划课设

背景&#xff1a; 10、安排教学计划 (1) 问题描述。 学校每学期开设的课程是有先后顺序的&#xff0c;如计算机专业&#xff1a;开设《数据结构》课程之前&#xff0c;必须先开设《C语言程序设计》和《离散数学》课程&#xff0c;这种课程开设的先后顺序称为先行、后继课程关…

在使用nginx的时候快速测试配置文件,并重新启动

小技巧 Nginx修改配置文件后需要重新启动&#xff0c;常规操作是启动在任务管理器中关闭程序然后再次双击nginx.exe启动&#xff0c;但是使用命令行就可以快速的完成操作。 将cmd路径切换到nginx的安装路径 修改完成配置文件后 使用 nginx -t校验nginx 的配置文件是否出错 …

海豚调度DolphinScheduler入门学习

DS简介&#xff1a; DolphinScheduler 是一款分布式的、易扩展的、高可用的数据处理平台&#xff0c;主要包含调度中心、元数据管理、任务编排、任务调度、任务执行和告警等模块。其技术架构基于 Spring Boot 和 Spring Cloud 技术栈&#xff0c;采用了分布式锁、分布式任务队列…

vue3 实现 el-pagination页面分页组件的封装以及调用

示例图 一、组件代码 <template><el-config-provider :locale"zhCn"><el-pagination background class"lj-paging" layout"prev, pager, next, jumper" :pager-count"5" :total"total":current-page"p…

深度学习基础(四)医疗影像分析实战

之前的章节我们初步介绍了卷积神经网络&#xff08;CNN&#xff09;和循环神经网络&#xff08;RNN&#xff09;&#xff1a; 深度学习基础&#xff08;三&#xff09;循环神经网络&#xff08;RNN&#xff09;-CSDN博客文章浏览阅读1.2k次&#xff0c;点赞17次&#xff0c;收…

机器学习基础(六)TensorFlow与PyTorch

导语&#xff1a;上一节我们详细探索了监督与非监督学习的结合使用。&#xff0c;详情可见&#xff1a; 机器学习基础&#xff08;五&#xff09;监督与非监督学习的结合-CSDN博客文章浏览阅读4次。将监督学习和非监督学习结合起来&#xff0c;就像将两种不同的艺术形式融合&a…

1298 - 摘花生问题

题目描述 Hello Kitty 想摘点花生送给她喜欢的米老鼠。她来到一片有网格状道路的矩形花生地(如下图)&#xff0c;从西北角进去&#xff0c;东南角出来。地里每个道路的交叉点上都有种着一株花生苗&#xff0c;上面有若干颗花生&#xff0c;经过一株花生苗就能摘走该它上面所有…

消息中间件篇之RabbitMQ-消息重复消费

一、导致重复消费的情况 1. 网络抖动。 2. 消费者挂了。 消费者消费消息后&#xff0c;当确认消息还没有发送到MQ时&#xff0c;就发生网络抖动或者消费者宕机。那当消费者恢复后&#xff0c;由于MQ没有收到消息&#xff0c;而且消费者有重试机制&#xff0c;消费者就会再一次消…

python print 格式化输出详解

print 输出字符串和数字 以下实例中列举了print打印各种类型的示例 示例如下, print("qayrup") # 直接输出字符串print(100) # 输出数字str qayrup print(str) # 输出变量L [1,2,a] # 输出列表类型变量 print(L) t (1,2,a…

Folx GO+ 5.27 Mac上优秀好用的下载工具

Folx Pro 5 for Mac是Mac平台上公认的最好的下载工具&#xff0c;功能可以与迅雷相媲美。目前Folx Pro 5 特别版正式上线&#xff0c;新版的Folx整体界面更加简洁漂亮&#xff0c;支持HTTP FTP下载&#xff0c;torrent种子下载&#xff0c;高速下载&#xff0c;定时下载&#x…

C语言中strstr函数的使用!

strstr函数的作用是什么&#xff1f; 查找子字符串 具体直接看下面的这段代码我相信你必明白 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { char *p1 "abcdefghijklmnopqrstuvwxyz"; char* p2 "abc"; char* r…

Open CASCADE学习|提取面的内外环线

在Open CASCADE中&#xff0c;区分内环和外环主要基于面的参数域内环线方向的定义。具体来说&#xff0c;在面的参数域内&#xff0c;沿着环线正方向前进时&#xff0c;如果左侧为面内、右侧为面外&#xff0c;那么该环线被视为外环&#xff1b;反之&#xff0c;如果左侧为面外…

access数据库泄露与IIS短文件名利用

access数据库 Microsoft Office Access是微软把 数据库引擎 的图形用户界面和 软件开发工具 结合在一起的一个 数据库管理系统 它的数据库是没有库名的&#xff0c;都是表名。 (借用别的up的图)是不是感觉有点像excel access数据库的后缀是.mdb access数据库泄露漏洞 如果…