使用匿名类的构造函数

简介:

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

复制代码
 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

 


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/5430215.html,如需转载请自行联系原作者

相关文章
|
2月前
|
C++
派生类的构造函数
派生类的构造函数
51 9
|
1月前
静态方法和实例方法有何不同?
静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制
|
3月前
|
编译器 C++
C++ 类构造函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。
81 30
|
2月前
|
Java 程序员 C#
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
15 0
|
7月前
|
编译器 C++
C++程序中的派生类构造函数
C++程序中的派生类构造函数
69 1
|
7月前
|
编译器 C#
C#构造函数详解
C#构造函数详解
66 0
|
7月前
|
编译器 C语言 C++
你想对构造函数说些什么?
你想对构造函数说些什么?
|
编译器 C++
C++中虚继承时的构造函数
在虚继承中,虚基类是由最终的派生类初始化的,换句话说,最终派生类的构造函数必须要调用虚基类的构造函数。对最终的派生类来说,虚基类是间接基类,而不是直接基类。这跟普通继承不同,在普通继承中,派生类构造函数中只能调用直接基类的构造函数,不能调用间接基类的。 下面我们以菱形继承为例来演示构造函数的调用: #include <iostream> using namespace std; //虚基类A class A{ public: A(int a); protected: int m_a; }; A:
115 1
|
编译器
匿名对象与构造器
匿名对象与构造器
80 0
为什么子类会调用父类无参的构造函数
为什么子类会调用父类无参的构造函数

热门文章

最新文章