当前位置: 首页 > news >正文

Java 之四种内部类详解

在 Java 中,除了传统的类定义方式之外,还有一种特殊的类定义方式——内部类。内部类定义在另一个类的内部,可以访问外部类的成员,这使得代码更加灵活和可读性更强。本文将详细讲解 Java 中四种内部类的类型:成员内部类、静态内部类、局部内部类和匿名内部类,并辅以代码示例,帮助初学者更好地理解内部类的概念、调用方式和应用场景。

一、成员内部类

1. 概念

成员内部类定义在另一个类的内部,它可以访问外部类的所有成员(包括私有成员)。成员内部类就像外部类的成员变量一样,它与外部类实例相关联。

2. 调用方式
  • 创建成员内部类的对象需要先创建外部类的对象,然后使用外部类对象引用访问内部类。

3. 应用场景
  • 组织代码: 将与外部类密切相关的代码组织到内部类中,提高代码的可读性和可维护性。

  • 访问外部类成员: 成员内部类可以访问外部类的私有成员,这使得内部类可以更方便地操作外部类的状态。

4. 代码示例
public class OuterClass {private String outerVar = "OuterClass variable";// 成员内部类class InnerClass {public void accessOuterVar() {System.out.println("Accessing outer variable: " + outerVar);}}public static void main(String[] args) {OuterClass outer = new OuterClass();// 创建内部类对象OuterClass.InnerClass inner = outer.new InnerClass();// 调用内部类方法inner.accessOuterVar(); // 输出: Accessing outer variable: OuterClass variable}
}

二、静态内部类

1. 概念

静态内部类也定义在另一个类的内部,但它与外部类没有直接关联。静态内部类可以访问外部类的静态成员,但不能访问外部类的非静态成员。

2. 调用方式
  • 静态内部类可以直接使用外部类名访问,不需要创建外部类对象。

3. 应用场景
  • 组织代码: 将与外部类相关的逻辑组织到静态内部类中,提高代码的可读性和可维护性。

  • 避免外部类实例: 当不需要访问外部类的实例成员时,可以使用静态内部类。

4. 代码示例
public class OuterClass {static String outerStaticVar = "OuterClass static variable";// 静态内部类static class StaticInnerClass {public void accessOuterStaticVar() {System.out.println("Accessing outer static variable: " + outerStaticVar);}}public static void main(String[] args) {// 创建静态内部类对象OuterClass.StaticInnerClass staticInner = new OuterClass.StaticInnerClass();// 调用静态内部类方法staticInner.accessOuterStaticVar(); // 输出: Accessing outer static variable: OuterClass static variable}
}

三、局部内部类

1. 概念

局部内部类定义在方法内部,它只能访问方法内的局部变量,并且只能在方法内部使用。

2. 调用方式
  • 局部内部类只能在定义它的方法内部使用。

3. 应用场景
  • 封装逻辑: 将方法内部的逻辑封装到局部内部类中,提高代码的可读性和可维护性。

  • 创建匿名对象: 局部内部类可以用来创建匿名对象,简化代码。

4. 代码示例
public class OuterClass {public void method() {// 局部内部类class LocalInnerClass {public void printMessage() {System.out.println("This is a local inner class");}}// 创建局部内部类对象LocalInnerClass localInner = new LocalInnerClass();// 调用局部内部类方法localInner.printMessage(); // 输出: This is a local inner class}public static void main(String[] args) {OuterClass outer = new OuterClass();outer.method();}
}

四、匿名内部类

1. 概念

匿名内部类没有名字,它直接定义在创建对象的地方。匿名内部类可以实现接口或继承类,并重写方法。

2. 调用方式
  • 匿名内部类直接在创建对象的地方定义和使用。

3. 应用场景
  • 简化代码: 当只需要实现一个接口或重写一个方法时,可以使用匿名内部类简化代码。

