可以给我一个🆓的大拇哥吗?👍😚可以关注我,后续持续更新中……
(一起进步吧,你不是一个人。)
四种内部类对比
对比项 | 非静态内部类(成员内部类) | 静态内部类 | 局部内部类 | 匿名内部类 |
---|---|---|---|---|
是否需要外部类实例 | 是 | 否 | 是 | 是 |
是否可以访问外部类的 private 变量 | 可以 | 只能访问外部类的 static 变量 | 可以 | 可以 |
是否可以有 static 方法 | 不能 | 可以 | 不能 | 不能 |
是否可以有 static 变量 | 不能 | 可以 | 不能 | 不能 |
作用范围 | 外部类的成员,适用于多个方法 | 独立于外部类的实例,适用于工具类 | 仅在定义它的方法内有效 | 仅在创建它的地方使用 |
是否可以被继承 | 可以 | 可以 | 不可以 | 不可以 |
创建方式 | Outer.Inner inner = outer.new Inner(); | Outer.Inner inner = new Outer.Inner(); | 在方法中 new Inner(); | 直接 new 接口/抽象类() {} |
适用场景 | 需要访问外部类的 private 变量,逻辑紧密 | 工具类、构建者模式 | 仅在方法内临时使用 | 适用于简化代码,如线程、事件监听 |
1. 非静态内部类(成员内部类)
非 static
的内部类,必须依赖外部类的实例,不能独立存在。它可以访问外部类的所有变量,包括 private
变量。
2. 静态内部类
使用 static
修饰的内部类,可以独立存在,不依赖外部类实例。它只能访问外部类的静态变量,不能访问实例变量。
3. 局部内部类
局部内部类定义在方法内部,它的作用范围仅限于该方法。它不能使用 static
修饰,因为它属于外部类的实例。
4. 匿名内部类
没有类名的内部类,通常用于接口、抽象类的实现,并在创建时立即实例化。
总结
类型 | 是否依赖外部类实例 | 访问外部类变量 | 是否可包含 static 成员 | 使用场景 |
---|---|---|---|---|
非静态内部类 | 需要 | 可以访问所有变量 | 不能 | 适用于访问外部类实例变量,增强封装性 |
静态内部类 | 不需要 | 只能访问 static 变量 | 可以 | 适用于工具类、构建者模式 |
局部内部类 | 需要 | 可以访问外部类和方法内 final 变量 | 不能 | 适用于方法内部的临时逻辑 |
匿名内部类 | 需要 | 可以访问外部类变量 | 不能 | 适用于简化代码,常用于事件监听 |
选择内部类类型时:
- 如果需要访问外部类实例变量,选择非静态内部类。
- 如果类不依赖外部类实例,选择静态内部类。
- 如果类只用于方法内,可以使用局部内部类。
- 如果类只使用一次,可以使用匿名内部类。