目录
4.可以访问方法中的局部变量,但局部变量必须是final修饰的
问题:
刷面经,博客输出,加深理解,20253.3 希望毕业前可以找到工作。
语法:
new 父类 {
类体
}
new 接口{
类体
}
使用场景:
1.实现一个接口
interface Greeting {
void sayHello();
}
public class Main {
public static void main(String[] args) {
// 使用匿名内部类实现接口
Greeting greeting = new Greeting() {
@Override
public void sayHello() {
System.out.println("Hello, World!");
}
};
greeting.sayHello(); // 输出: Hello, World!
}
}
2.继承一个抽象类并实现其方法
abstract class Animal {
abstract void makeSound();
}
public class Main {
public static void main(String[] args) {
// 使用匿名内部类继承抽象类
Animal dog = new Animal() {
@Override
void makeSound() {
System.out.println("Woof!");
}
};
dog.makeSound(); // 输出: Woof!
}
}
3.继承普通类,覆盖其方法
abstract class Animal {
abstract void makeSound();
}
public class Main {
public static void main(String[] args) {
// 使用匿名内部类继承抽象类
Animal dog = new Animal() {
@Override
void makeSound() {
System.out.println("Woof!");
}
};
dog.makeSound(); // 输出: Woof!
}
}
特点&原因:
1.没有类名,不能重复使用
- 应该是没有显式类名,所以不能让我调用。
- JVM会实现一个隐式的类名。
2.只能实例化一次
- 匿名类的定义和实例化是绑定在一块的,编译阶段就把实例化的代码放到了调用的位置。
- 没有显式类目,不能让我们通过关键字去new,所以只能实例化一次。
3.可以访问外部类的局部变量
- 匿名内部类实例化后,会持有一个外部类的引用,所以可以访问,
- 这个引用 可以看这个 引用
4.可以访问方法中的局部变量,但局部变量必须是final修饰的
- 匿名内部类是存储在堆内存中,而局部变量是存储在栈中
- 栈的生命周期比较短,所以当这个变量生命周期到后,匿名内部类就会出现访问不到的情况
- 所以,匿名内部类会复制一个副本到自己字段中,这样即使变量被回收了,也可也访问的到。
- 必须是final,是因为需要保持数据的一致性,防止因修改数据,导致匿名内部类的数据和方法中的数据不一致。
public void test() {
final String localVariable = "Local Variable";
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println(localVariable); // 访问局部变量
}
};
runnable.run(); // 输出: Local Variable
}
//编译后会内部类 OuterClass$1 自己会有localVariable一个字段
class OuterClass$1 implements Runnable {
private final String val$localVariable;
OuterClass$1(String localVariable) {
this.val$localVariable = localVariable;
}
@Override
public void run() {
System.out.println(val$localVariable);
}
}