1. 内部类定义
内部类是定义在另一个类内部的类。它的作用主要包括:
- 封装和逻辑分组:提供更清晰的代码组织结构。
- 提升封装性:将逻辑相关的类组织在一起。
通过内部类,可以把逻辑上相关的类组织在一起,提升封装性和代码的可读性。后期维护时都在一个类里面,不需要在各地方找来找去。
2. 内部类分类
按位置分:
- 在成员变量的位置定义,则是成员内部类,
- 在方法内定义,则是局部内部类
- 如果用 static 修饰则为静态内部类
- 最后还有匿名内部类。
2.1 成员内部类
- 定义在另一个类中。
- 可以访问外部类的所有成员变量和方法,包括私有的 (
private
)。
public class OuterClass {
private String outerField = "Outer Field";
class InnerClass {
void display() {
System.out.println("Outer Field: " + outerField);
}
}
public void createInner() {
InnerClass inner = new InnerClass();
inner.display();
}
}
2.2 静态内部类
- 只能访问外部类的静态成员变量和方法。
- 可以独立于外部类使用,类似于顶级类。
public class OuterClass {
private static String staticOuterField = "Static Outer Field";
static class StaticInnerClass {
void display() {
System.out.println("Static Outer Field: " + staticOuterField);
}
}
public static void createStaticInner() {
StaticInnerClass staticInner = new StaticInnerClass();
staticInner.display();
}
}
2.3 局部内部类
- 在方法中定义,只在该方法内可见。
- 可以访问外部类的成员以及方法中的局部变量(需要声明为
final
或 effectively final)。
public class OuterClass {
void outerMethod() {
final String localVar = "Local Variable";
class LocalInnerClass {
void display() {
System.out.println("Local Variable: " + localVar);
}
}
LocalInnerClass localInner = new LocalInnerClass();
localInner.display();
}
}
2.4 匿名内部类
- 没有类名的内部类。
- 用于简化实现接口和继承类的代码,通常用于回调逻辑定义场景。
public class OuterClass {
interface Greeting {
void greet();
}
public void sayHello() {
Greeting greeting = new Greeting() {
@Override
public void greet() {
System.out.println("Hello, World!");
}
};
greeting.greet();
}
}
3. 编译与运行时行为
- 内部类是编译层面的概念,类似于语法糖。
- 编译后,内部类会提升为外部顶级类,与外部类没有区别。
- 在JVM中没有内部类的概念。
4. 总结
内部类提供了一种将相关类组织在一起的方式,有助于代码的封装和可读性。不同类型的内部类适用于不同的使用场景,如成员内部类适用于需要访问外部类私有成员的情况,而匿名内部类适用于简化单次使用的类实现。