学过Java的同学肯定听说过匿名内部类, 不过不知道有没有仔细的深究过它,
比如为什么称之为匿名? 为什么也算是一个类,而且是内部类? 它和内部类有什么区别?
先来看一段匿名内部类的代码, 这里需要先定义一个抽象类,
abstract class Person {
public abstract void doSomething();
}
大家应该都知道一个典型的匿名内部类是这样子的,
public class Demo {
public static void main(String[] args) {
Person person = new Person() {
public void doSomething() {
System.out.println("student reading");
}
};
person.doSomething();
}
}
对比与非匿名内部类, 匿名内部类省去了实现一个 Person的具体类的步骤, 比如说上面的代码可以用这样的非匿名内部类来实现,
public class Student extends Person {
public void doSomething() {
System.out.println("student reading");
}
}
....
Student person = new Student();
person.doSomething();
使用匿名内部类,省去了新建一个类的过程。 虽然代码上看起来少了这个类,但其实在字节码中,还是有生成一个类的, 比如上面的代码 Demo类,在编译后会生成两个文件,
Demo.class Demo$1.class
可以用
javap -c Demo$1.class
来看看字节码里做了什么。
final class Demo$1 extends Person {
Demo$1();
Code:
0: aload_0
1: invokespecial #1 // Method Person."<init>":()V
4: return
public void doSomething();
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String student reading
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
可以看到,其实Demo$1就是一个标准的类, 相当于一个 Student类, 虽然我们没有继承 Person实现一个具体的类, 可是Java帮我们做了这件事, 如果你的开发经验足够丰富的话,有反编译的经验, 就会看到在一些jar包里有大量的 12为后缀的class文件, 其实这些都是匿名内部类来着。
所以现在知道匿名跟内部类是什么意思了吧。