Java中内部类的分类及访问权限控制

java内部类分为四种类型及使用场景:1.成员内部类依赖外部类实例,可访问所有成员;2.静态内部类不依赖实例,只能访问静态成员;3.局部内部类定义在方法中,作用域受限;4.匿名内部类用于一次性的类实现。内部类会持有外部类引用,可能导致内存泄漏,解决方式包括使用静态内部类、控制生命周期或手动置空。内部类适合紧密耦合的封装场景,组合则适用于需要灵活解耦的设计。合理使用内部类不会显著影响性能,但过多使用可能增加类加载开销。

Java中内部类的分类及访问权限控制

内部类是Java中一个挺有意思的特性,它允许你在一个类里面定义另一个类。这东西用好了,代码结构会更清晰,封装性也更强。但用不好,也容易把自己绕进去。

Java中内部类的分类及访问权限控制

解决方案

Java中内部类的分类及访问权限控制

Java中的内部类主要分为四种:成员内部类、静态内部类、局部内部类和匿名内部类。每种内部类都有其特定的用途和访问权限控制。

立即学习“Java免费学习笔记(深入)”;

Java中内部类的分类及访问权限控制

成员内部类: 就像一个普通的成员变量一样,它依赖于外部类的实例而存在。这意味着,只有先创建了外部类的实例,才能创建成员内部类的实例。成员内部类可以直接访问外部类的所有成员,包括私有成员。

class Outer {    private int outerVar = 10;    class Inner {        public void printOuterVar() {            System.out.println("Outer var: " + outerVar);        }    }    public void createInner() {        Inner inner = new Inner();        inner.printOuterVar();    }}public class Main {    public static void main(String[] args) {        Outer outer = new Outer();        outer.createInner();        // 另一种创建内部类的方式(需要先有外部类实例)        Outer.Inner inner = outer.new Inner();        inner.printOuterVar();    }}

注意 outer.new Inner() 这种创建内部类实例的方式,必须先有外部类实例。

静态内部类: 顾名思义,它是用 static 关键字修饰的内部类。静态内部类不依赖于外部类的实例,可以直接通过外部类名访问。它只能访问外部类的静态成员。

class Outer {    private static int outerStaticVar = 20;    static class Inner {        public void printOuterVar() {            System.out.println("Outer static var: " + outerStaticVar);        }    }    public static void createInner() {        Inner inner = new Inner();        inner.printOuterVar();    }}public class Main {    public static void main(String[] args) {        Outer.createInner(); // 不需要外部类实例        Outer.Inner inner = new Outer.Inner(); // 直接通过外部类名访问        inner.printOuterVar();    }}

静态内部类有点像外部类的一个静态成员,但它仍然是一个类,可以拥有自己的成员变量和方法。

局部内部类: 定义在方法或代码块中的类。它的作用范围仅限于该方法或代码块。局部内部类不能使用访问修饰符(如 public、private、protected),因为它不是外部类的成员。

class Outer {    public void doSomething() {        class Inner {            public void printMessage() {                System.out.println("Message from local inner class");            }        }        Inner inner = new Inner();        inner.printMessage();    }}public class Main {    public static void main(String[] args) {        Outer outer = new Outer();        outer.doSomething();    }}

局部内部类主要用于封装一些只在特定方法中使用的逻辑。

卡拉OK视频制作 卡拉OK视频制作

卡拉OK视频制作,在几分钟内制作出你的卡拉OK视频

卡拉OK视频制作 178 查看详情 卡拉OK视频制作

匿名内部类: 没有名字的内部类。通常用于创建只需要使用一次的类。匿名内部类必须继承一个类或实现一个接口。

interface MyInterface {    void doSomething();}public class Main {    public static void main(String[] args) {        MyInterface myInterface = new MyInterface() {            @Override            public void doSomething() {                System.out.println("Doing something from anonymous inner class");            }        };        myInterface.doSomething();    }}

匿名内部类经常与 Lambda 表达式一起使用,可以简化代码。

内部类如何影响Java程序的性能?

内部类本身并不会直接导致性能问题,关键在于如何使用。过多的内部类可能会增加类的数量,从而增加类加载的开销。另外,成员内部类会持有外部类的引用,如果内部类的生命周期比外部类长,可能会导致内存泄漏。匿名内部类如果使用不当,可能会生成大量的类文件,也会影响性能。所以,需要根据实际情况权衡使用内部类的好处和潜在的性能影响。

内部类和组合有什么区别?什么时候应该使用哪种方式?

内部类和组合都是实现代码重用和封装的方式。内部类更侧重于封装,它允许内部类直接访问外部类的成员,可以实现更紧密的耦合。组合更侧重于解耦,通过接口或抽象类定义组件之间的关系,可以实现更灵活的扩展和维护。

什么时候应该使用内部类呢?当一个类只会被另一个类使用,并且需要访问外部类的私有成员时,可以考虑使用内部类。例如,GUI编程中的事件监听器,或者数据结构中的迭代器。什么时候应该使用组合呢?当需要实现更灵活的组件组合,并且组件之间不需要紧密的耦合时,应该使用组合。例如,设计一个图形编辑器,可以使用组合的方式将不同的图形组件组合在一起。

如何避免内部类导致的内存泄漏?

内存泄漏通常发生在成员内部类中,因为成员内部类会持有外部类的引用。如果内部类的生命周期比外部类长,可能会导致外部类无法被垃圾回收。避免内存泄漏的方法有以下几种:

尽量使用静态内部类,因为静态内部类不持有外部类的引用。如果必须使用成员内部类,确保内部类的生命周期不会超过外部类。在不再需要内部类时,手动将其设置为 null,以便垃圾回收器可以回收它。使用弱引用(WeakReference)来持有外部类的引用,这样即使内部类持有外部类的引用,外部类也可以被垃圾回收。

以上就是Java中内部类的分类及访问权限控制的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/265271.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
工信部发布智能网联推进会公告:禁止“智驾”等不当宣传
上一篇 2026年10月12日 19:26:27
Go语言自然语言处理:文本分析与处理入门
下一篇 2025年12月15日 08:39:23

相关推荐

