【Java基础篇 | 类和对象】--- 聊聊什么是内部类
个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【JavaSE_primary】
本专栏旨在分享学习Java的一点学习心得,欢迎大家在评论区讨论💌
前言
当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么这个内部的完整结构最好使用内部类。
另外,在 Java 中,可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。内部类也是封装的一种体现。
在Java中,内部类分为4种,分别是:实例内部类、静态内部类、局部内部类、匿名内部类。
下面是一个简单的内部类:
//外部类
public class OutClass {//内部类class InnerClass{}
}
目录
- 前言
- 一、实例内部类
- 如何实例内部类
- 实例内部类中不能直接定义静态成员变量
- 实例内部类总结
- 二、静态内部类
- 如何获取静态类内部类对象
- 划重点
- 三、局部内部类
- 局部内部类注意事项
- 四、匿名内部类
一、实例内部类
class OuterClass{public int data1;int data2;public static int data3;public void func(){System.out.println("OutClass::func()");}class InnerClass{public int data4;int data5;// public static int data6; 这种写法是错误的public void func(){System.out.println("InnerClass::func()");}}
}
如何实例内部类
实例内部类主要有两种方式,请看:
public class Test {public static void main(String[] args) {// 实例内部类方式一OuterClass outerclass = new OuterClass();OuterClass.InnerClass innerclass1 = outerclass.new InnerClass();// 实例内部类方式二OuterClass.InnerClass innerclass2 = new OuterClass().new InnerClass();}
}
这里有一个问题:在实例内部类中,我们如何访问外部类中相同的成员变量呢?
解决方法:通过外部类的实例名.来引用外部类的成员变量。例如,在实例内部类的方法中,可以使用OuterClass.this.data来访问外部类中的成员变量。
代码演示如下:public int data;class InnerClass {public void display() {System.out.println("OuterClass data: " + OuterClass.this.data);}} } ```
实例内部类中不能直接定义静态成员变量
注意:实例内部类中是不能直接定义静态成员变量的,但是如果确实需要在实例内部类中使用静态成员变量,可以将其定义为 final 类型的常量,因为常量在编译期间会替换为实际的值,不依赖于外部类对象的存在。
比如:
上述代码中的data6被声明为final static int类型,它是一个常量。
在Java中,final关键字用于声明常量,表示该变量的值不能被修改。同时,static关键字表示该变量属于类本身,而不是类的实例。
实例内部类总结
- 外部类的任何成员都可以在实例内部类方法中进行直接访问
- 实例内部类所处的位置和外部类成员相同,因此也受private、public等访问限定符的约束
- 在实例内部类中访问外部类中相同的成员变量时(优先访问自己的),如果访问外部类同名的成员则必须以
外部类名称.this.同名成员来进行访问 - 实例内部类对象必须在先有外部类对象的前提才能创建(即有了外部类对象才能创建内部类对象)
- 实例内部类的非静态方法中包含了一个指向外部类对象的引用(通过
外部类名称.this来调用外部类的成员) - 外部类中不能直接访问实例内部类中的成员,如果要访问则必须先创建内部类对象
二、静态内部类
如果要实例化一个非静态的内部类对象,通常需要先创建外部类的实例,然后使用该实例来创建内部类的对象。这是因为非静态的内部类对象依赖于外部类对象的存在。(实例内部类对象需要外部类对象的引用才可以)
如果我们不使用外部类对象的引用能不能实例内部类对象呢?答案是肯定的。
我们如果不想通过外部类对象来实例内部类对象的话,我们就可以把这个内部类定义成静态内部类。
下面我们通过下面的静态内部类来进行代码的演示,请看:
class OuterClass2{public int data1 = 10;int data2 = 20;static int data3 = 30;public void func(){System.out.println("OuterClass2::func()");}static class InnerClass2{public int data4 = 40;int data5 = 50;public static int data6 = 60;public void func(){System.out.println("InnerClass2::func()");}}
}
如何获取静态类内部类对象
关于如何获取静态类内部类对象,请看举例:
public class Test2 {public static void main(String[] args) {OuterClass2.InnerClass2 innerclass1 = new OuterClass2.InnerClass2();}
}
即:

划重点

解释:在静态内部类 InnerClass2 的 func() 方法中,不能直接访问外部类 OuterClass2 的非静态成员变量和方法。需要注意的是,静态内部类是与外部类的实例无关的,它只能直接访问外部类的静态成员变量和方法。
通俗一点:我们在实例静态类对象的时候并没有用到外部类对象的引用,所以既然没有外部类对象的话我们是不能直接访问data1和data2的(因为data1和data2的调用时需要外部类的引用的);同时上述代码的内部类是一个静态类,我们在实例化静态类对象的时候也并没有用到外部类对象的引用。(总之一句话就是,既然没有外部类对象的引用,我们就不能直接访问data1和data2)
如果我们要访问data1和data2的话,我们可以这样,请看下面代码:

静态内部类需要注意的是:
- 创建静态内部类对象时不需要先创建外部类对象
三、局部内部类
局部内部类是定义在方法或作用域内部的内部类,它的作用域被限制在所在的方法或作用域中。局部内部类与实例内部类和静态内部类相比具有更短的声明周期和更窄的作用域。
这里直接简单演示一个局部内部类,请看:
public class Test2 {public void func(){class InnerClass {//局部内部类}}public static void main(String[] args) {}
}
局部内部类只能在当前方法内进行实例化对象,其它位置都不可以使用。
局部内部类注意事项
- 局部内部类只能在所定义的方法体内部使用
- 不能被public、static等修饰符修饰
- 编译器也有自己独立的字节码文件,内部类字节码文件命名格式:
外部类名字$数字内部类名字.class 哈哈,局部内部类几乎不会使用
在java中,一个类对应一个字节码文件。

四、匿名内部类
直接上代码:
class Person{String name;int age;
}
public static void main(String[] args) {System.out.println(new Person().name);System.out.println(new Person().age);new Person(){//匿名内部类};
}
匿名对象只能使用一个,每次使用都需要new。
匿名内部类这里先简单带大家了解以下,后续再为大家带来更加详细的讲解。
好了,以上就是Java内部类的全部讲解,就到这里啦,再见友友们!!!
相关文章:
【Java基础篇 | 类和对象】--- 聊聊什么是内部类
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习Java的一点学习心得,欢迎大家在评论区讨论💌 前言 当一个事物的内部&…...
合宙Air724UG LuatOS-Air LVGL API控件-页面 (Page)
页面 (Page) 当控件内容过多,无法在屏幕内完整显示时,可让其在 页面 内显示。 示例代码 page lvgl.page_create(lvgl.scr_act(), nil) lvgl.obj_set_size(page, 150, 200) lvgl.obj_align(page, nil, lvgl.ALIGN_CENTER, 0, 0)label lvgl.label_crea…...
mongodb数据库操作
1、启动mongodb /usr/local/mongodb/bin/mongod --dbpath /var/mongodb/data/--logpath /var/mongodb/logs/log.log &在mongodb启动命令中 --dbpath 指定mongodb的数据存储路径 --logpath 指定mongodb的日志存储路径 2、停止mongodb 第一步先进入mongo命令行模式 第二…...
第 2 章 线性表 ( 双链循环线性表(链式存储结构)实现)
1. 背景说明 2. 示例代码 1) status.h /* DataStructure 预定义常量和类型头文件 */#ifndef STATUS_H #define STATUS_H#define CHECK_NULL(pointer) if (!(pointer)) { \printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ERR_NULL_PTR…...
redis在日常开发工作中的常见用法
redis是一款内存型数据库,在开发工作中经常用到,功能强大; 特别开一篇文章用来记录一下它的常见用法,算是一种总结; 它最主要的特点就是高可用的,速度快,分布式;有人说速度快&…...
小程序实现下拉刷新
小程序实现下拉刷新可以通过使用组件scroll-view和事件onPullDownRefresh来实现。 scroll-view组件的使用 在需要下拉刷新的页面的wxml文件中,通过scroll-view组件包裹需要滚动的内容,设置scroll-y属性为true,表示允许竖向滚动。示例代码如…...
Day 36 贪心算法 part05 : 435. 无重叠区间 763.划分字母区间 56. 合并区间
56. 合并区间 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入:inte…...
使用Python将网页数据保存到NoSQL数据库的方法和示例
随着大数据和人工智能技术的快速发展,对于大规模数据的处理需求日益增多。NoSQL数据库作为一种新兴的数据存储解决方案,具有高可扩展性、高性能和灵活性数据模型等优势,已经在许多行业得到广泛应用。传统的关系型数据库在处理海量数据时可能会…...
两个路由器如何连接设置的方法攻略
一、前言 随着智能家居时代来临,家里的网络部署需求开始复杂起来。往往一个路由器已经不能满足需求或者不利于拓展。两个路由器连接最常见的情况是家中已有一个路由器,并且已经通过这个路由器来正常上网。现在是因某些原因想在不改变已经在用的路由器的设…...
分类任务评价指标
分类任务评价指标 分类任务中,有以下几个常用指标: 混淆矩阵准确率(Accuracy)精确率(查准率,Precision)召回率(查全率,Recall)F-scorePR曲线ROC曲线 1. 混…...
c++静态成员
目录 静态成员 静态成员变量 静态成员函数 const 静态成员属性 静态成员实现单例模式 静态成员 在类定义中,它的成员(包括成员变量和成员函数),这些成员可以用关键字 static 声明为静态的,称为静态成员。 不管这…...
go-zero直连与etcd服务注册中心
go-zero中直连方式 在使用grpc是最重要的就是pb文件了,生成的pb文件,通过pb文件可以生成grpc的客户端和服务端,那么客户端和服务端就可以直连了,再次基础上可以引入etcd实现服务注册。 所有的代码都需要开发者编写,包…...
Kotlin File writeText appendText appendBytes readBytes readText
Kotlin File writeText appendText appendBytes readBytes readText import java.io.Filefun main(args: Array<String>) {val filePath "./myfile.txt"val file File(filePath)file.writeText("hello,") //如果原有文件有内容,将完全覆…...
常见缺少msvcp140.dll问题及解决方法,分享多种方法帮你解决
在日常使用电脑的过程中,我们可能会遇到各种问题,比如电脑提示msvcp140.dll文件丢失。这个问题通常是由于某些程序或游戏需要这个dll文件来正常运行,但是由于某种原因,这个文件被误删或者损坏了。那么,如何解决这个问题…...
【K210+ESP8266图传上位机开发】TCP server + JPEG图像解析上位机开发
本文章主要记录基于 【K210-ESP8266】 图传和显示的过程,上位机开发过程,系统架构和下位机开发请参考文章: 【K210-ESP8266】开发板上传图像数据到服务器并实时显示 💖 作者简介:大家好,我是喜欢记录零碎知…...
Linux查看当前文件夹的大小
在Linux中,可以使用du(disk usage)命令来查看当前文件夹的大小。以下是一些使用du的方法: 查看当前文件夹的大小: 为了查看当前文件夹的总大小,可以在文件夹中运行: du -sh .这里: -…...
YOLO目标检测——密集人群人头数据集+已标注yolo格式标签下载分享
实际项目应用:城市安防、交通管理、社会研究、商业应用、等多个领域数据集说明:YOLO密集人群人头目标检测数据集,真实场景的高质量图片数据,数据场景丰富,图片格式为jpg,共4300张图片。标注说明:…...
论文精读 —— Gradient Surgery for Multi-Task Learning
文章目录 Multi-task Learning和 PCGrad 方法简介论文信息论文核心图摘要翻译引言翻译2 使用PCGrad进行多任务学习2.1 基本概念:问题和符号表示2.2 三重悲剧:冲突的梯度,主导的梯度,高曲率2.3 PCGrad:解决梯度冲突2.4 …...
【VS Code插件开发】常见自定义命令(七)
🐱 个人主页:不叫猫先生,公众号:前端舵手 🙋♂️ 作者简介:前端领域优质作者、阿里云专家博主,共同学习共同进步,一起加油呀! 📢 资料领取:前端…...
Spring Cloud服务发现与注册的原理与实现
Spring Cloud服务发现与注册的原理与实现 一、简介1 服务发现的定义2 服务发现的意义 二、Spring Cloud服务注册与发现的实现1 Spring Cloud服务注册1.1 服务注册的基本框架1.2 服务注册的实现方式 2 Spring Cloud服务发现2.1 服务发现的基本框架2.2 服务发现的实现方式 三、Sp…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...


