Java 内部类详解
在 Java 中,内部类是指在一个类的内部定义的另一个类。内部类可以访问外部类的成员变量和方法,同时也可以实现对外部类的封装。本文将详细介绍 Java 内部类的概念、分类和使用方法。
内部类的分类
Java 内部类可以分为四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。
- 成员内部类:成员内部类是定义在一个类的内部的普通类,它可以访问外部类的成员变量和方法,并且可以被外部类的方法调用。成员内部类可以使用 public、protected、private 和 default 访问修饰符进行修饰。
示例代码:
public class OuterClass {
private int outerVariable;
public void outerMethod() {
InnerClass inner = new InnerClass();
inner.innerMethod();
}
public class InnerClass {
private int innerVariable;
public void innerMethod() {
outerVariable = 10;
System.out.println("Inner method called");
}
}
}
- 局部内部类:局部内部类是定义在一个方法或代码块内的类,它只能在该方法或代码块内部使用。局部内部类可以访问外部类的成员变量和方法,并且可以使用 final 修饰的局部变量。
示例代码:
public class OuterClass {
private int outerVariable;
public void outerMethod() {
int localVariable = 10;
class InnerClass {
public void innerMethod() {
outerVariable = 10;
System.out.println("Inner method called");
System.out.println("Local variable: " + localVariable);
}
}
InnerClass inner = new InnerClass();
inner.innerMethod();
}
}
- 匿名内部类:匿名内部类没有类名,它通常是在创建一个接口或抽象类的实例时使用。匿名内部类不能使用访问修饰符和 static 修饰符。匿名内部类可以访问外部类的成员变量和方法,并且可以使用 final 修饰的局部变量。
示例代码:
public class OuterClass {
private int outerVariable;
public void outerMethod() {
Interface inner = new Interface() {
@Override
public void method() {
outerVariable = 10;
System.out.println("Anonymous inner class method called");
}
};
inner.method();
}
public interface Interface {
void method();
}
}
- 静态内部类:静态内部类是定义在一个类的内部的静态类,它不依赖于外部类的实例。静态内部类只能访问外部类的静态成员变量和方法,不能访问非静态成员变量和方法。静态内部类可以使用 public、protected、private 和 default 访问修饰符进行修饰。
示例代码:
public class OuterClass {
private static int outerVariable;
public static void outerMethod() {
InnerClass inner = new InnerClass();
inner.innerMethod();
}
public static class InnerClass {
private int innerVariable;
public void innerMethod() {
outerVariable = 10;
System.out.println("Inner method called");
}
}
}
内部类的使用方法
通过内部类,我们可以更好地组织和管理代码。内部类可以访问外部类的私有成员,并且可以实现对外部类的封装。
下面是一个使用内部类的实例,模拟一个任务管理系统:
public class TaskManager {
private List<Task> tasks = new ArrayList<>();
public void addTask(String name, String description) {
Task task = new Task(name, description);
tasks.add(task);
}
public void printTasks() {
for (Task task : tasks) {
System.out.println("Task name: " + task.getName());
System.out.println("Task description: " + task.getDescription());
}
}
private class Task {
private String name;
private String description;
public Task(String name, String description) {
this.name = name;
this.description = description;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
}
}
``