在Java中,内部类(Inner Class)是定义在另一个类(外部类)内部的类。内部类可以访问外部类的成员(包括私有成员),而外部类也可以访问内部类的成员。内部类可以分为四种类型:
- 非静态内部类(Non-static Inner Class):这是最常见的内部类类型。非静态内部类与外部类的实例关联,因此需要先创建外部类的实例才能创建内部类的实例。非静态内部类可以访问外部类的所有成员(包括私有成员)。
public class OuterClass { private int outerVar; public class InnerClass { public void accessOuterMembers() { System.out.println("Accessing outer class variable: " + outerVar); } } }
- 静态内部类(Static Inner Class):静态内部类与外部类的实例无关,因此不需要创建外部类的实例就可以创建内部类的实例。静态内部类只能访问外部类的静态成员。
public class OuterClass { private static int outerVar; public static class InnerClass { public void accessOuterMembers() { System.out.println("Accessing outer class static variable: " + outerVar); } } }
- 局部内部类(Local Inner Class):局部内部类是在方法内部或者代码块内部定义的类。局部内部类只能在定义它的方法或代码块内部使用。局部内部类可以访问定义它的方法或代码块中的局部变量(如果这些变量被声明为
final
或者是实际上的final
变量)。
public class OuterClass { public void createLocalInnerClass() { final int localVar = 10; class LocalInnerClass { public void accessLocalVar() { System.out.println("Accessing local variable: " + localVar); } } LocalInnerClass localInner = new LocalInnerClass(); localInner.accessLocalVar(); } }
- 匿名内部类(Anonymous Inner Class):匿名内部类是没有名字的内部类,通常用于实现接口或继承类的子类。匿名内部类可以访问定义它的方法或代码块中的局部变量(同样需要声明为
final
或实际上的final
变量)。
public class OuterClass { public void createAnonymousInnerClass() { Runnable runnable = new Runnable() { @Override public void run() { System.out.println("Anonymous inner class running."); } }; new Thread(runnable).start(); } }
总之,Java中的内部类提供了一种在类内部定义和使用其他类的方式,可以更好地组织和封装代码。