内部类 示例
package com.example.demo1;// 外部类
public class OuterClass {private int outerField = 10;private static int staticOuterField = 20;// 成员内部类public class MemberInnerClass {public void display() {// 成员内部类可以访问外部类的实例变量System.out.println("MemberInnerClass: outerField = " + outerField);System.out.println("MemberInnerClass: staticOuterField = " + staticOuterField);}}// 静态内部类public static class StaticInnerClass {public void display() {// 静态内部类只能访问外部类的静态变量System.out.println("StaticInnerClass: staticOuterField = " + staticOuterField);}}public void outerMethod() {int localVariable = 30;// 局部内部类class LocalInnerClass {public void display() {// 局部内部类可以访问外部类的实例变量和局部变量(局部变量需为 final 或事实上的 final)System.out.println("LocalInnerClass: outerField = " + outerField);System.out.println("LocalInnerClass: staticOuterField = " + staticOuterField);System.out.println("LocalInnerClass: localVariable = " + localVariable);}}LocalInnerClass localInner = new LocalInnerClass();localInner.display();// 匿名内部类Runnable anonymousInner = new Runnable() {@Overridepublic void run() {// 匿名内部类可以访问外部类的实例变量和局部变量(局部变量需为 final 或事实上的 final)System.out.println("AnonymousInnerClass: outerField = " + outerField);System.out.println("AnonymousInnerClass: staticOuterField = " + staticOuterField);System.out.println("AnonymousInnerClass: localVariable = " + localVariable);}};new Thread(anonymousInner).start();}public static void main(String[] args) {OuterClass outer = new OuterClass();// 创建成员内部类实例OuterClass.MemberInnerClass memberInner = outer.new MemberInnerClass();memberInner.display();// 创建静态内部类实例OuterClass.StaticInnerClass staticInner = new OuterClass.StaticInnerClass();staticInner.display();// 调用包含局部内部类和匿名内部类的方法outer.outerMethod();}
}
成员内部类(MemberInnerClass
):定义在外部类内部,无 static
修饰。它能访问外部类的实例变量和静态变量,创建成员内部类实例时,需要依赖外部类实例。
静态内部类(StaticInnerClass
):定义在外部类内部,用 static
修饰。它只能访问外部类的静态变量,创建静态内部类实例时,不依赖外部类实例。
局部内部类(LocalInnerClass
):定义在方法内部。它可以访问外部类的实例变量和方法内的局部变量,但局部变量必须是 final
或事实上的 final
。
匿名内部类:没有类名的局部内部类,通常用于实现接口或继承抽象类。在上述示例中,实现了 Runnable
接口。