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 种方法:
- 我们可以通过
new 外部类().new 内部类()
的方式获取内部类的实例对象: