zoukankan      html  css  js  c++  java
  • [改善Java代码]使用匿名类的构造函数

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

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

     1 public class Client {
     2     public static void main(String[] args) {  
     3          List l1 = new ArrayList();  
     4          List l2 = new ArrayList(){};  
     5          List l3 = new ArrayList(){{}};  
     6          System.out.println(l1.getClass() == l2.getClass());  
     7          System.out.println(l2.getClass() == l3.getClass());  
     8          System.out.println(l1.getClass() == l3.getClass());  
     9     } 
    10 }

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

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

    (1)l2=new ArrayList(){}

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

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

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

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

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

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

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

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

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

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

    class java.util.ArrayList
    class cn.summerchill.test.Client$1
    class cn.summerchill.test.Client$2
  • 相关阅读:
    Mybaits-plus实战(三)
    Mybaits-plus实战(二)
    Mybaits-plus实战(一)
    面向对象的理解
    如何理解算法
    将yyyyMMdd HH:mm:ss格式的时间转换成时间类型
    泛型/dynamic/object作用
    成功之道
    ASP.NET注意事项
    Razor引擎总结
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/5430215.html
Copyright © 2011-2022 走看看