Java匿名内部类是Java语言中一种特殊的类,它没有显式的类名,通常用于实现接口或继承抽象类,匿名内部类的特性主要有以下几点:
1、没有显式的类名
匿名内部类没有显式的类名,它的类名是由编译器自动生成的,编译器会为每个匿名内部类生成一个唯一的类名,这个类名以“$”开头,后面跟着一串数字,例如OuterClass$1
、OuterClass$2
等。
2、继承父类或实现接口
匿名内部类可以继承一个类或实现一个接口,如果需要继承一个类,那么这个类必须是已经存在的;如果需要实现一个接口,那么这个接口必须是已经定义好的。
3、可以访问外部类的成员变量和方法
由于匿名内部类是在外部类的实例方法中创建的,因此它可以访问外部类的成员变量和方法,需要注意的是,只有被声明为final的局部变量才能在匿名内部类中使用。
4、可以实现多个接口
匿名内部类可以实现多个接口,只需要在括号中依次列出这些接口即可。
new Thread() { public void run() { System.out.println("线程运行中..."); } }.start();
5、可以实现抽象方法
如果匿名内部类实现了一个抽象类,那么它必须实现抽象类中的所有抽象方法,否则,这个匿名内部类也必须声明为抽象类。
abstract class Animal { abstract void eat(); } new Animal() { public void eat() { System.out.println("吃东西"); } }.eat();
6、不能定义构造方法
匿名内部类不能定义构造方法,但是它可以调用外部类的构造方法,如果需要调用外部类的构造方法,可以在匿名内部类的参数列表中添加外部类的构造方法。
new Thread(new Runnable() { public void run() { System.out.println("线程运行中..."); } }, "线程1").start();
7、只能使用this
关键字引用自身成员变量和方法
在匿名内部类中,不能使用super
关键字引用父类的成员变量和方法,只能使用this
关键字引用自身成员变量和方法。
class OuterClass { class InnerClass { public void print() { this.toString(); // 正确,引用自身成员变量和方法 super.toString(); // 错误,不能使用super关键字引用父类的成员变量和方法 } } }
8、生命周期有限
匿名内部类的生命周期是有限的,它只在创建它的外部类的实例方法或代码块中有效,当外部类的实例方法或代码块执行完毕后,匿名内部类的引用就会被丢弃,垃圾回收器会自动回收它所占用的内存。
9、适用于简化代码逻辑的场景
匿名内部类通常用于简化代码逻辑的场景,例如实现回调函数、监听器等,通过使用匿名内部类,可以将复杂的逻辑封装在一个简洁的代码块中,提高代码的可读性和可维护性。
10、容易出现语法错误和性能问题
由于匿名内部类的语法较为复杂,容易出现语法错误,每次创建匿名内部类都会消耗一定的系统资源,因此在性能敏感的场景下,应尽量避免使用匿名内部类。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/183835.html