跳到主要内容

Java 内部类

本节我们将介绍 Java 中的内部类。通过本节的学习,我们将了解到什么是内部类,内部类的分类作用。在内部类的分类部分,我们将逐一学习各个类型的内部类如何定义,如何实例化以及各自的特点,要注意区分不同类型内部类的异同。有了这些基础知识之后,我们也会结合示例介绍为什么需要内部类

1. 概念

在 Java 语言中,可以将一个类定义在另一个类里面或者一个方法里面,我们把这样的类称为内部类。

与之对应的,包含内部类的类被称为外部类。请阅读下面的代码:

// 外部类 Car
public class Car {
// 内部类 Engine
class Engine {
private String innerName = "发动机内部类";
}
}

代码中,Engine 就是内部类,而 Car 就是外部类。

2. 分类

Java 中的内部类可以分为 4 种:成员内部类、静态内部类、方法内部类和匿名内部类。接下来我们按照分类一一介绍。

2.1 成员内部类

2.1.1 定义

成员内部类也称为普通内部类,它是最常见的内部类。可以将其看作外部类的一个成员。在成员内部类中无法声明静态成员。

如下代码中声明了一个成员内部类:

// 外部类 Car
public class Car {
// 内部类 Engine
private class Engine {
private void run() {
System.out.println("发动机启动了!");
}
}
}

我们在外部类 Car 的内部定义了一个成员内部类 Engine,在 Engine 下面有一个 run() 方法,其功能是打印输出一行字符串:“发动机启动了!”。

另外,需要注意的是,与普通的 Java 类不同,含有内部类的类被编译器编译后,会生成两个独立的字节码文件:

Car$Engine.class
Car.class

内部类 Engine 会另外生成一个字节码文件,其文件名为:外部类类名 $ 内部类类名.class

2.1.2 实例化

内部类在外部使用时,无法直接实例化,需要借助外部类才能完成实例化操作。关于成员内部类的实例化,有 3 种方法:

  1. 我们可以通过 new 外部类().new 内部类() 的方式获取内部类的实例对象: