Java 中的内部类(Inner Class)是定义在另一个类内部的类。内部类主要用于逻辑上将两个类联系在一起,使得代码更加紧凑和有组织。内部类可以访问其外部类的成员变量和方法,即使这些成员是私有的。
内部类的分类
Java 的内部类主要分为以下几种:
- 成员内部类(Member Inner Class)
- 局部内部类(Local Inner Class)
- 匿名内部类(Anonymous Inner Class)
- 静态内部类(Static Nested Class)
1. 成员内部类
成员内部类是定义在另一个类内部且没有使用 static
修饰符的类。成员内部类可以访问其外部类的所有成员,包括私有成员。
示例:
class OuterClass {private String outerField = "Outer field";class InnerClass {void display() {System.out.println("Accessing: " + outerField);}}void createInner() {InnerClass inner = new InnerClass();inner.display();}
}public class Main {public static void main(String[] args) {OuterClass outer = new OuterClass();outer.createInner();// 也可以直接创建内部类实例OuterClass.InnerClass inner = outer.new InnerClass();inner.display();}
}
2. 局部内部类
局部内部类是定义在方法或作用域内部的类。局部内部类只能在其定义的方法内部使用。
示例:
class OuterClass {void methodWithInner() {class LocalInnerClass {void display() {System.out.println("Local Inner Class");}}LocalInnerClass localInner = new LocalInnerClass();localInner.display();}
}public class Main {public static void main(String[] args) {OuterClass outer = new OuterClass();outer.methodWithInner();}
}
3. 匿名内部类
匿名内部类是没有名字的内部类,通常用来简化代码实现,可以直接在实例化时定义。匿名内部类主要用于简化接口或抽象类的实现。
示例:
interface Greeting {void sayHello();
}public class Main {public static void main(String[] args) {Greeting greeting = new Greeting() {@Overridepublic void sayHello() {System.out.println("Hello from Anonymous Inner Class");}};greeting.sayHello();}
}
4. 静态内部类
静态内部类使用 static
修饰符修饰,可以独立于其外部类存在。静态内部类不能直接访问外部类的非静态成员。
示例:
class OuterClass {private static String staticOuterField = "Static Outer Field";static class StaticInnerClass {void display() {System.out.println("Accessing: " + staticOuterField);}}
}public class Main {public static void main(String[] args) {OuterClass.StaticInnerClass staticInner = new OuterClass.StaticInnerClass();staticInner.display();}
}
总结
- 成员内部类:定义在另一个类内,可以访问外部类的所有成员。
- 局部内部类:定义在方法或作用域内,只能在该方法内使用。
- 匿名内部类:没有名字的类,通常用于实现接口或抽象类的实例。
- 静态内部类:使用
static
修饰的内部类,不能直接访问外部类的非静态成员。
每种内部类都有其适用的场景和优点,根据具体需求选择合适的内部类类型可以提高代码的可读性和组织性。