  • 创建匿名对象: 匿名内部类可以用来创建匿名对象,简化代码。

4. 代码示例
public class OuterClass {public void method() {// 匿名内部类实现接口Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("This is an anonymous inner class");}};// 执行匿名内部类new Thread(runnable).start();}public static void main(String[] args) {OuterClass outer = new OuterClass();outer.method();}
}

五、四种内部类的异同

特性成员内部类静态内部类局部内部类匿名内部类
定义位置类内部类内部方法内部创建对象的地方
访问权限可以访问外部类的所有成员可以访问外部类的静态成员可以访问方法内的局部变量可以访问方法内的局部变量
创建方式使用外部类对象引用创建使用外部类名创建在方法内部创建在创建对象的地方定义
应用场景组织代码,访问外部类成员组织代码,访问外部类的静态成员封装逻辑,创建匿名对象简化代码,实现接口或重写方法

结语:内部类是 Java 中一种强大的机制,它可以帮助我们编写更简洁、更易于维护的代码。选择哪种内部类取决于具体的场景需求。以上就是关于四种内部类的讲解,希望有助于各位看官的学习,感谢各位看官的观看,下期见,谢谢~

相关文章:

Java 之四种内部类详解

在 Java 中,除了传统的类定义方式之外,还有一种特殊的类定义方式——内部类。内部类定义在另一个类的内部,可以访问外部类的成员,这使得代码更加灵活和可读性更强。本文将详细讲解 Java 中四种内部类的类型:成员内部类…...

03:手动可变电阻

可变电阻 1、电位器2、变阻器/数字电位器2.1:变阻器2.2:数字电位器 3、电位器锥度4、寄生电感/电容 1、电位器 如上图所示:将可变的电阻作为分压器,那么这种可变的电阻就是电位器。例如:将L1连接负极,L3连接…...

嵌入式Linux电池管理(TODO)

(TODO) 在树莓派3B上使用电池供电需要考虑多个方面,包括电源管理、硬件连接和软件配置。以下是详细的步骤和建议: 1. 选择合适的电池 树莓派3B需要5V的电源供电,通常电流需求在2.5A左右。常见的电池选择包括&#xff1…...

Python 求亲和数

亲和数(Amicable Numbers)是指两个不同的正整数,它们的真因数(即除去本身的所有因数)之和与对方的数相等。 def sum_of_proper_divisors(n):"""计算一个数的真因子之和"""divisors_su…...

【C++】——vector模拟实现和迭代器失效问题

文章目录 模拟实现vector基本成员变量vector的构造与析构vector迭代器vector容量vector元素访问vector修改操作 vector迭代器失效问题什么是迭代器失效1.插入元素导致迭代器失效2.删除元素导致迭代器失效3.重新分配空间导致迭代器失效 如何解决迭代器失效问题 模拟实现 vector…...

USB 3.1 标准 A 型连接器及其引脚分配

USB 3.1 标准 A 型连接器 USB 3.1 标准 A 型连接器被定义为主机连接器。它具有与 USB 2.0 标准 A 型连接器相同的配合接口,但增加了另外两对差分信号和一个接地引脚。 USB 3.1 标准 A 型插座可以接受 USB 3.1 标准 A 型插头或 USB 2.0 标准 A 型插头。类似地&…...

机器学习文献|基于循环细胞因子特征,通过机器学习算法预测NSCLC免疫治疗结局

今天我们一起学习一篇最近发表在Journal for immunotherapy of cancer (IF 10.9)上的文章,Machine learning for prediction of immunotherapeutic outcome in non-small-cell lung cancer based on circulating cytokine signatures[基于循环…...

Qt 实现自定义截图工具

目录 Qt 实现自定义截图工具实现效果图PrintScreen 类介绍PrintScreen 类的主要特性 逐步实现第一步:类定义第二步:初始化截图窗口第三步:处理鼠标事件第四步:计算截图区域第五步:捕获和保存图像 完整代码PrintScreen.…...

第15-05章:获取运行时类的完整结构

我的后端学习大纲 我的Java学习大纲 6.1.第一组方法API: 1.API列表:java.lang.Class 类: 2.代码测试: public class ReflectionUtils{ puvblic static void main(String[] args){}// 第一组Testpublic void api_01{//上面截图的代码......…...

【Kubernetes】K8s 的鉴权管理(二):基于属性 / 节点 / Webhook 的访问控制

K8s 的鉴权管理(二):基于属性 / 节点 / Webhook 的访问控制 1.基于属性的访问控制(ABAC 鉴权)2.基于节点的访问控制(node 鉴权)2.1 读取操作2.2 写入操作 3.基于 Webhook 的访问控制3.1 基于 We…...

Java面试、技巧、问题、回复,资源面面观

入门 先了解一下面试流程 复习 Java 基础知识: 温习 Java 编程的核心概念,包括数据类型、变量、循环、数组和面向对象的编程原则。数据结构和算法: 加强您对 Java 编程中使用的基本数据结构和算法的理解。练习编码: 在各种平台上解…...

深入理解Elasticsearch的`_source`字段与索引优化

在Elasticsearch (ES) 中,_source字段是一个关键组件,它不仅决定了数据的存储方式,还影响到查询时返回的内容。在某些场景下,我们可以通过配置_source来优化存储和性能,尤其是当我们希望减少存储空间或避免返回某些字段…...

Pikachu靶场

先来点鸡汤,少就是多,慢就是快。 环境搭建 攻击机kali 192.168.146.140 靶机win7 192.168.146.161 下载zip,pikachu - GitCode 把下载好的pikachu-master,拖进win7,用phpstudy打开网站根目录,.....再用…...

TS axios封装

方式一 service/request/request.ts import axios from axios import { ElLoading } from element-plus import type { AxiosRequestConfig, AxiosInstance, AxiosResponse } from axios import type { ILoadingInstance } from element-plus/lib/el-loading/src/loading.typ…...

学会使用西门子博途Startdrive中的测量功能

工程师在驱动调试过程中,往往需要对驱动系统的性能进行分析及优化,比如说借助于调试软件中的驱动器测量功能,可以得到驱动系统的阶跃响应、波特图等,以此为依据工程师可以调整速度控制器、电流控制器的相关参数,使驱动…...

Spring Security认证与授权

1 Spring Security介绍 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。由于它是Spring生态系统中的一员,因此它伴随着整个Spring生态系统不断修正、升级,在spring boot项目中加入springsecurity更是…...

速通GPT:Improving Language Understanding by Generative Pre-Training全文解读

文章目录 速通GPT系列几个重要概念1、微调的具体做法2、任务感知输入变换3、判别式训练模型 Abstract概括分析和观点1. 自然语言理解中的数据问题2. 生成预训练和监督微调的结合3. 任务感知输入变换4. 模型的强大性能 Introduction概括分析和观点1. 自然语言理解的挑战在于对标…...

软件质量保证例题

答案:D 软件质量保证 功能性 适合性 准确性 互操作性 安全保密性 依从性 可靠性 成熟性 容错性 易恢复性 易用性 易理解性 易学性 易操作性 效率 时间特性 资源利用性 维护性 易分析性 易改变性 稳定性 易测试性 可移植性 适应性 易安装性 一致性 易替换…...

动态规划算法---04.斐波那契数列模型_解码方法_C++

题目链接:91. 解码方法 - 力扣(LeetCode)https://leetcode.cn/problems/decode-ways/description/ 一、题目解析 题目: 题目大意:从题目中我们可以知道,解码就是在字符串s中由‘1’到‘26’的字符可以转化…...

crm如何做私域运营?

流量获取的挑战日益增加,客户线索成本高、客户资源流失严重、转化率低,因此,私域流量管理已成为关键。 当前挑战 1、公域流量难以整合:外部流量分散,难以有效汇总和沉淀。 2、私域运营体系缺失:缺乏有效沟…...

基于QGIS 3.16.0 的OSM路网矢量范围裁剪实战-以湖南省为例

目录 前言 一、相关数据介绍 1、OMS路网数据 2、路网数据 3、路网图层属性 二、按省域范围进行路网裁剪 1、裁剪范围制定 2、空间裁剪 3、裁剪结果 三、总结 前言 改革开放特别是党的十八大以来,我国公路发展取得了举世瞩目的成就。国家高速公路网由“7 射…...

WPF 手撸插件 八 依赖注入

本文内容大量参考了:https://www.cnblogs.com/Chary/p/11351457.html 而且这篇文章总结的非常好。 1、注意想使用Autofac,Autofac是一个轻量级、‌高性能的依赖注入(‌DI)‌框架,‌主要用于.NET应用程序的组件解耦和…...

走进低代码报表开发(一):探秘报表数据源

在前文当中,我们对勤研低代码平台的流程设计功能进行了介绍。接下来,让我们一同深入了解在企业日常运营中另一个极为常见的报表功能。在当今数字化时代,高效的报表生成对于企业的决策至关重要。勤研低代码开发平台能够以卓越的性能和便捷的操…...

代理服务器及其原理

代理服务器的代理可以分为正向代理和反向代理,本篇将讲解这两种代理方式的原理,以及对应的功能特点和应用场景。最后还对比和 NAT 和代理服务器的区别。 目录 正向代理 工作原理 功能特点 应用场景 反向代理 基本原理 应用场景 NAT和代理服务器…...

计算机毕业设计选题推荐-养老院管理系统-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

免费SSL证书正在逐渐被淘汰,证书部署自动化的发展趋势即将到来!

目录 背景解决方案。1.使用自签证书(浏览器报警、免费)2.更换支持自签自续的CA机构(免费)3.付费选择CA机构 免费SSL证书正在逐渐被淘汰,证书部署自动化的发展趋势即将到来免费的SSL证书有以下弊端1.有效期短&#xff1…...

openVX加速-基本概念和简单代码实现

OpenVX 是一个用于计算机视觉和图像处理的跨平台加速标准库,旨在提高在异构平台(如 CPU、GPU、DSP 等)上的执行效率。OpenVX 提供了一组优化的、可移植的 API,用于加速常见的视觉算法,使开发者能够在不同硬件平台上实现…...

网工内推 | 网络工程师,Base上海,HCIP/HCIE认证优先

01 利宏科技 🔷招聘岗位:网络工程师 🔷任职要求 1、有HCIE、HCIP证书 2、做过IDC机房网络建设 3、本科毕业 4、熟悉基本linux命令 5、熟悉山石、华为等防火墙 6、熟悉IPS、WAF等安全设备 7、做过同城灾备机房建设优先 🔷薪…...

Windows10 如何配置python IDE

Windows10 如何配置python IDE 前言Python直接安装(快速上手)Step1.找到网址Step2.选择版本(非常重要)Step3. 安装过程Step4. python测试 Anaconda安装(推荐,集成了Spyder和Pycharm的安装)Step1…...

Machine Learning: A Probabilistic Perspective 机器学习:概率视角 PDF免费分享

下载链接在博客最底部!! 之前需要参考这本书,但是大多数博客都是收费才能下载本书。 在网上找了好久才找到免费的资源,浪费了不少时间,在此分享以节约大家的时间。 链接: https://pan.baidu.com/s/1erFsMcVR0A_xT4fx…...