匿名内部类真的很神秘的,不过,这种类就喜欢做一些神秘的东西。想想,匿名内部类,根本就没有名,怎么写它的构造函数呀?如里是一个默认的构造函数,如果带上了参数这又应该怎么办?很神秘的东西。
看一段代码:
abstract class B{
public B(int i){
System.out.println("i="+i) ;
}
abstract public void play() ;
}
class Bout
{
public void show(int a,final int b){
new B(a){
public void play() {
int c = b ;
}
};
}
}
这个代码编译不会有问题,会出现三个class文件的,对于Bout类就产生了两个class文件(Bout.class与Bout$1.class),这里面其实有些很隐含的东西的,反编译一下class文件来看看:
对于Bout类:
这里竟调用了Bout$1的三个参数的构造函数。
看看Bout$1真的有三个参数的构造函数吗?
里面真的有三个参数的构造函数呀,还调用了一个父类的一个参数构造函数了。这里编译器还给它生成了一个val$b的变量,把第三个变量放到这里面去了,这个就实现了构造函数的功能了;再看那个调用了父类的那个参数,其实就是第二个参数。就是这样子了。看多几眼上面的图,就明白。