1700441502
1700441503
}
1700441504
1700441505
注意ArrayList后面的不同点:l1变量后面什么都没有,l2后面有一对{},l3后面有2对嵌套的{},这段程序能不能编译呢?若能编译,那输出是多少呢?
1700441506
1700441507
答案是能编译,输出的是3个false。l1很容易解释,就是声明了ArrayList的实例对象,那l2和l3代表的是什么呢?
1700441508
1700441509
(1)l2=new ArrayList(){}
1700441510
1700441511
l2代表的是一个匿名类的声明和赋值,它定义了一个继承于ArrayList的匿名类,只是没有任何的覆写方法而已,其代码类似于:
1700441512
1700441513
//定义一个继承ArrayList的内部类
1700441514
1700441515
class Sub extends ArrayList{
1700441516
1700441517
}
1700441518
1700441519
//声明和赋值
1700441520
1700441521
List l2=new Sub();
1700441522
1700441523
(2)l3=new ArrayList(){{}}
1700441524
1700441525
这个语句就有点怪了,还带了两对大括号,我们分开来解释就会明白了,这也是一个匿名类的定义,它的代码类似于:
1700441526
1700441527
//定义一个继承ArrayList的内部类
1700441528
1700441529
class Sub extends ArrayList{
1700441530
1700441531
{
1700441532
1700441533
//初始化块
1700441534
1700441535
}
1700441536
1700441537
}
1700441538
1700441539
//声明和赋值
1700441540
1700441541
List l3=new Sub();
1700441542
1700441543
看到了吧,就是多了一个初始化块而已,起到构造函数的功能。我们知道一个类肯定有一个构造函数,且构造函数的名称和类名相同,那问题来了:匿名类的构造函数是什么呢?它没有名字呀!很显然,初始化块就是它的构造函数。当然,一个类中的构造函数块可以是多个,也就是说可以出现如下代码:
1700441544
1700441545
List l3=new ArrayList(){{}{}{}{}{}};
1700441546
1700441547
上面的代码是正确无误,没有任何问题的。现在清楚了:匿名函数虽然没有名字,但也是可以有构造函数的,它用构造函数块来代替,那上面的3个输出就很清楚了:虽然父类相同,但是类还是不同的。
1700441548
1700441549
1700441550
1700441551
[
上一页 ]
[ :1.700441502e+09 ]
[
下一页 ]