Java匿名内部类
顾名思义,就是没有名字的内部类。表面上看起来它们似乎有名字,实际上不是它们的名字。 ——百度百科
特性说明
- 没有名字的类
- 既然这个类没有名字,那么就只能使用一次,进而简化代码编写
- 前提条件:必须继承一个父类或者实现一个接口
声明格式
new ParentName(){
... // 内部类的定义
}
实例分析
abstract class Animal {
public abstract void run();
}
class Fish extends Animal {
public void run() {
System.out.println("Swimming!");
}
}
public class Main {
public static void main(String[] args) {
Fish fish = new Fish();
fish.run();
}
}
// 运行结果:Swimming!
如果我们这个类只使用一次,那么我们创建这样一个类岂不是很浪费?所以就有了匿名内部类的出现。
abstract class Animal {
public abstract void run();
}
public class Main {
public static void main(String[] args) {
Animal fish = new Animal(){
public void run() {
System.out.println("Swimming!");
}
};
}
}
// 运行结果:Swimming!
对于接口,和抽象类的使用是一样的。
也就是说,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现。最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口。
public class Main {
public static void main(String[] args) {
Thread thread = new Thread(){
@Override
public void run(){
System.out.println("你好,匿名内部类!");
}
}
thread.start();
}
}
// 运行结果:你好,匿名内部类!
注意事项
- 使用匿名内部类时,必须是继承一个类或者实现一个接口,但是两者不可兼得。
- 匿名内部类中不能定义构造函数。
- 匿名内部类中不能存在任何的静态成员变量和静态方法。
- 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。