建议39: 使用匿名类的构造函数

阅读如下代码,看看是否可以编译:

 public class Client {
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());
}
}

注意ArrayList后面的不同点:l1变量后面什么都没有,l2后面有一对{},l3后面有2对嵌套的{},这段程序能不能编译呢?若能编译,那输出是多少呢?

答案是能编译,输出的是3个false。l1很容易解释,就是声明了ArrayList的实例对象,那l2和l3代表的是什么呢?

(1)l2=new ArrayList(){}

l2代表的是一个匿名类的声明和赋值,它定义了一个继承于ArrayList的匿名类,只是没有任何的覆写方法而已,其代码类似于:

 //定义一个继承ArrayList的内部类
class Sub extends ArrayList{
}
//声明和赋值
List l2 = new Sub();

(2) l3=new ArrayList(){{}}

这个语句就有点怪了,还带了两对大括号,我们分开来解释就会明白了,这也是一个匿名类的定义,它的代码类似于:

 //定义一个继承ArrayList的内部类
class Sub extends ArrayList{
{
//初始化块
}
}
//声明和赋值
List l3 = new Sub();

看到了吧,就是多了一个初始化块而已,起到构造函数的功能。我们知道一个类肯定有一个构造函数,且构造函数的名称和类名相同,那问题来了:匿名类的构造函数是什么呢?它没有名字呀!很显然,初始化块就是它的构造函数。当然,一个类中的构造函数块可以是多个,也就是说可以出现如下代码:

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

上面的代码是正确无误,没有任何问题的。现在清楚了:匿名函数虽然没有名字,但也是可以有构造函数的,它用构造函数块来代替,那上面的3个输出就很清楚了:虽然父类相同,但是类还是不同的。

//===========================================================

如果说分别打印这三个类的输出结果是:

class java.util.ArrayList
class cn.summerchill.test.Client$1
class cn.summerchill.test.Client$2

最新文章

  1. 【WPF】ChartControl的使用
  2. SQL Server DDL触发器运用
  3. php特殊用法
  4. LCC
  5. nginx+winsw windows服务
  6. python 多线程就这么简单
  7. note name
  8. arcgis9.3 执行python文件
  9. JS时间戳
  10. Android 常用开发类库
  11. jdk动态代理与cglib代理、spring aop代理实现原理解析
  12. appium api笔记
  13. 【转】Xposed出现 java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
  14. Yann Martell《少年 pi 的奇幻漂流》
  15. Tcp的三次握手,以及原理详解
  16. css table样式
  17. [LOJ6436][PKUSC2018]神仙的游戏
  18. bat批量重命名文件
  19. spring boot+mybatis+swagger搭建
  20. Populating Next Right Pointers in Each Node 设置二叉树的next节点

热门文章

  1. Spark生态之Spark Core
  2. POJ 3660 Cow Contest (floyd求联通关系)
  3. UVa 1252 Twenty Questions (状压DP+记忆化搜索)
  4. word2007 每页显示表头
  5. cocos2d-x 让精灵按照自己设定的运动轨迹行动
  6. UVa 11111 Generalized Matrioshkas
  7. Codeforces Round #116 (Div. 2, ACM-ICPC Rules) C. Letter 暴力
  8. BZOJ 3931: [CQOI2015]网络吞吐量 最大流
  9. 【Lucene4.8教程之四】分析
  10. iOS开发——UI篇OC篇&layoutSubviews和drawRect