目录
Java 内部类
1. 内部类的概念和类型
1.1 成员内部类
1.2 局部内部类
1.3 匿名内部类
1.4 静态内部类
2. 内部类的用途和优势
3. 内部类的注意事项
总结与后续
Java 内部类
内部类(Inner Class)是定义在另一个类内部的类。在 Java 中,内部类可以帮助开发者实现更紧凑和更清晰的代码结构,尤其是在需要对类进行逻辑分组或增强封装时。通过使用内部类,我们可以更好地控制类的可见性和访问权限。本模块将介绍 Java 内部类的概念、各种类型的内部类以及它们的使用场景。
1. 内部类的概念和类型
内部类是定义在另一个类的内部,可以访问包含它的外部类的成员。Java 中有四种主要的内部类:
-
成员内部类(Member Inner Class)
-
局部内部类(Local Inner Class)
-
匿名内部类(Anonymous Inner Class)
-
静态内部类(Static Nested Class)
1.1 成员内部类
成员内部类 是最常见的一种内部类,定义在外部类的内部,与外部类的实例关联。
示例:成员内部类
public class OuterClass {
private String message = "Hello from OuterClass!";
public class InnerClass {
public void printMessage() {
System.out.println(message);
}
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
inner.printMessage();
}
}
在这个例子中,InnerClass
是 OuterClass
的成员内部类,内部类可以直接访问外部类的成员变量 message
。
1.2 局部内部类
局部内部类 是定义在方法或代码块内部的类,它的作用域仅限于定义它的方法或代码块。
示例:局部内部类
public class LocalInnerClassExample {
public void display() {
class LocalInner {
void print() {
System.out.println("这是局部内部类");
}
}
LocalInner localInner = new LocalInner();
localInner.print();
}
public static void main(String[] args) {
LocalInnerClassExample example = new LocalInnerClassExample();
example.display();
}
}
在这个例子中,LocalInner
是一个局部内部类,它只在 display()
方法中可见。
1.3 匿名内部类
匿名内部类 没有名字,通常用于简化代码,特别是当需要实现接口或继承抽象类时。匿名内部类可以用来创建一次性使用的类。
示例:匿名内部类
public class AnonymousInnerClassExample {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类实现 Runnable 接口");
}
};
new Thread(runnable).start();
}
}
在这个例子中,我们使用匿名内部类实现了 Runnable
接口,并创建了一个线程执行它。
1.4 静态内部类
静态内部类 使用 static
关键字修饰,静态内部类与外部类的实例无关,因此它不能访问外部类的非静态成员。
示例:静态内部类
public class StaticNestedClassExample {
static class StaticNested {
void display() {
System.out.println("这是静态内部类");
}
}
public static void main(String[] args) {
StaticNestedClassExample.StaticNested nested = new StaticNestedClassExample.StaticNested();
nested.display();
}
}
在这个例子中,StaticNested
是一个静态内部类,可以通过外部类直接访问,而不需要外部类的实例。
2. 内部类的用途和优势
-
逻辑分组:内部类可以将逻辑上相关的类组合在一起,使代码更加组织有序。
-
封装:内部类可以隐藏不必要的实现细节,仅对外暴露外部类的接口。
-
访问外部类成员:内部类可以直接访问外部类的私有成员,这对于实现某些功能非常方便。
-
实现事件处理:匿名内部类非常适合用于事件处理,例如在 GUI 应用程序中实现按钮点击事件。
3. 内部类的注意事项
-
访问限制:成员内部类和局部内部类可以访问外部类的所有成员,包括私有成员。而静态内部类只能访问外部类的静态成员。
-
创建实例:成员内部类的实例必须通过外部类的实例来创建,而静态内部类的实例可以直接通过外部类名创建。
-
匿名内部类的限制:匿名内部类无法定义构造方法,只能通过实例初始化块来进行一些初始化操作。
示例:匿名内部类访问外部变量
public class Outer {
public void method() {
int number = 10;
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("外部变量 number: " + number);
}
};
new Thread(runnable).start();
}
public static void main(String[] args) {
Outer outer = new Outer();
outer.method();
}
}
在这个例子中,匿名内部类可以访问外部方法中的变量 number
,但是该变量必须是 隐式最终变量(即在内部类使用过程中不可改变)。
总结与后续
在本模块中,我们学习了 Java 的内部类,包括成员内部类、局部内部类、匿名内部类和静态内部类。内部类有助于代码组织和封装,并在特定场景下提高代码的可读性和灵活性。
在下一模块中,我们将讨论 Java 的注解(Annotations),了解注解的定义、内置注解的使用,以及如何自定义注解,以便更好地为代码添加元数据和实现编译时的检查。