简单谈谈java中匿名内部类构造函数?
先看看下面的代码能不能编译通过:
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);
我们来看段示例代码
package testtest;
public class Main {
public static void main(String[] args) {
InnerTest inner = new InnerTest();
Test t = inner.get(3);
System.out.println(t.getI());
}
}
class Test {
private int i;
public Test(int i) {
this.i = i;
}
public int getI() {
return i;
}
}
class InnerTest {
public Test get(int x) {
return new Test(x) {
}
}
编译之后得到4个class文件:Test.class,InnerTest.class,InnerTest$1.class以及Main.class。容易看出来,Main.class是测试类的class文件,Test.class是超类Test的class文件,InnerTest.class是InnerTest
的class文件,最值得关注的就是匿名内部类的class文件InnerTest$1.class。
最新文章
- 使用safari对webview进行调试
- MySQL命令行导出数据库
- springmvc导出excel并弹出下载框
- Xamarin.Forms入门学习路线
- Ubuntu下adb的安装
- 第一章 管理程序流(In .net4.5) 之 实现多线程和异步处理
- RealThinClient (RTC)是什么?
- OAuth2的学习小结
- jQuery on()绑定动态元素出现的问题小结
- Tsinghua dsa mooc pa1
- (转)硬盘分区备忘(主分区,扩展分区和逻辑分区)以及Linux硬盘分区工具parted 介绍
- var that = this 小坑记
- 为github添加ssh key
- lsof详解
- FZU软工第三次作业-原型设计
- Synchronized常用用法
- [java] 求2个集合的交 差 并集
- 【mysql】分区表
- linux学习--查看cpu及内存信息
- 结合 Redis 实现同步锁
热门文章
- Docker 退出不关闭容器以及保存日志到本地
- flutter 编译报错 ../extended_network_image_provider.dart:63:41: Error: Type 'DecoderCallback' not found
- Java8-Optional-No.01
- ECMAScript 提案阶段
- MySQL数据分析-(5)数据库设计之ER模型
- static关键字的用法小结
- 初次接触webpack
- cmake语法入门记录
- ORM SQLAlchemy - 对象关联
- 【面试题总结】1、统计字符串中某个单词出现的次数(1-C++实现)