专业剑 : 匿名内部类anonymous inner class

Java内部类(匿名内部类)_YWenXing的博客-CSDN博客

匿名内部类(重要)

1、匿名内部类

本质上是一个没有名字的局部内部类,定义在方法中、代码块中等。

作用:方便创建子类对象,最终目的是为了简化代码编写。

2、格式

new 类|抽象类名|或者接口名(){

重写方法;
}

范例:

public class Bar extends Boo {
    Bar() {
    }

    Bar(String s) {
        super(s);
    }

    static void main() {
        Boo annoymousInnerBoo1 = new Boo() {
        };
        Boo annoymousInnerBoo2 = new Boo("hi") {

        };

        Bar annoymousInnerBar1 = new Bar() {
            @Override
            void zoo() {

            }
        };

        Bar annoymousInnerBar2 = new Bar() {
        };

        method(new Bar() {
        });

    }

    static void method(Bar bar) {

    }

    void zoo() {
    }
}


3、特点总结

匿名内部类是一个没有名字的内部类。

匿名内部类写出来就会产生一个匿名内部类的对象。不仅声明了一个类,同时创建了对象实例。

匿名内部类的对象类型相当于是当前new的那个的类的子类。所以才会有重写@Override。

4、使用场景

匿名内部类作为方法的实际参数,即在调用方法时,在参数部分定义一个匿名内部类。

4.anonymous inner class

which one create an anonymous inner class from within class bar?

public class Boo {
    Boo(String s) {}
    Boo() {}
}
public class Bar extends Boo {
    Bar() {}
    Bar(String s) {super(s);}
    void zoo() {}

    static void main() {
        Boo f = new Boo("") {};
    }
}

A: Boo f = new Boo(24) {}; // 语法错误,构造函数的参数为String

B: Boo f = new Bar() {}; //正确,或者Boo f = new Bar("s") {};

C: Bar f = new Boo(String s) {}; // 注意:在匿名内部类中,子类无法类型转换为父类,普通类可以。

D: Bar f = new Boo.Bar(String s) {}; // 不存在Boo.Bar。

关键一是Boo f = new Bar(); 和Boo f = new Bar() {};的区别,前者是调用构造函数实例化类,后者是定义一个匿名内部类并实例化。

二是定义匿名内部类时会用到Bar类的构造函数,参数必须匹配。