Java 的 内部类
定义
一个类的内部又完整的嵌套了另一个类结构, 被嵌套的类称为内部类(inner class), 嵌套其他类的类被称为外部类(outer class), 是
类的第五大成员
属性, 方法, 构造器, 代码块, 内部类
可以体现类与类之间的包含关系, 内部类的最大的特点就是可以直接访问私有的属性
基本语法
class Outer {
private int n1 = 100; // 属性
public Outer(int n1) {
this.n1 = n1;
}
public void m1() {
System.out.println("m1()方法");
}
{
System.out.println("代码块");
}
class Inner {
// 内部类
}
}
四大分类
局部内部类
定义在外部类局部位置上, 有类名
示例
class Outer {
private int n1 = 100;
private void m2() {}
public void m1() {
class Inner {
public void f1() {
System.out.println("n1= " + n1);
m2();
}
}
class Inner01 extends Inner {
}
Inner inner = new Inner();
inner.f1();
}
}
特点
- 可以直接访问外部类所有的成员, 包括私有的
- 不能添加访问修饰符, 但是可以使用
final
修饰 - 作用域是定义它的方法或者代码块中
- 局部内部类 --(直接访问)--> 访问外部类
外部类 --(通过创建对象)--> 访问局部内部类 - 外部其他类无法访问局部内部类
- 如果外部类和局部内部类成员重名时遵循就近原则, 如果要访问外部类成员, 可以使用
外部类名.this.成员
匿名内部类※
定义在外部类局部位置上, 没有类名
如果某些类只使用一次, 那么可以使用匿名内部类简化
示例1: 基于接口
interface IA {
public void cry();
}
class Outer {
private int n1 = 100;
public void method() {
// 基于接口的匿名内部类
IA BBB = new IA() {
@Override
public void cry() {
System.out.println("BBB cry()");
}
};
BBB.cry();
}
}
特点
BBB
编译类型是IA
, 运行类型是匿名内部类XXX- Jdk底层在创建匿名内部类之后, 会立马创建一个对象, 然后返回其地址
- 匿名内部类使用一次后就不能再使用
示例2: 基于类
class Outer {
private int n1 = 100;
public void method() {
// 基于接口的匿名内部类
Father father = new Father("jack") {
@Override
public void test() {
System.out.println("重写test方法");
}
};
father.test();
}
}
特点
- 这个时候其实有了一个匿名内部类继承 了
Father
- 这个时候我们就可以对其方法进行重写, 或者进行一些继承的操作
- 可以访问外部类的所有成员
- 地位和作用域相当于匿名变量
- 如果外部类和局部内部类成员重名时遵循就近原则, 如果要访问外部类成员, 可以使用
外部类名.this.成员
成员内部类
定义在外部类成员位置上, 没有
static
修饰
示例
class Outer {
private int n1 = 100;
class Inner {
public void say() {
System.out.println(n1);
}
}
public void method() {
Inner inner = new Inner();
inner.say();
}
}
特点
- 可以直接访问外部类的所有成员, 包括私有的
- 可以添加访问修饰符
- 外部其他类使用成员内部类的两种方式
Outer.Inner inner = Outer.new Inner()
, 也就是通过他的外部类访问内部类, 因为
这个类是他的成员- 可以在该外部类写一个返回内部类对象的一个方法
静态内部类
定义在外部类成员位置上, 有
static
修饰
示例
class Outer {
private int n1 = 100;
static class Inner {
public void say() { }
}
}
特点
- 可以直接访问外部类的所有静态成员, 但是不能访问非静态成员
- 可以添加任意访问修饰符
- 作用域为整个类体
- 外部其他类使用静态内部类的方法
Outer.Inner inner = new Outer.Inner()
, 因为是静态的, 所以可以直接访问- 编写一个方法, 用来返回静态内部类的对象实例, 这里可以使用静态方法来返回
- 成员重名时, 遵循就近原则, 如果想访问外部类成员, 可以使用
外部类名.成员
去访问
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)