匿名内部类构造函数分析

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

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);

时间: 2024-10-18 20:17:38

匿名内部类构造函数分析的相关文章

jquery构造函数分析

jquery是面向对象的写法也有构造函数,每次调用jquery方法是就会实例化一个jqeury对象,但是jQuery的写法却非常高明值得我们学习. js虽然不是面向对象的语言,却又很多面向对象的写法,这里推荐大家看一下图灵的<javascript高级程序设计>中的面向对象的程序设计部分.在众多方法中比较常见的写法是构造加原型方式,下面举例: var Person=function(name,age){    this.name=name;    this.age=age; } Person.p

C++类对象的拷贝构造函数分析

对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=100;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #include <iostream>using namespace std;class CA{ public: CA(int b) { a=b; } void Show () { cout<<a<<endl; } private: int a;};int main(){

Android WIFI 分析(一)

本文基于<深入理解Android WiFi NFC和GPS 卷>和 Android N 代码结合分析 WifiService 是 Frameworks中负责wifi功能的核心服务,它主要借助wpa_supplicant(简称WPAS)来管理和控制Android 平台中的wifi 功能. 将通过两条线路来分析WifiService 服务: 1.WifiService 的创建及初始化: 2.在Setting中打开WiFi功能.扫描网络以及连接网络的流程: 最后介绍WifiWatchdogState

wifi display代码 分析

转自:http://blog.csdn.net/lilian0118/article/details/23168531 这一章中我们来看Wifi Display连接过程的建立,包含P2P的部分和RTSP的部分,首先来大致看一下Wifi Display规范相关的东西. HIDC: Human Interface Device Class  (遵循HID标准的设备类)UIBC: User Input Back Channel  (UIBC分为两种,一种是Generic,包含鼠标.键盘等:另一种是HI

Android WifiDisplay分析二:Wifi display连接过程.

这一章中我们来看Wifi Display连接过程的建立,包含P2P的部分和RTSP的部分,首先来大致看一下Wifi Display规范相关的东西. HIDC: Human Interface Device Class  (遵循HID标准的设备类)UIBC: User Input Back Channel  (UIBC分为两种,一种是Generic,包含鼠标.键盘等:另一种是HIDC,HID是一个规范,只有遵循HID的标准,都可以叫做HID设备,包含USB鼠标.键盘.蓝牙.红外等)PES: Pac

你真的了解AsyncTask吗?AsyncTask源码分析

转载请注明出处:http://blog.csdn.net/yianemail/article/details/51611326 1,概述 Android UI是线程不安全的,如果想要在子线程很好的访问ui, 就要借助Android中的异步消息处理机制 http://blog.csdn.net/yianemail/article/details/50233373 通过Thread 执行耗时操作,通常利用Handler 发送消息给ui线程. 这种方式代码相对臃肿,并且不能对多任务执行很好的控制. 为

Netty源码分析 (六)----- 客户端接入accept过程

通读本文,你会了解到1.netty如何接受新的请求2.netty如何给新请求分配reactor线程3.netty如何给每个新连接增加ChannelHandler netty中的reactor线程 netty中最核心的东西莫过于两种类型的reactor线程,可以看作netty中两种类型的发动机,驱动着netty整个框架的运转 一种类型的reactor线程是boos线程组,专门用来接受新的连接,然后封装成channel对象扔给worker线程组:还有一种类型的reactor线程是worker线程组,

Java入门系列之集合HashMap源码分析(十四)

前言 我们知道在Java 8中对于HashMap引入了红黑树从而提高操作性能,由于在上一节我们已经通过图解方式分析了红黑树原理,所以在接下来我们将更多精力投入到解析原理而不是算法本身,HashMap在Java中是使用比较频繁的键值对数据类型,所以我们非常有必要详细去分析背后的具体实现原理,无论是C#还是Java原理解析,从不打算一行行代码解释,我认为最重要的是设计思路,重要的地方可能会多啰嗦两句. HashMap原理分析 我们由浅入深,循序渐进,首先了解下在HashMap中定义的几个属性,稍后会

C++里的继承和多态(下)——单继承、多继承、菱形继承(含虚拟函数的继承)

1.带有虚函数的类 class Base { public:                  virtual void FunTest1()                 {                                 cout << "Base::FunTest1()" << endl;                 }                  virtual void FunTest2()