全面解析Java内部类:类型与应用场景

news2024/12/24 11:36:50

内部类是定义在另一个类内部的类。Java支持多种类型的内部类,每种类型都有其特定的用途和特性。

一,成员内部类(Member Inner Class)

1,特性
  • 定义位置:成员内部类定义在外部类的内部,与外部类的成员变量和方法同级。
  • 访问权限:成员内部类可以访问外部类的所有成员变量和方法,包括私有成员。
  • 实例化:成员内部类的实例必须通过外部类的实例创建。
2,应用场景

成员内部类适用于需要访问外部类的实例成员的情况。例如,定义一个表示外部类和内部类关系的例子:

public class OuterClass {
    private String outerField = "Outer field";

    public class InnerClass {
        public void display() {
            System.out.println("Accessing from inner class: " + outerField);
        }
    }

    public void createInnerInstance() {
        InnerClass inner = new InnerClass();
        inner.display();
    }
}

二,静态内部类(Static Nested Class)

1,特性
  • 定义位置:静态内部类定义在外部类的内部,并使用static修饰。
  • 访问权限:静态内部类只能访问外部类的静态成员,不能直接访问外部类的实例成员。
  • 实例化:静态内部类的实例可以直接通过外部类名创建,无需外部类实例。
2,应用场景

静态内部类适用于不需要访问外部类实例成员的情况。例如,定义一个静态内部类:

public class OuterClass {
    private static String staticOuterField = "Static Outer field";

    public static class StaticInnerClass {
        public void display() {
            System.out.println("Accessing from static inner class: " + staticOuterField);
        }
    }

    public static void createStaticInnerInstance() {
        StaticInnerClass inner = new StaticInnerClass();
        inner.display();
    }
}

三,局部内部类(Local Inner Class)

1,特性
  • 定义位置:局部内部类定义在方法或代码块内部。
  • 访问权限:局部内部类可以访问包含它的方法的局部变量(必须是final或有效final)。
  • 作用范围:局部内部类的作用范围仅限于定义它的方法或代码块。
2,应用场景

局部内部类适用于只在特定方法或代码块中使用的类。例如,定义一个局部内部类:

public class OuterClass {
    public void display() {
        final String localVariable = "Local variable";

        class LocalInnerClass {
            public void print() {
                System.out.println("Accessing from local inner class: " + localVariable);
            }
        }

        LocalInnerClass localInner = new LocalInnerClass();
        localInner.print();
    }
}

四,匿名内部类(Anonymous Inner Class)

1,特性
  • 定义位置:匿名内部类没有类名,通常定义在方法内部,用于实现接口或继承类的实例。
  • 访问权限:匿名内部类可以访问包含它的方法的局部变量(必须是final或有效final)。
  • 一次性使用:匿名内部类通常用于一次性使用的场景。
2,应用场景

匿名内部类适用于需要快速实现接口或继承类的情况。例如,定义一个匿名内部类:

public class OuterClass {
    public void display() {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("Running from anonymous inner class");
            }
        };

        Thread thread = new Thread(runnable);
        thread.start();
    }
}

五,结论

内部类在Java中提供了一种将类的定义嵌套在另一个类中的方式,使得代码结构更加紧凑和逻辑清晰。不同类型的内部类——成员内部类、静态内部类、局部内部类和匿名内部类——各有其特性和应用场景。理解和合理使用内部类,可以使Java代码更加灵活和易于维护。

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

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

相关文章

Oracle基础查询

第一章 数据查询 1.1 单表查询 1.1.1 数据准备 找到分享的sql文件,选中文件,右键进行复制,选中以wateruser用户登录的连接,右键粘贴,然后ok确认,就可以将两个sql文件添加到了Datagrip的工程中,打…

解决com.mysql.jdbc.NonRegisteringDriver内存泄漏问题

1. 问题背景 线上出现内存报警,通过dump文件,MAT分析,发现mysql-connector-java 有内存泄漏问题 2.问题分析 然后看大对象列表,NonRegisteringDriver 对象确实占内存比较多,里面村的数据库连接的虚引用占比较多 3.解…

如何优雅处理异常?处理异常的原则

前言 在我们日常工作中,经常会遇到一些异常,比如:NullPointerException、NumberFormatException、ClassCastException等等。 那么问题来了,我们该如何处理异常,让代码变得更优雅呢? 1 不要忽略异常 不知…

华为2288HV2服务器安装BCLinux8U6无法显示完整安装界面的问题处理

本文记录了华为2288HV2服务器安装BCLinux8U6无法显示完整安装界面,在安装过程中配置选择时,右侧安装按钮不可见,导致安装无法继续的问题处理过程。 一、问题现象 华为2288HV2服务器安装BCLinux8U6时无法显示完整的安装界面,问题…

Qt多边形填充/不填充绘制

