📅  最后修改于: 2023-12-03 14:42:20.234000             🧑  作者: Mango
在 Java 中,我们可以在一个类中定义另一个类,这个类被称为内部类。
内部类可以访问外部类的成员变量和方法,而外部类则不能访问内部类的成员。
在 Java 中有四种类型的内部类:成员内部类、静态内部类、局部内部类和匿名内部类。下面我们将一一介绍这些内部类的特点以及使用方法。
成员内部类是一个定义在另一个类中的类,它可以访问外部类的成员,而且可以被外部类的其他方法访问。
public class Outer {
private int x = 10;
public class Inner {
public void print() {
System.out.println(x);
}
}
}
在上面的例子中,Inner
类是 Outer
类的成员,因此它可以访问 Outer
类的私有成员 x
。
使用内部类的语法是,在外部类中创建内部类的实例:
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.print(); // 输出 10
注意,在创建内部类的实例时,必须使用外部类的实例来创建。
静态内部类是一个定义在另一个类中的静态类,它不需要外部类的实例就可以创建。
public class Outer {
private static int x = 10;
public static class Inner {
public void print() {
System.out.println(x);
}
}
}
在上面的例子中,Inner
类是 Outer
类的静态成员,因此它可以不依赖于外部类的实例。
创建静态内部类的实例时,不需要创建外部类的实例。使用下面的语法来创建内部类的实例:
Outer.Inner inner = new Outer.Inner();
inner.print(); // 输出 10
局部内部类是一个定义在一个代码块中的类,它只能在这个代码块中访问。
public class Outer {
private int x = 10;
public void test() {
class Inner {
public void print() {
System.out.println(x);
}
}
Inner inner = new Inner();
inner.print(); // 输出 10
}
}
在上面的例子中,Inner
类是在 test
方法中定义的局部内部类。
要访问局部内部类,必须先创建外部类的实例,然后调用外部类中包含局部内部类的方法。
匿名内部类是一个没有名字的内部类,它通常用于创建一个实现某个接口或抽象类的对象。
public interface MessageHandler {
void handleMessage(String message);
}
public class MessageReceiver {
private MessageHandler handler;
public void setHandler(MessageHandler handler) {
this.handler = handler;
}
public void receive(String message) {
handler.handleMessage(message);
}
}
public class Application {
public static void main(String[] args) {
MessageReceiver receiver = new MessageReceiver();
receiver.setHandler(new MessageHandler() {
@Override
public void handleMessage(String message) {
System.out.println("Received message: " + message);
}
});
receiver.receive("Hello, World!");
}
}
在上面的例子中,我们使用一个匿名内部类来实现 MessageHandler
接口。
创建匿名内部类的语法是,在创建对象的同时定义这个类的实现:
receiver.setHandler(new MessageHandler() {
@Override
public void handleMessage(String message) {
System.out.println("Received message: " + message);
}
});
注意,在匿名内部类中不能定义构造函数,因为它没有名字。