深入理解Java内部类
一、什么是内部类
内部类是定义在另一个类内部的类。内部类与外部类(Enclosing Class)之间存在着紧密的联系,可以访问外部类的成员变量和方法,这使得它们在某些场景下非常有用。
1.1 内部类的分类
Java中的内部类主要有以下几种类型:
- 成员内部类(Member Inner Class):定义在外部类的内部,与外部类的实例相关联。
- 静态内部类(Static Nested Class):定义在外部类的内部,但使用
static
修饰。它与外部类的实例无关。 - 局部内部类(Local Inner Class):定义在外部类的方法内部。
- 匿名内部类(Anonymous Inner Class):没有名称的内部类,通常用于创建类的子类或实现接口。
二、成员内部类
2.1 定义和使用
成员内部类是最常见的内部类。它可以访问外部类的所有成员(包括私有成员)。下面是一个简单的示例:
class OuterClass {private String outerField = "外部类的字段";class InnerClass {void display() {System.out.println("访问外部类的字段: " + outerField);}}
}public class Test {public static void main(String[] args) {OuterClass outer = new OuterClass();OuterClass.InnerClass inner = outer.new InnerClass();inner.display();}
}
2.2 特点
- 访问权限:成员内部类可以访问外部类的所有成员,包括私有成员。
- 实例化:创建成员内部类的实例需要先创建外部类的实例。
三、静态内部类
3.1 定义和使用
静态内部类是使用static
关键字定义的内部类。它与外部类的实例无关,不能直接访问外部类的实例变量和方法,但可以访问外部类的静态变量和方法。
class OuterClass {static String staticField = "外部类的静态字段";static class StaticInnerClass {void display() {System.out.println("访问外部类的静态字段: " + staticField);}}
}public class Test {public static void main(String[] args) {OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();inner.display();}
}
3.2 特点
- 独立性:静态内部类的实例可以在没有外部类实例的情况下创建。
- 访问限制:静态内部类只能访问外部类的静态成员。
四、局部内部类
4.1 定义和使用
局部内部类是在外部类的方法内部定义的类。局部内部类只能在其所在的方法中使用。
class OuterClass {void outerMethod() {class LocalInnerClass {void display() {System.out.println("这是局部内部类");}}LocalInnerClass localInner = new LocalInnerClass();localInner.display();}
}public class Test {public static void main(String[] args) {OuterClass outer = new OuterClass();outer.outerMethod();}
}
4.2 特点
- 作用域:局部内部类的作用域仅限于定义它的方法。
- 访问限制:局部内部类可以访问方法内的局部变量(必须是
final
或有效的final
)。
五、匿名内部类
5.1 定义和使用
匿名内部类是一种没有名字的内部类。它常用于实现接口或继承类的场景。
interface Greeting {void sayHello();
}public class Test {public static void main(String[] args) {Greeting greeting = new Greeting() {@Overridepublic void sayHello() {System.out.println("你好,欢迎使用匿名内部类!");}};greeting.sayHello();}
}
5.2 特点
- 简洁性:匿名内部类可以在创建对象的同时实现接口或继承类,代码更加简洁。
- 有限的使用场景:由于没有名称,因此匿名内部类不能在多个地方复用。
六、内部类的使用场景
6.1 封装性
内部类可以访问外部类的私有成员,使得数据的封装性得以增强。
6.2 组织结构
在大型项目中,内部类可以帮助组织相关的类,保持代码结构的清晰。
6.3 事件处理
在GUI编程中,内部类常用于事件处理,能够更好地管理事件源和处理逻辑。
七、最佳实践
7.1 选择合适的内部类类型
根据具体的需求选择合适的内部类类型。例如,当需要访问外部类的实例成员时,可以选择成员内部类;如果只需访问静态成员,可以使用静态内部类。
7.2 控制访问权限
在内部类中,合理控制访问权限,保护类的封装性。
7.3 避免过度使用
虽然内部类在某些场景下非常有用,但过度使用可能导致代码的复杂性增加。因此,应根据实际需求合理使用内部类。
八、总结
Java内部类是一种强大的语言特性,它提供了更好的封装性和可读性。在开发中合理运用内部类,可以帮助我们更清晰地组织代码,提升代码质量。希望本文能帮助你深入理解Java内部类的概念和应用,为你的Java开发提供有价值的指导。
如有任何问题或讨论,欢迎随时交流。
相关文章:
深入理解Java内部类
一、什么是内部类 内部类是定义在另一个类内部的类。内部类与外部类(Enclosing Class)之间存在着紧密的联系,可以访问外部类的成员变量和方法,这使得它们在某些场景下非常有用。 1.1 内部类的分类 Java中的内部类主要有以下几种…...

