目录
在Java中,内部类是定义在其他类内部的类。内部类有以下几种形式:成员内部类、静态内部类、局部内部类和匿名内部类。
1. 成员内部类
概念
成员内部类是定义在外部类的成员位置上的类。它与外部类之间具有一种特殊的关系,即成员内部类可以访问外部类的成员,包括私有成员。
实现原理
在Java编译器编译成字节码时,对于成员内部类的实现原理如下:
内部类是一个独立的类文件,它的类名为"外部类$内部类"。
内部类的字节码文件中包含一个指向外部类的引用,以便访问外部类的成员。
在外部类的实例化过程中,会创建内部类的实例,并将外部类的引用传递给内部类,以建立它们之间的关联关系。
public class OuterClass {
private int outerData = 10;
public void outerMethod() {
InnerClass inner = new InnerClass();
inner.innerMethod();
}
// 成员内部类
class InnerClass {
private int innerData = 20;
public void innerMethod() {
System.out.println("外部类的数据:" + outerData);
System.out.println("内部类的数据:" + innerData);
}
}
public static class Main {
public static void main(String[] args) {
OuterClass outer = new OuterClass();
outer.outerMethod();
}
}
}
2. 静态内部类
概念
静态内部类是定义在外部类中的静态类。它与外部类之间没有特殊的关系,可以看作是独立的类。静态内部类可以访问外部类的静态成员,但不能直接访问外部类的非静态成员。
实现原理
静态内部类的实现原理与成员内部类相比较简单:
静态内部类是一个独立的类文件,它的类名为"外部类$内部类"。
静态内部类中不包含对外部类的引用,因此可以直接访问外部类的静态成员。
public class OuterClass {
private static int outerData = 10;
private int nonStaticData = 20;
public void outerMethod() {
StaticInnerClass inner = new StaticInnerClass();
inner.innerMethod();
}
// 静态内部类
static class StaticInnerClass {
private int innerData = 30;
public void innerMethod() {
System.out.println("外部类的静态数据:" + outerData);
// System.out.println("外部类的非静态数据:" + nonStaticData); // 错误,无法直接访问外部类的非静态成员
System.out.println("内部类的数据:" + innerData);
}
}
}
class Main {
public static void main(String[] args) {
OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();
inner.innerMethod();
}
}
3. 局部内部类
概念
局部内部类是定义在方法或代码块内部的类。它的作用域仅限于所在的方法或代码块内部,外部无法访问局部内部类。
实现原理
局部内部类的实现原理与成员内部类和静态内部类有所不同:
局部内部类的字节码文件名由编译器生成,类似于"外部类$数字"的形式。
局部内部类的字节码文件中不包含对外部类的引用。
在外部类的实例化过程中,如果局部内部类没有被使用,则不会创建局部内部类的实例。
OuterClass {
private int outerData = 10;
public void outerMethod() {
class LocalInnerClass {
private int innerData = 20;
public void innerMethod() {
System.out.println("外部类的数据:" + outerData);
System.out.println("内部类的数据:" + innerData);
}
}
LocalInnerClass inner = new LocalInnerClass();
inner.innerMethod();
}
}
class Main {
public static void main(String[] args) {
OuterClass outer = new OuterClass();
outer.outerMethod();
}
}
4. 匿名内部类
概念
匿名内部类是一种没有名字的内部类,它没有定义在独立的类文件中,而是直接定义在方法或代码块中。匿名内部类通常用于创建一个只需要使用一次的类的实例。
实现原理
匿名内部类的实现原理是通过创建一个继承了某个类或实现了某个接口的子类来实现的。在编译时,编译器会自动生成一个类文件,并创建该类的实例。
public class OuterClass {
public void outerMethod() {
// 匿名内部类实现接口
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类执行");
}
};
Thread thread = new Thread(runnable);
thread.start();
}
}
class Main {
public static void main(String[] args) {
OuterClass outer = new OuterClass();
outer.outerMethod();
}
}