匿名内部类构造函数分析
2015-11-08 03:59
190 查看
先看看下面的代码能不能编译通过:
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);
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);
相关文章推荐
- PHP时间戳、时间戳转北京时间日期
- [并发并行]_[C/C++]_[使用线程本地存储Thread Local Storage(TLS)调用复制文件接口的案例]
- [并发并行]_[C/C++]_[使用线程本地存储Thread Local Storage(TLS)调用复制文件接口的案例]
- 静态内部类和非静态内部类的区别
- 编译时、运行时、构建时(一)
- 编译时、运行时、构建时(二)
- Smallest Rectangle Enclosing Black Pixels 解答
- c++ 11 数组 和lambda表达式 语法 / 函数包装器 基本用法
- 深入理解Java中的final关键字
- 35 个 Java 代码性能优化总结
- 从JAVA多线程理解到集群分布式和网络设计的浅析
- Azure Reserved IP
- #soj 3076 相同字符串(tire树)
- Azure Remote Desktop: "An error occurred while loading from file *.rdp"
- Lumen上使用Dingo/Api做API开发时用JWT-Auth做认证的实现
- [2095]:find your present (2)
- BZOJ1770 : [Usaco2009 Nov]lights 燈
- 关于读书
- .NET mvc 中遇到 cshtml无法打开,编译异常情况处理方法
- GitHub for Windows安装失败解决