JavaSE:面向对象进阶之内部类(Inner Class)

news2025/6/4 10:02:15

JavaSE 面向对象进阶之内部类(Inner Class)

一、内部类的核心概念

内部类是定义在另一个类内部的类,它与外部类存在紧密的逻辑关联,主要作用:

  • 封装细节:隐藏实现细节,对外提供简洁接口。
  • 访问权限:可访问外部类的私有成员(包括属性和方法)。
  • 逻辑分组:将相关类组织在同一文件中,提高代码内聚性。
二、内部类的四种形式
1. 成员内部类
  • 定义:作为外部类的成员存在,与属性、方法同级。
  • 特点
    • 可使用 publicprivate 等访问修饰符。
    • 持有外部类的引用:OuterClass.this
  • 示例
public class Outer {
    private int x = 10;
    
    public class Inner {
        public void printX() {
            System.out.println(Outer.this.x); // 访问外部类私有属性
        }
    }
    
    public Inner getInner() {
        return new Inner(); // 创建内部类对象
    }
}

// 创建内部类实例
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner(); // 必须通过外部类实例创建
2. 静态内部类
  • 定义:使用 static 修饰的内部类,不依赖外部类实例。
  • 特点
    • 只能访问外部类的静态成员。
    • 可直接创建实例:new Outer.StaticInner()
  • 示例
public class Outer {
    private static int x = 10;
    
    public static class StaticInner {
        public void printX() {
            System.out.println(x); // 只能访问静态成员
        }
    }
}

// 创建静态内部类实例
Outer.StaticInner inner = new Outer.StaticInner();
3. 局部内部类
  • 定义:定义在方法或代码块内部的类,作用域仅限于该区域。
  • 特点
    • 不能使用访问修饰符(如 public)。
    • 可访问外部类成员及方法的 final 局部变量(Java 8+ 可省略 final,但变量必须实际不可变)。
  • 示例
public class Outer {
    public void method() {
        final int y = 20; // 局部变量(Java 8+ 可省略final)
        
        class LocalInner {
            public void printY() {
                System.out.println(y); // 访问局部变量
            }
        }
        
        LocalInner inner = new LocalInner();
        inner.printY();
    }
}
4. 匿名内部类
  • 定义:没有显式类名的局部内部类,通常用于创建一次性对象。
  • 特点
    • 必须继承一个父类或实现一个接口。
    • 没有构造方法,但可通过实例初始化块初始化。
  • 示例
public interface ClickListener {
    void onClick();
}

public class Button {
    public void setListener(ClickListener listener) {
        listener.onClick();
    }
}

// 使用匿名内部类实现接口
button.setListener(new ClickListener() {
    @Override
    public void onClick() {
        System.out.println("Button clicked");
    }
});

// Java 8+ 可用Lambda简化(函数式接口)
button.setListener(() -> System.out.println("Button clicked"));
三、内部类的应用场景
  1. 事件监听

    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            // 处理事件
        }
    });
    
  2. 封装辅助类

    • Map.EntryMap 的内部接口,用于表示键值对。
  3. 实现多继承

    • 通过内部类继承多个父类,间接实现多继承。
四、注意事项
  1. 内存占用

    • 非静态内部类会持有外部类的强引用,可能导致内存泄漏(如Activity中的匿名内部类)。
  2. 编译后的命名

    • 内部类编译后生成 Outer$Inner.class 文件(匿名内部类为 Outer$1.class)。
  3. 访问限制

    • 静态内部类无法直接访问外部类的非静态成员。
五、面试常见问题
  1. 内部类有哪些类型?

    • 成员内部类、静态内部类、局部内部类、匿名内部类。
  2. 匿名内部类能否有构造方法?

    • 不能,但可通过实例初始化块实现类似构造逻辑。
  3. 为什么局部内部类和匿名内部类只能访问 final 局部变量?

    • Java 8之前要求显式声明 final,之后可省略但变量必须实际不可变。这是为保证变量的生命周期与内部类对象一致(变量值被复制到内部类中)。