1 填充多边形绘制形式 void GraphicsPolygonItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {Q_UNUSED(option);Q_UNUSED(widget);//painter->setPen(pen()); // 设置默认画笔//painter->setBrush(brush()); // 设置默…

Python设计模式探究:单例模式实现及应用解析

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…

Linux权限解析:用户、组和权限的协同

​​​​​​​在Linux系统中,权限决定了谁能做什么。本文将指导你如何掌握这些权限,以确保你的系统既安全又高效! 目录 1.shell命令及其运行原理 2.Linu权限的概念 (1) 用户 (2) 切换用户命令su (3) 指令提权命令sudo (4) 什么是权限…

java、excel表格合并、指定单元格查找、合并文件夹

#创作灵感# 公司需求 记录工作内容 后端:JAVA、Solon、easyExcel、FastJson2 前端:vue2.js、js、HTML 模式1:合并文件夹 * 现有很多文件夹 想合并全部全部的文件夹的文件到一个文件夹内 * 每个部门发布的表格 合并全部的表格为方便操作 模…

koa项目实战 == 实现注册登录鉴权

一. 项目的初始化 1 npm 初始化 npm init -y生成package.json文件: 记录项目的依赖 2 git 初始化 git init生成’.git’隐藏文件夹, git 的本地仓库 3 创建 ReadMe 文件 二. 搭建项目 1 安装 Koa 框架 npm install koa2 编写最基本的 app 创建src/main.js const Koa…

JAVA基础:单元测试;注解;枚举;网络编程 (学习笔记)

单元测试 操作步骤: a.导包import org.junit; b.三个注解 Test Before After c.点击Test 运行就可以了 用在不需要控制台输入的情境下:javaweb,框架项目,微服务项目 供开发人员自己做测试。 package com.page…

四个TikTok万能爆单选品法,第1个超过75%卖家会用!

做TK想爆单至关键的一步就是选品!7分靠选品、3分靠运营,一开始你要把品选错了,再怎么运营都是在浪费时间。接下来分享一些万能选品思路,不管做什么类目的商家都可以参考! 一、热卖品榜单选品 这是一种很常见&#xf…

Linux开发工具——make/Makefile

目录 一、什么是makefile? 二、为什么要有makefile? 三、makefile的使用 1.依赖关系与依赖方法 2.伪目标 3.定义变量 4.特殊符号 四、makefile的执行逻辑 一、什么是makefile? Makefile是一种自动化构建工具,make是一条指…

开发中使用UML的流程_01概述

目录 CIM-1:定义业务流程 CIM-2:分析业务流程 ​CIM-3:定义系统范围 ​PIM-1:分析系统流程 PIM-2:分析业务规则 PIM-3:定义静态结构 PIM-4:定义操作和方法 开发中使用UML的流程,主要分为7部分,具体如下: CIM-1:定义业务流程 定义及分析业务流程是为了尽快理…

前端开发模板Pear Admin Layui

目录 基本资料学习笔记04-Pear-Admin-Layui模板运行05-Pear-Admin-Layui-GIT方式代...06-Pear-Admin与Vue对比 & 07-Pear-Admin与Vue对比补充09-Pear-Admin-CRUD练习-数据库表创建12-Pear-Admin-CRUD练习-引入其它依赖 & 13-Pear-Admin-CRUD练习-三层架构以及常见配置 …

[MySQL#10] 索引底层(1) | Page | 页目录

目录 1. 初识索引 2. 认识磁盘 3. MySQL与磁盘交互基本单位 4. 索引的理解 1. 重谈Page 2. 为什么IO交互要用Page 3. 有主键的表插入数据时的排序 4. 单个Page与多个Page 4.1 单个Page 4.2 多个Page 目录 单Page目录 多Page目录 在看本文之前,可以回顾…

.net c# 使用 MailKit库接收139邮箱邮件

开发工具 vs2022,新建-控制台应用。项目完整代码下载: 要安装MailKit库 using MailKit; using MailKit.Net.Imap; using MimeKit; using System.Text; namespace MailKit_mail {internal class Program{static void Main(string[] args){//需要使用 Ma…

Centos开机自启动脚本示例

本文建议创建一个sh文件管理自启动的各项内容,再将sh文件设置开机启动 在/root/autoshell下创建一个autostart.sh,内容如下 #!/bin/bash # description:开机自启脚本# 启动mongodb sh /root/software/mongodb-linux-x86_64-rhel70-4.0.6/bin/mongod --c…

虚拟现实和增强现实技术,如何打造沉浸式体验?

内容概要 在这个科技飞速发展的时代,虚拟现实(VR)与增强现实(AR)技术的结合就像调皮的小精灵,一下子把我们的生活变得神奇又有趣。想象一下,你正在游戏中与精灵搏斗,突然间身边的客…

计算机网络 TCP/IP体系 数据链路层

一. 数据链路层的基本概念 数据链路层主要负责节点之间的通信,确保从物理层接收到的数据能够准确无误地传输到网络层。 数据链路层使用的信道主要有以下两种类型: 点对点信道: 这种信道使用一对一的点对点通信方式。广播信道: 这种信道使用一对多的广播通信方式,…

数据结构————链表

一、引言 1. 中间/头部的插入删除,时间复杂度为O(N) 2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。 3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200&#x…