内部类是Java中一种定义在另一个类内部的类。它允许在一个类的内部定义另一个类,从而将类的逻辑组织得更加紧密和模块化。支持四种类型的内部类,它们分别是:
- 成员内部类(Member Inner Class):成员内部类是定义在另一个类的内部,并且与外部类的实例关联。成员内部类可以访问外部类的成员变量和方法,包括私有成员。成员内部类的实例必须依赖于外部类的实例。例如:
public class OuterClass {
private int outerVar;
public class InnerClass {
public void innerMethod() {
// 可以访问外部类的成员变量
outerVar = 10;
}
}
}
- 静态内部类(Static Nested Class):静态内部类是定义在另一个类内部的静态类,它与外部类实例无关。静态内部类可以访问外部类的静态成员,但不能访问非静态的外部类成员。它通常用于将相关的类组织在一起,而不需要外部类的实例。例如:
public class OuterClass {
private static int staticVar;
public static class StaticInnerClass {
public void innerMethod() {
// 可以访问外部类的静态成员
staticVar = 10;
}
}
}
- 局部内部类(Local Inner Class):局部内部类是定义在方法或代码块内部的类,它的作用范围限定在所在的方法或代码块内部。局部内部类通常用于解决某个特定方法或代码块的问题。例如:
public class OuterClass {
public void outerMethod() {
class LocalInnerClass {
public void innerMethod() {
// 可以访问外部方法的局部变量
int localVar = 10;
}
}
}
}
- 匿名内部类(Anonymous Inner Class):匿名内部类是一种没有类名的内部类,通常用于创建接口实现或抽象类的子类的对象。它通常在创建对象的地方定义,并且可以覆盖接口方法或抽象类的方法。例如:
Runnable runnable = new Runnable() {
@Override
public void run() {
// 匿名内部类的实现
}
};
内部类的主要作用包括:
-
封装:内部类可以将相关的类组织在一起,从而提高代码的封装性和可维护性。
-
访问外部类的成员:成员内部类可以访问外部类的私有成员,这有助于实现更严格的封装。
-
实现多重继承:通过内部类,一个类可以实现多个接口,从而实现多重继承的效果。
-
回调函数:匿名内部类常用于创建回调函数,例如在事件处理中。