匿名内部类构造函数分析

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

先看看下面的代码能不能编译通过:

public static void main(String[] args) {

List l1 = new ArrayList();

List l2 = new ArrayList(){};

List l3 = new ArrayList(){{}};

System.out.PRintln(l1.getClass() == l2.getClass() );

System.out.println(l2.getClass() == l3.getClass() );

System.out.println(l1.getClass() == l3.getClass() );

}

答案是能通过编译,输出3个false。l1很容易理解,就是声明了一个

ArrayList对象,那么l2、l3是什么呢?

l2是一个匿名类内部类对象,继承ArrayList;

l3语句有些古怪,带了两个大括号,其实我们这样写就会明白了,这也是一个匿名内部类的定义,它的代码类似如下:

class Sub extends ArrayList {

{

//初始化代码块

}

}

List l3 = new Sub();

看到了吧,就是多了一个初始化代码块而已,起到构造函数的功能。当然一个类中的构造代码块可以有多个,下面的代码是可以编译的:

List l4 = new ArrayList(){{}{}{}};

匿名内部类虽然可以用一个初始化代码块来充当构造函数,但其构造函数还是进行了特殊的处理,它在初始化时直接调用父类的同参构造函数,然后在调用自己的代码块,例如:

List l5 = new ArrayList(5){

{

System.out.println("我是匿名内部类");

}

};

等价于:

class Sub extends ArrayList{

{

System.out.println("我是匿名内部类");

}

Sub(int num){

super(num);

}

}

List l5 = new Sub(5);

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航