什么{{ArrayList初始值设定器上的语法'确​​实如此

时间:2010-12-08 20:00:26

标签: java arraylist static-initializer

我最近发现在我看来是静态初始化ArrayList的新语法:
new ArrayList() {{ add("first"); add("second"); }};

我的问题是,那里到底发生了什么?这是定义静态块的快捷方式(我认为它需要static关键字)?或者只是一种定义默认构造函数的方法?别的什么?哪个版本的Java有效?

非常感谢解释以及进一步阅读的链接。

编辑: 我的测试类用于显示初始化程序块是否在构造函数之前或之后执行。结果显示初始化程序块在其他构造函数代码之前执行:

import org.junit.Test;

public class InitializerBlockTest {
    class InitializerTest {
        {
        System.out.println("Running initalizer block");
        }

        public InitializerTest() {
            System.out.println("Running default constructor");
        }
    }

    class SubClass extends InitializerTest {
      {
        System.out.println("Running subclass Initializer block");
      }

      public SubClass()  {
        System.out.println("Running subclass constructor");
      }
    }

    @Test
    public void testIt() {
        new SubClass();
    }
}

输出:

Running initalizer block
Running default constructor
Running subclass Initializer block
Running subclass constructor

3 个答案:

答案 0 :(得分:6)

您正在创建一个新的ArrayList匿名子类,其中一个实例初始化程序会调用add()两次。

它与:

相同
class MyList extends ArrayList
{

{ // This is an instance initializer; the code is invoked before the constructor.
add("first"); 
add("second");
}

public MyList() {
    super();
    // I believe initializers run here, but I have never specifically tested this
    }
}

...

List list=new MyList();

请注意,就个人而言,我并不认为这是一个成语,因为它会导致类文件爆炸。

答案 1 :(得分:4)

它是实例变量的初始化块。

来自Oracle的文档:

  例如,

初始化程序块   变量看起来就像静态   初始化程序块,但没有   static keyword:

{

    // whatever code is needed for initialization goes here
}
  

Java编译器复制初始化程序   阻塞到每个构造函数中。   因此,可以使用这种方法   共享一段代码   多个构造函数。

请参阅:http://download.oracle.com/javase/tutorial/java/javaOO/initial.html

答案 2 :(得分:3)

当您编写new ArrayList() { }时,您正在创建ArrayList的匿名子类。代码中最里面括号中的{ }表示初始化块,实际上复制到每个构造函数中。

编辑:你们肯定会快速回答!