六、最佳实践
  • 优先使用静态内部类:减少内存占用,避免潜在的内存泄漏。
  • 避免深层嵌套:内部类层次过深会降低代码可读性。
  • 合理使用匿名内部类:适用于简单实现,复杂逻辑建议使用具名类。

内部类是Java语言的重要特性,它增强了类的封装性和代码的灵活性,尤其在GUI编程和设计模式(如迭代器模式)中广泛应用。

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

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

相关文章

【HW系列】—安全设备介绍(开源蜜罐的安装以及使用指南)

文章目录 蜜罐1. 什么是蜜罐?2. 开源蜜罐搭建与使用3. HFish 开源蜜罐详解安装步骤使用指南关闭方法 总结 蜜罐 1. 什么是蜜罐? 蜜罐(Honeypot)是一种主动防御技术,通过模拟存在漏洞的系统或服务(如数据库…

汽车总线分析总结(CAN、LIN、FlexRay、MOST、车载以太网)

目录 一、汽车总线技术概述 二、主流汽车总线技术对比分析 1. CAN总线(Controller Area Network) 2. LIN总线(Local Interconnect Network) 3. FlexRay总线 4. MOST总线(Media Oriented Systems Transport&#x…

MyBatisPlus--条件构造器及自定义SQL详解

条件构造器 在前面学习快速入门的时候,练习的增删改查都是基于id去执行的,但是在实际开发业务中,增删改查的条件往往是比较复杂的,因此MyBatisPlus就提供了一个条件构造器来帮助构造复杂的条件。 MyBatisPlus支持各种复杂的wher…

OVD开放词汇检测 Detic 训练COCO数据集实践

0、引言 纯视觉检测当前研究基本比较饱和,继续创新提升空间很小,除非在CNN和transformer上提出更强基础建模方式。和文本结合是当前的一大趋势,也是计算机视觉和自然语言处理结合的未来趋势,目前和文本结合的目标检测工作还是有很…

docker、ctr、crictl命令简介与使用

概述 在使用k3s过程中,经常需要使用ctr和crictl两个命令,本文记录一下。 ctr 类似docker命令是docker-shim容器运行时的客户端工具,ctr是Containerd的客户端工具。一个简单的CLI接口,用作Containerd本身的一些调试用途&#xf…

WEB3——什么是ABI

怎么获得ABI? 在编译完合约后,可以在左边下面点击复制ABI ABI(Application Binary Interface,应用二进制接口)是用来让前端或服务端 JavaScript 代码与智能合约进行交互的桥梁,它描述了合约的函数、事件和…

嵌入式软件--stm32 DAY 8.5 基础复习总结

1.时钟树 在数据手册里面,有一张密密麻麻的图,正是时钟系统里的时钟树。 对于时钟,我们注意有两点。一个是系统时钟SYSCLK,一个是依赖外部晶振生成的RTC. RTC以外部低速晶振作为时钟源或者外部高速晶振128分频后作为时钟源,又或者…

MMRL: Multi-Modal Representation Learning for Vision-Language Models(多模态表示学习)

摘要 预训练的VLMs,对于跨任务的迁移学习至关重要,然而,在few-shot数据集上微调会导致过拟合,降低在新任务上的性能。为解决这个问题,提出一种新的多模态表征学习框架(MMRL),该框架引入了一个共享、可学习…

rsync服务的搭建

目录 一、rsync介绍 rsync的安装 二、rsync的语法 三、rsync命令使用 1. 本机同步 2. 远程同步 四、rsync作为服务使用 1、尝试启动rsync程序 2、rsync的配置文件介绍 注意事项: 3. rsyncinotify实时同步 3.依赖服务托管xinetd(CentOS 6中rs…

vscode 配置 QtCreat Cmake项目

1.vscode安装CmakeTool插件并配置QT中cmake的路径,不止这一处 2.cmake生成器使用Ninja(Ninja在安装QT时需要勾选),可以解决[build] cc1plus.exe: error: too many filenames given; type ‘cc1plus.exe --help’ for usage 编译时…

HTML实现端午节主题网站:龙舟争渡,凭吊祭江诵君赋。

名人说:龙舟争渡,助威呐喊,凭吊祭江诵君赋。——苏轼《六幺令天中节》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、项目概览:传统与现代的技术碰撞1. 核心特…

uniapp uni-id 如果是正式项目,需自行实现发送邮件的相关功能

(3) 使用云对象sendEmailCode 发送邮箱验证码,报错送邮箱验证码失败 Error: 已启动测试模式,直接使用:123456作为邮箱验证码即可。 如果是正式项目,需自行实现发送邮件的相关功能 - DCloud问答 uni-id 没有实现邮箱验证码逻辑&am…

C++学习-入门到精通【12】文件处理

C学习-入门到精通【12】文件处理 目录 C学习-入门到精通【12】文件处理一、文件和流二、创建顺序文件三、从顺序文件读取数据文件定位指针对之前的程序进行修改:贷款查询程序 四、更新顺序文件五、随机存取文件1.创建随机存取文件2.修改程序:贷款处理程序…

记一次 Starrocks be 内存异常宕机

突发性 be 内存飙高,直至被系统 kill 掉,be 内存如下:其中 starrocks_be_update_mem_bytes 指标打满,重启也是如此 [rootlocalhost bin]# curl -XGET -s http://192.168.1.49:8040/metrics | grep "^starrocks_be_.*_mem_b…

LangChain-结合GLM+SQL+函数调用实现数据库查询(一)

业务流程 实现步骤 1. 加载数据库配置 在项目的根目录下创建.env 文件,设置文件内容: DB_HOSTxxx DB_PORT3306 DB_USERxxx DB_PASSWORDxxx DB_NAMExxx DB_CHARSETutf8mb4 加载环境变量,从 .env 文件中读取数据库配置信息 使用 os.getenv…

2025年渗透测试面试题总结-匿名[校招]安全工程师(甲方)(题目+回答)

安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 匿名[校招]安全工程师(甲方) 1. 介绍自己熟悉的渗透领域 2. 编程语言与开发能力 3. 实习工作内容与流程 …

PySide6 GUI 学习笔记——常用类及控件使用方法(地址类QUrl)

文章目录 地址类QUrl主要功能URL 格式介绍常见 scheme(协议)类型QUrl 类常用方法常用方法示例典型应用场景 地址类QUrl QUrl 是 PySide6.QtCore 模块中的一个类,用于处理和操作 URL(统一资源定位符)。它可以解析、构建…

任务23:创建天气信息大屏Django项目

任务描述 知识点: Django 重 点: Django创建项目Django视图函数Django路由Django静态文件Django渲染模板 内 容: 使用PyCharm创建大屏项目渲染大屏主页 任务指导 1. 使用PyCharm创建大屏项目。 创建weather项目配置虚拟环境创建ch…

数学分析——一致性(均匀性)和收敛

目录 1. 连续函数 1.1 连续函数的定义 1.2 连续函数的性质 1.2.1 性质一 1.2.2 性质二 1.2.3 性质三 1.2.4 性质四 2. 一致连续函数 2.1 一致连续函数的定义 2.2 一致连续性定理(小间距定理)(一致连续函数的另一种定义) 2.3 一致连续性判定法 2.4 连…

Flutter GridView网格组件

目录 常用属性 GridView使用配置 GridView.count使用 GridView.extent使用 GridView.count Container 实现列表 GridView.extent Container 实现列表 GridView.builder使用 GridView网格布局在实际项目中用的也是非常多的,当我们想让可以滚动的元素使用矩阵…