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

JavaSE从0到1-DAY7-内部类(i)

Java 内部类学习笔记(i)

一、为什么会有内部类?

核心作用

内部类是写在外部类里面的类,它的主要作用是:

  • 逻辑封装:把只属于外部类的辅助功能封装起来,不暴露给外界
  • 访问权限:内部类可以访问外部类的私有成员,实现更细粒度的控制

生活比喻

想象一辆汽车(外部类 Car):

  • 汽车的品牌、颜色是公开的属性
  • 汽车的发动机(内部类 Engine)是内部的,用户不需要直接接触
  • 发动机有自己的属性(型号、功率),但只有汽车内部才能使用它
publicclassCar{StringcarName;// 外部类属性classEngine{// 内部类 - 只属于 CarStringengineName;intengineAge;}}

二、内部类的分类

分类定义位置特点
成员内部类写在成员位置(类体内)需要外部类实例才能创建
静态内部类写在成员位置 + static修饰不需要外部类实例
局部内部类写在方法内部作用域仅限该方法
匿名内部类没有类名,直接创建对象通常用于接口实现

三、成员内部类详解

3.1 什么是成员内部类?

写在成员位置的内部类,属于外部类的成员。

publicclassCar{StringcarName;classEngine{// 成员内部类StringengineName;}}

3.2 成员内部类的访问权限(重难点)

内部类能访问外部类的私有成员吗?

答案:能!

publicclassCar{privateStringcarSecret="这是秘密";// 私有属性classEngine{voidshowSecret(){System.out.println(carSecret);// ✅ 可以访问!}}}

为什么?因为内部类和外部类是亲密关系,编译后会生成两个.class文件,它们在同一个包里,内部类有特殊权限访问外部类的私有成员。

外部类能访问内部类的私有成员吗?

答案:不能!

publicclassCar{classEngine{privateStringengineSecret="发动机秘密";}voidtest(){Engineengine=newEngine();System.out.println(engine.engineSecret);// ❌ 编译错误!}}

为什么?因为内部类的私有成员就是私有的,外部类也要尊重这个访问权限。


四、成员内部类的实例化

4.1 为什么成员内部类需要外部类实例?

生活比喻

  • 发动机(内部类)必须装在某一辆具体的汽车(外部类实例)上才有意义
  • 你不能说"我要一个发动机",必须说"我要这辆红色汽车的发动机"

4.2 两种创建方式

方式一:在外部类内部创建(推荐)
publicclassCar{classEngine{voidstart(){System.out.println("发动机启动");}}voidcreateEngine(){Engineengine=newEngine();// ✅ 直接创建engine.start();}}
方式二:在外部类外部创建
Carcar=newCar();Car.Engineengine=car.newEngine();// ✅ 必须通过外部类实例engine.start();

关键点car.new Engine()表示"通过 car 这个实例来创建 Engine"


五、静态内部类详解(重难点)

5.1 什么是静态内部类?

static修饰的内部类。

publicclassCar{staticclassEngine{// 静态内部类StringengineName;}}

5.2 静态内部类 vs 成员内部类的本质区别

特性成员内部类静态内部类
是否依赖外部类实例✅ 依赖❌ 不依赖
能否访问外部类的非静态成员✅ 能❌ 不能
能否访问外部类的静态成员✅ 能✅ 能
创建方式outer.new Inner()new Outer.Inner()

5.3 生活比喻理解

成员内部类

  • 就像汽车的发动机,必须装在某一辆具体的汽车上
  • 发动机可以访问这辆车的所有信息(包括私有的)

静态内部类

  • 就像汽车的设计图纸,不属于某一辆具体的汽车
  • 设计图纸是通用的,不需要依附于某辆车
  • 设计图纸只能看汽车的通用规格(静态信息),看不到某辆车的具体颜色

5.4 代码对比

publicclassCar{StringcarColor="红色";// 非静态成员staticStringcarBrand="宝马";// 静态成员// 成员内部类classEngine{voidtest(){System.out.println(carColor);// ✅ 能访问System.out.println(carBrand);// ✅ 能访问}}// 静态内部类staticclassWheel{voidtest(){// System.out.println(carColor); // ❌ 不能访问!System.out.println(carBrand);// ✅ 能访问}}}

5.5 创建方式对比

// 成员内部类 - 需要外部类实例Carcar=newCar();Car.Engineengine=car.newEngine();// 静态内部类 - 不需要外部类实例Car.Wheelwheel=newCar.Wheel();// 就像访问静态方法一样

六、内部类访问外部类成员的方式

当外部类和内部类有同名变量时

publicclassCar{Stringname="汽车";classEngine{Stringname="发动机";voidtest(){System.out.println(name);// "发动机" - 内部类的System.out.println(this.name);// "发动机" - 内部类的System.out.println(Car.this.name);// "汽车" - 外部类的}}}

记住Outer.this.变量名用来明确指向外部类的成员


七、内部类的分类总结表

内部类 ├── 成员内部类(需要外部类实例) │ └── 可以访问外部类的所有成员 ├── 静态内部类(不需要外部类实例) │ └── 只能访问外部类的静态成员 ├── 局部内部类(定义在方法内) │ └── 作用域仅限该方法 └── 匿名内部类(没有类名) └── 通常用于接口实现
http://www.jsqmd.com/news/576659/

相关文章:

  • B03 SpringMVC拦截器
  • 效率倍增:基于快马AI生成web版批量服务器管理工具,告别重复终端操作
  • 怎样轻松下载网页视频:3个实用技巧与猫抓浏览器扩展指南
  • VMware虚拟机Ubuntu 22.04与Windows共享剪贴板终极指南(附中文输入法切换技巧)
  • Linux内核核心机制与开发实践详解
  • vLLM生产环境调优指南:如何用AWQ量化让Qwen-32B在RTX4090上流畅运行?
  • Win11Debloat系统优化工具:解决Windows性能瓶颈的开源方案
  • 自然语言理解在AI原生应用领域的关键作用
  • 3种Windows Defender深度移除方案:技术用户的系统性能优化指南
  • 3步解锁B站4K视频:面向内容收藏者的bilibili-downloader工具指南
  • 大数据实施的四个示例以及在商业中的作用
  • OpenClaw成本优化方案:Qwen3.5-9B-AWQ-4bit自部署省下80%Token
  • 对俄跨境电商AI工具二选一?Captain AI与RusReview AI功能优劣分析
  • Zabbix实战:从零构建企业级监控告警体系(主机、应用集、监控项、触发器与动作)
  • Linux C 条件变量阻塞线程用法:等待时CPU占用率为0
  • IDM注册表权限控制技术深度解析:突破30天试用期的终极方案
  • mT5分类增强版中文-base效果惊艳:同一输入生成‘正式/口语/幽默’三风格文本示例
  • 【Geek卸载工具】Geek Uninstaller官网下载 | Geek Uninstaller专业软件卸载清理工具 - xiema
  • ngx_hash_key_lc
  • GBase 8c 表结构变更前的对象依赖排查
  • HomeAssistant——二元传感器值模板
  • 从末九到华五:一位网安学子的保研实战复盘与避坑指南
  • GBase 8c 同一事务两次查询结果不一致的排查
  • 电子文档怎么转PDF?电子文档转PDF超简单!5个方法零门槛,小白也能秒会
  • 智能关注管理:B站账号自动化清理方案
  • 西门子828D/840Dsl数控系统数据采集实战:端口配置与防火墙优化指南
  • OpCore-Simplify:5步完成黑苹果自动化配置,零代码EFI生成终极指南
  • 2026年4月全球显微镜品牌厂家推荐:TOP5口碑产品评测对比知名 - 品牌推荐
  • HS2-HF_Patch深度解析:游戏模组生态系统的技术架构与实现原理
  • 如何快速掌握Subtitle Edit:新手也能上手的完整实战指南