成员内部类是最常见的内部类,它定义在外部类的内部,并且与外部类的实例相关联。成员内部类可以访问外部类的成员(包括私有成员),反之亦然。
示例:
class OuterClass {
private String outerField = "Outer Field";
class InnerClass {
void display() {
System.out.println("Outer field: " + outerField);
}
}
void createInnerInstance() {
InnerClass inner = new InnerClass();
inner.display();
}
}
public class Main {
public static void main(String[] args) {
OuterClass outer = new OuterClass();
outer.createInnerInstance();
}
}
在这个示例中,InnerClass
是 OuterClass
的成员内部类。InnerClass
可以访问 OuterClass
的私有字段 outerField
。
静态内部类使用 static
关键字修饰,它与外部类的实例无关。静态内部类不能直接访问外部类的非静态成员,但可以通过创建外部类的实例来访问。
示例:
class OuterClass {
private static String staticOuterField = "Static Outer Field";
static class StaticInnerClass {
void display() {
System.out.println("Static outer field: " + staticOuterField);
}
}
}
public class Main {
public static void main(String[] args) {
OuterClass.StaticInnerClass staticInner = new OuterClass.StaticInnerClass();
staticInner.display();
}
}
在这个示例中,StaticInnerClass
是 OuterClass
的静态内部类,它可以直接访问 OuterClass
的静态成员 staticOuterField
。
局部内部类定义在一个方法或代码块内部,只在该方法或代码块内有效。它通常用于封装仅在该方法内使用的辅助逻辑。
示例:
class OuterClass {
void outerMethod() {
class LocalInnerClass {
void display() {
System.out.println("This is a local inner class.");
}
}
LocalInnerClass localInner = new LocalInnerClass();
localInner.display();
}
}
public class Main {
public static void main(String[] args) {
OuterClass outer = new OuterClass();
outer.outerMethod();
}
}
在这个示例中,LocalInnerClass
是定义在 outerMethod
方法中的局部内部类,它只能在该方法内部使用。
匿名内部类是一种特殊的内部类,它没有类名,通常用于实现接口或继承类的瞬时实现。匿名内部类在使用时直接定义并创建实例,常用于简化代码。
示例:
interface Greeting {
void sayHello();
}
public class Main {
public static void main(String[] args) {
Greeting greeting = new Greeting() {
@Override
public void sayHello() {
System.out.println("Hello from an anonymous inner class!");
}
};
greeting.sayHello();
}
}
在这个示例中,匿名内部类实现了 Greeting
接口,并重写了 sayHello
方法。这种方式简化了代码的编写,特别是在需要快速实现接口或类的情况下。
封装性增强:内部类可以访问外部类的私有成员,允许更紧密地封装类的逻辑。
代码组织:将相关的类放在一起,使代码更具可读性和组织性,避免在包级别创建不必要的类。
简化代码:匿名内部类简化了实现接口或继承类的代码,尤其是在回调或事件处理等场景中非常常见。
避免命名冲突:内部类的名字只在外部类的范围内有效,避免了与其他类的命名冲突。
Java 内部类通过将类的定义嵌套在另一个类中,使得相关类之间的关系更为紧密。不同类型的内部类(成员内部类、静态内部类、局部内部类和匿名内部类)在不同场景下提供了灵活性和简化代码的能力,增强了代码的封装性和可维护性。