匿名内部类的使用条件
如果接口的实现类(或者定义类的子类)只需要使用唯一的一次,那么这种情况下就可以省略掉该类的定义,改为使用匿名内部类
匿名内部类的定义格式
接口名称 对象名 = new 接口名称(){
//覆盖重写所有方法
}
定义格式解析
-
new代表创建对象的动作
-
接口名称就是匿名内部类需要实现哪个接口
-
{…}是匿名内部类的内容
注意事项
-
匿名内部类在创建对象时只能使用唯一一次。如果希望多次创建对象,而且类的内容一样的话,那么就必须使用单独定义的类。
-
匿名对象在调用方法的时候只能调用唯一一次。如果希望同一个对象调用多次方法,那么必须给对象起个名字。
-
匿名内部类时省略了实现类/子类名称,但是匿名对象是省略了对象名称,二者可以混用,但是只能使用一次。
-
如果希望匿名内部类实现类似构造器的行为,需要在抽象类中写明构造器,然后通过实例初始化实现(不能使用接口,接口中不允许定义构造方法)。举例:
abstract class Base { public Base(int i) { System.out.println("Base constructor, i = " + i); } public abstract void f(); } public class AnonymousConstructor { public static Base getBase(int i) { return new Base(i) { //通过接口提供的构造器实现 { System.out.println("Inside instance initializer"); } public void f() { System.out.println("In anonymous f()"); } }; } public static void main(String[] args) { Base base = getBase(47); base.f(); } }
-
使用匿名内部类一定会向上转型,因为匿名内部类没有类名称,要创建一个符合要求的引用只能使用其基类或接口名称。
-
如果一个匿名内部类要使用外部定义的一个变量,那么编译器会强制要求这个变量是final的
-
匿名内部类比较常用的场景就是静态工厂方法了,放个链接,讲的很全面了。(虽然静态工厂方法比构造器好用的多,但是也不应该滥用,否则会导致代码冗余,而且会增加内存的开销,一般只有常用的工具类才会使用静态工厂方法)
小结
我在这里才真的感觉到:多态真神奇,你别管我到底是什么东西,你只要知道我有那几个功能就行了,你只管用,别的不用多操心