zoukankan      html  css  js  c++  java
  • 简单谈谈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。

  • 相关阅读:
    Daily Build[called heart beat]
    JS判断浏览器类型与版本
    Dependency Injection in ASP.NET MVC
    Splash Screen(短时间弹出框,信息显示一次)
    Mock Framework
    sites for debugging script
    Types in Javascript(jQuery)
    推荐10个超棒的jQuery工具 提示插件
    WebClient 下载文件
    sqlserver导入Excel数据 总是报错:错误 0xc020901c: 数据流任务 1: 输出“Excel 源输出”(55) 上的 输出列“T2”(64) 出错。返回的列状态是:“文本被截断,或者一个或多个字符在目标代码页中没有匹配项
  • 原文地址:https://www.cnblogs.com/guankelei/p/11641961.html
Copyright © 2011-2022 走看看