  • 小米澎湃OS 3视觉UI全方位重制:图标高清化、个性化锁屏进化

    小米澎湃OS 3视觉UI全方位重制:图标高清化、个性化锁屏进化小米澎湃OS 3视觉UI全方位重制:图标高清化、个性化锁屏进化小米澎湃OS 3视觉UI全方位重制:图标高清化、个性化锁屏进化小米澎湃OS 3视觉UI全方位重制:图标高清化、个性化锁屏进化

    8月28日消息,此次%ign%ignore_a_1%re_a_1%澎湃os 3的升级不仅聚焦于性能优化,更在ui设计层面实现了全面革新,对常用系统界面进行了统一且深度的焕新。 系统桌面图标完成高清化重塑,整体色彩体系更加统一,视觉呈现更为和谐美观。 同时,桌面网格布局也经过重新优化,分布更均匀,观感…

    2026年10月12日 • 用户投稿
    100
  • Java OOP三大特性详解 封装继承与多态如何实现

    封装保护数据,通过private字段和getter/setter实现;继承复用代码,用extends建立父子类关系;多态提升灵活性,依赖重写和父类引用指向子类对象。 Java 面向对象编程(OOP)的三大核心特性是封装、继承和多态。它们是构建可维护、可扩展程序的基础。下面逐一说明每个特性的含义及实现…

    2026年10月12日
    100
  • Composer项目中Composer的使用技巧_提升开发效率的实用方法

    Composer项目中Composer的使用技巧_提升开发效率的实用方法Composer项目中Composer的使用技巧_提升开发效率的实用方法Composer项目中Composer的使用技巧_提升开发效率的实用方法Composer项目中Composer的使用技巧_提升开发效率的实用方法

    Composer不仅是依赖管理工具,更是提升PHP开发效率的核心。首先,通过composer dump-autoload -o优化自动加载,生成classmap以提升生产环境性能;其次,利用scripts定义自动化脚本,如测试、部署等,统一团队开发流程;再者,合理使用版本约束(^、~)并锁定关键依赖…

    2026年10月12日 • 用户投稿
    100
  • 工信部:正在全国86个城市168个小区、工厂和园区试点万兆光网

    工信部:正在全国86个城市168个小区、工厂和园区试点万兆光网工信部:正在全国86个城市168个小区、工厂和园区试点万兆光网工信部:正在全国86个城市168个小区、工厂和园区试点万兆光网工信部:正在全国86个城市168个小区、工厂和园区试点万兆光网

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 4月18日,国新办举行了新闻发布会,详细介绍了2025年第一季度工业和信息化发展情况。会上获悉,第一季度我国电信业务总量同比增长了7.7%,业务收入总计达到4469亿元。 今年以来,我国信息通信…

    2026年10月12日 • 用户投稿
    100
  • Java中JUnit的作用 解析测试框架

    Java中JUnit的作用 解析测试框架Java中JUnit的作用 解析测试框架Java中JUnit的作用 解析测试框架Java中JUnit的作用 解析测试框架

    junit在java中是一个核心的单元测试框架,它通过提供断言机制和注解支持,使开发者能够编写并运行自动化测试用例,从而确保代码行为符合预期,提升代码质量。例如,在加法函数测试中,@test 注解标记测试方法,assertequals 验证结果是否正确;若断言失败,则测试不通过。junit不仅适用于…

    2026年10月12日 • 用户投稿
    200
  • MySQL如何实现数据校验 约束与触发器验证方案对比

