局部内部类
定义在方法体内部的类,它只在方法内部可见。局部内部类不能使用访问修饰符 public
、private
、protected
或static
修饰。以下是一个简单的局部内部类的例子:
public class OuterClass {
private int outerField = 10;
public void outerMethod() {
final int localVar = 5; // 局部变量(被 final 修饰,因为局部内部类访问的局部变量必须是 final 或等效 final 的)
// 局部内部类
class LocalInnerClass {
private int innerField;
public LocalInnerClass(int innerField) {
this.innerField = innerField;
}
public void displayFields() {
// 在局部内部类中可以访问外部类的成员和局部变量
System.out.println("Outer field from inner class: " + outerField);
System.out.println("Local variable from inner class: " + localVar);
// 访问内部类的成员
System.out.println("Inner field: " + innerField);
}
}
// 创建局部内部类的对象
LocalInnerClass innerObj = new LocalInnerClass(20);
// 调用局部内部类的方法显示字段
innerObj.displayFields();
}
public static void main(String[] args) {
// 创建外部类对象
OuterClass outerObj = new OuterClass();
// 调用外部类的方法
outerObj.outerMethod();
}
}
在 outerMethod
方法内部,我们定义了一个局部变量 localVar
,局部内部类 LocalInnerClass
可以访问这个局部变量,但该变量必须是 final
或等效于 final
的(JDK 8 之后,局部变量隐式具有 final
特性)。相当于局部内部类中使用的变量会变成常量。
匿名内部类
匿名内部类是一种在创建对象和类的实例的同时定义类的一种方式,通常用于创建只需要一次使用的类的实例。匿名内部类没有显式的类名称,其定义和创建对象的过程合并在一起。适用只定义一个子类对象。必须继承一个父类或实现一个接口,定义类,实现类,和创建对象语法合并,只能创建一个该类对象。可以减少代码量
以下是一个使用匿名内部类的例子,假设有一个接口 Greeting
:
interface Greeting {
void greet();
}
public class AnonymousInnerClassExample {
public static void main(String[] args) {
// 使用匿名内部类创建实现了 Greeting 接口的对象,抽象类也可以
Greeting greeting = new Greeting() {
@Override
public void greet() {
System.out.println("Hello from anonymous inner class!");
}
};
// 调用 greet 方法
greeting.greet();
}
}