手机
当前位置:查字典教程网 >编程开发 >Java >简单谈谈java中匿名内部类构造函数
简单谈谈java中匿名内部类构造函数
摘要:先看看下面的代码能不能编译通过:publicstaticvoidmain(String[]args){Listl1=newArrayList...

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

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) { @Override public int getI() { return super.getI() * 10; } }; } }

编译之后得到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。

【简单谈谈java中匿名内部类构造函数】相关文章:

解析java中super的用法分析

java中的匿名内部类详细总结

java匿名内部类实例简析

java类中元素初始化顺序详解

浅谈Java中父类与子类的加载顺序详解

如何用java生成指定范围的随机数

深入Java不可变类型的详解

基于java中泛型的总结分析

简单说说Java SE、Java EE、Java ME三者之间的区别

java中关于内部类的使用详解

精品推荐
分类导航