    MySQL如何实现数据校验 约束与触发器验证方案对比MySQL如何实现数据校验 约束与触发器验证方案对比MySQL如何实现数据校验 约束与触发器验证方案对比MySQL如何实现数据校验 约束与触发器验证方案对比

    %ignore_a_1%实现数据校验主要通过约束和触发器两种方式。1. 约束提供声明式校验,包括not null、unique、primary key、foreign key和check,适用于简单高效的数据校验场景;2. 触发器则通过事件自动执行sql代码,支持复杂逻辑判断和跨表校验,如插入前检查…

    2026年10月12日 • 用户投稿
    100
  • Codex CLI— OpenAI 开源的AI编程智能体

    Codex CLI— OpenAI 开源的AI编程智能体Codex CLI— OpenAI 开源的AI编程智能体Codex CLI— OpenAI 开源的AI编程智能体Codex CLI— OpenAI 开源的AI编程智能体

    Codex CLI 是什么 codex cli 是由 openai 推出的一款轻量级的 ai 编程助手。它利用自然语言指令帮助开发者高效地生成代码、执行文件操作以及进行版本控制。codex cli 支持代码生成、重构、测试、数据库迁移和文件批量操作等功能。该工具专为在终端工作的开发者设计,支持无需配…

    2026年10月12日 • 用户投稿
    100
  • 消息称英伟达暂停生产 H20 芯片,有望推更强的 B30A

    消息称英伟达暂停生产 H20 芯片,有望推更强的 B30A消息称英伟达暂停生产 H20 芯片,有望推更强的 B30A消息称英伟达暂停生产 H20 芯片,有望推更强的 B30A消息称英伟达暂停生产 H20 芯片,有望推更强的 B30A

    感谢网友 残月浅影、仅此、咩咩洋、刺客 的线索投递! 8 月 22 日消息,据 The Information 今日报道,英伟达已通知部分零部件供应商,暂停其专为中国市场打造的 H20 AI 芯片的生产计划。 报道指出,英伟达已要求位于美国亚利桑那州的 Amkor Technology 停止本周对 …

    2026年10月12日 • 用户投稿
    200
  • 全新智己L6正式上市 预售价21.99万元起 标配四轮转向

    全新智己L6正式上市 预售价21.99万元起 标配四轮转向全新智己L6正式上市 预售价21.99万元起 标配四轮转向全新智己L6正式上市 预售价21.99万元起 标配四轮转向全新智己L6正式上市 预售价21.99万元起 标配四轮转向

      4月18日晚,智己汽车正式发布了全新智己l6,并开启全国预售。此次推出的两款车型,预售权益价区间为21.99-28.99万元,预售价则为22.99-29.99万元,新车将于5月13日正式上市。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜…

    2026年10月12日 • 用户投稿
    300
  • Java中volatile关键字的作用与线程安全分析

    Java中volatile关键字的作用与线程安全分析Java中volatile关键字的作用与线程安全分析Java中volatile关键字的作用与线程安全分析Java中volatile关键字的作用与线程安全分析

    volatile关键字在java中主要用于保证变量的可见性和禁止指令重排序,但不能保证原子性。1.可见性:当一个线程修改了volatile变量的值,其他线程可以立即得知该新值,因为每次读取和写入都直接与主内存交互;2.禁止指令重排序:通过插入内存屏障防止jvm优化时改变指令顺序,从而避免多线程环境下…

    2026年10月12日 • 用户投稿
    100
  • MySQL中创建表时设置自增主键的规则

    在mysql中设置自增主键的方法是:在列定义中添加auto_increment属性。具体步骤包括:1. 创建表时,在需要自增的主键列上添加auto_increment属性,例如create table users (id int auto_increment, primary key (id));2…

    2026年10月12日
    200
  • 【营收】大华股份Q1实现营收62.56亿元,净利润同比增长16.45%

    【营收】大华股份Q1实现营收62.56亿元,净利润同比增长16.45%【营收】大华股份Q1实现营收62.56亿元,净利润同比增长16.45%【营收】大华股份Q1实现营收62.56亿元,净利润同比增长16.45%【营收】大华股份Q1实现营收62.56亿元,净利润同比增长16.45%

    大华股份第一季度实现营收62.56亿元,净利润同比增长16.45% ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 4月18日,大华股份公布了2025年第一季度的财务表现,报告显示,该季度营业收入达到6,256,129,778.73元,同比增…

    2026年10月12日 • 用户投稿
    200
  • 曝iPhone 16 Pro系列国内激活量破2500万 降价效果明显

    曝iPhone 16 Pro系列国内激活量破2500万 降价效果明显曝iPhone 16 Pro系列国内激活量破2500万 降价效果明显曝iPhone 16 Pro系列国内激活量破2500万 降价效果明显曝iPhone 16 Pro系列国内激活量破2500万 降价效果明显