fiddler抓包12_篡改请求(请求前断点)
课程大纲 原理 正常“客户端-服务器”通信,即发送请求,接收返回。 Fiddler抓包是「客户端-浏览器」进行交互时,请求和响应都会从Fiddler通过,Fiddler可以捕获并展示。 请求前断点(BreakPoint Before Request࿰…...
Webpack和GuIp打包原理以及不同
Webpack打包原理 Webpack的打包原理主要基于模块化的概念,它将应用程序中的所有资源(如JS、CSS、图片等)视为模块,并根据模块间的依赖关系进行静态分析。Webpack会递归地构建一个依赖关系图(dependency graph…...
c++与Python用笛卡尔的心形函数输出爱心
我突然想到输出爱心是否可以用笛卡尔的心形函数 在IDLE里用Python输出下面这个图形 在小熊猫c里用c输出下面这个图形 如果当你要输出这些的时候会怎么办 低级:纯输出 print( ********* ********* ***************** ***************** …...
Mybatis 9种动态 sql 标签使用
MyBatis提供了9种动态SQL标签:trim、where、set、foreach、if、choose、when、otherwise、bind; 1.if 标签 <select id"getUser">select * from User<where><if test" age ! null ">and age > #{age}</if…...

OpenHarmony(鸿蒙南向)——平台驱动开发【PIN】
往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 PIN即管脚控制器,用于统一管理各SoC的…...

南平自闭症寄宿制学校:让孩子自信绽放
在繁华与喧嚣交织的都市之中,有一片静谧而充满希望的土地——广州星贝育园自闭症儿童寄宿制学校,这里不仅是知识的殿堂,更是自闭症儿童心灵成长的温馨家园。星贝育园,以其独特的教育理念与细致入微的关怀,为这些特殊的…...

汽车总线之---- LIN总线
Introduction LIN总线的简介,对于传统的这种点对点的连接方式,我们可以看到ECU相关的传感器和执行器是直接连接到ECU的,当传感器和执行器的数量较少时,这样的连接方式是能满足要求的,但是随着汽车电控功能数量的不断增…...

Android开发MPAndroidChart两条折线图
Android开发MPAndroidChart两条折线图 Android开发两条折线图效果,还是有一定难度的,难点它的起点不是坐标0的开始,还有数值上有背景图 一、思路: 用的是MPAndroidChart的BarChart 二、效果图: 三、关键代码&#…...
HTML-ES6.0核心技术
1.ES6简介 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。ECMAScript 和 JavaScri…...
车间调度问题数学建模与CPLEX优化
完成了这些基础研究工作,整理成文档以供参考 序言... i 第一章 引言... 1 1.1 车间调度问题概述... 1 1.2 车间调度问题分类表示法... 5 1.3 车间调度对制造企业的作用... 6 1.4 本章小结... 7 第二章 CPLEX基础... 8 2.1 CPLEX概述... 8 2.1.1 CPLEX简介.…...
< 基础物理 >
SI国际单位制 常见的公制单位 为什么需要单位,是统一衡量的标准 通过国际单位,以及单位的拓展,以及单位的组合,形成一系列新的测量单位 面积 m^2 速率 m/s 米每二次方秒,m / s, delta表示增量, 每秒移动多少米 加…...

【web开发】Spring Boot 快速搭建Web项目(三)
Date: 2024.08.31 18:01:20 author: lijianzhan 简述:根据上篇原文Spring Boot 快速搭建Web项目(二),由于已经搭建好项目初始的框架,以及自动创建了一个启动类文件(TestWebApplication.java) …...
无人机之战斗机的详解!
一、高性能飞行能力 高速飞行:具备较高的巡航速度和最大飞行速度,以便快速抵达任务区域并灵活应对战场情况。 长航程:拥有足够的航程以执行远程任务,覆盖广阔的作战区域 高升限:能够飞行到较高的高度,以…...

Verilog基础:时序调度中的竞争(四)(描述时序逻辑时使用非阻塞赋值)
相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 作为一个硬件描述语言,Verilog HDL常常需要使用语句描述并行执行的电路,但其实在仿真器的底层,这些并行执行的语句是有先后顺序…...

嵌入式边缘计算软硬件开发“1+X”考证建设方案
一、引言 随着物联网、大数据、人工智能等技术的飞速发展,嵌入式边缘计算作为连接物理世界与数字世界的桥梁,其重要性日益凸显。为了适应行业对高技能人才的需求,推动嵌入式边缘计算技术的普及与应用,特制定本“1X”考证建设方案…...
ES8的Java API client 8.0 简单示例操作 Elasticsearch
1.加入依赖 <dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.12.2</version></dependency>2.配置类 Slf4j Configuration public class ElasticSearchConfig {Valu…...
多线程CompletableFuture
最近发现同事整理了一个不错的关于CompletableFuture的文档,在这里记录一下,方便以后工作备用 CompletableFuture future CompletableFuture.supplyAsync(() -> {return "开新线程异步执行"; })result future.get(); // 线程阻塞等待结果…...

AR传送门+特定区域显示内容+放大镜 效果着色器使用
AR传送门特定区域显示内容放大镜 效果 关键词:Portal Mask 1、教程链接: AR 传送门教程 Unity - Portal Mask Implementation - Part 4_哔哩哔哩_bilibili 应用案例效果: 2、案例下载地址:使用unity 2021.3.33f1 obi 工具…...
设置Hadoop守护进程的JVM参数
一般情况下我们不去动守护进程的JVM,这里的守护进程说的是NameNode、DataNode等Hadoop服务自己本身的进程。但是有一些特殊情况下需要限制,比如工作中虽然集群中资源队列会有10%左右的预留空余,不过这是整个集群队列的限制,对于Da…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...

从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...