    8月22日,知名数码博主“数码闲聊站”透露,苹果iphone 16 pro与iphone 16 pro max在中国市场的累计激活量已突破2500万台。数据显示,2025年第二季度,得益于苹果实施的降价策略,其在国内的销量同比增长超过250%。此次销量激增不仅吸引了大量首次购机的智能手机新用户,也成…

    2026年10月12日 • 用户投稿
    100
  • java中mapper什么意思 mapper在持久层的具体职责

    java中mapper什么意思 mapper在持久层的具体职责java中mapper什么意思 mapper在持久层的具体职责java中mapper什么意思 mapper在持久层的具体职责java中mapper什么意思 mapper在持久层的具体职责

    mapper在java中是一种用于数据转换和持久化的设计模式或接口。1)数据转换:将java对象映射到数据库表中,反之亦然。2)数据持久化:负责插入、更新和删除数据库中的数据。3)查询操作:定义和执行数据库查询,包括单表和多表关联查询。 在Java中,Mapper通常指的是一种设计模式或接口,用于将…

    2026年10月12日 • 用户投稿
    300
  • Java中如何模拟登录 掌握表单提交方法

    Java中如何模拟登录 掌握表单提交方法Java中如何模拟登录 掌握表单提交方法Java中如何模拟登录 掌握表单提交方法Java中如何模拟登录 掌握表单提交方法

    模拟登录的关键在于理解并模拟浏览器行为,包括表单提交和cookie处理。解决方案共分为六步:1. 分析登录流程:使用浏览器开发者工具观察登录请求,重点关注url、方法、headers和form data;2. 构造http请求:使用java的httpclient库(如apache httpclien…

    2026年10月12日 • 用户投稿
    000
  • Composer如何设置最低稳定性_依赖包版本稳定性的选择策略

    Composer如何设置最低稳定性_依赖包版本稳定性的选择策略Composer如何设置最低稳定性_依赖包版本稳定性的选择策略Composer如何设置最低稳定性_依赖包版本稳定性的选择策略Composer如何设置最低稳定性_依赖包版本稳定性的选择策略

    Composer通过minimum-stability设置依赖包的最低稳定性,默认为stable,可选值包括stable、RC、beta、alpha和dev,分别代表稳定、发布候选、测试版、早期测试和开发版。生产环境推荐使用stable以确保稳定性,而新项目或功能测试时可临时降低级别。为避免全局风险…

    2026年10月12日 • 用户投稿
    600
  • java中的protected怎么理解 protected保护的2种特殊用法

    java中的protected怎么理解 protected保护的2种特殊用法java中的protected怎么理解 protected保护的2种特殊用法java中的protected怎么理解 protected保护的2种特殊用法java中的protected怎么理解 protected保护的2种特殊用法

    protected关键字在java中允许同一包内类及所有子类访问成员。1.与default区别:同包访问效果相同,但继承时子类可访问父类protected成员,而default成员不可跨包访问。2.跨包访问限制:子类实例可通过自身访问父类protected成员,但不能通过父类实例访问。3.prote…

    2026年10月12日 • 用户投稿
    300
  • 定档8月25日!智界及问界秋季新品发布会正式官宣

    8月19日,%ignore_a_1%智行官方宣布智界及问界秋季新品发布会定档8月25日。据悉,本次发布会将推出问界m8纯电版、智界新s7以及新款智界r7三款重磅新车。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 问界M8纯电版 根据官方资…

    2026年10月12日
    000
  • Pulsar中间件入门学习

    Pulsar中间件入门学习Pulsar中间件入门学习Pulsar中间件入门学习Pulsar中间件入门学习

    pulsar 是一种高效的服务器到服务器消息系统,具有多租户和高性能等特点,最初由 yahoo 开发,现由 apache 软件基金会管理。它是 apache 的顶级项目,定位为下一代云原生分布式消息流平台,融合了消息传递、存储和轻量级函数计算功能,采用计算与存储分离的架构设计,支持多租户、持久化存储…

    2026年10月12日 • 用户投稿
    100
  • Java中Checkstyle的用法 详解规范检查

    Java中Checkstyle的用法 详解规范检查Java中Checkstyle的用法 详解规范检查Java中Checkstyle的用法 详解规范检查Java中Checkstyle的用法 详解规范检查

    checkstyle在java开发中通过预定义规则提升代码质量,是团队协作的润滑剂。它作为静态代码分析工具,扫描并报告违规情况,核心功能在于配置规则集以适应不同项目需求。在maven项目中集成checkstyle需在pom.xml中添加插件配置,指定配置文件路径、构建失败策略、控制台输出及违规级别,…

    2026年10月12日 • 用户投稿
    400

发表回复

登录后才能评论
关注微信