Java中{}和{{}}初始化之间的区别

时间:2011-11-13 02:07:22

标签: java

public class A{
}

A a = new A(){{
    final int x = 1; // IT HAS TO BE FINAL HERE. WHY?
}};

A aa = new A(){
    int x = 1; // THIS NEED NOT BE FINAL. WHY?
    final int y = 1; // STILL FINAL IS ALLOWED HERE. WHY?
    public int getX(){
        return x;
    }
};

有人可以回答片段中提到的问题吗?

由于

3 个答案:

答案 0 :(得分:4)

{}的外部集声明了一个匿名子类

内部集声明了该子类中的初始化块。

通过以下示例,您可以更轻松地了解正在发生的事情:

List<String> strings = new ArrayList<String>() {{
    add("string");
    add("another string");
}};

你基本上说:我想要一个List的子类,它在初始化时调用方法add

它类似于:

List<String> strings = new ArrayList<String>();
strings.add("string");
strings.add("another string");

答案 1 :(得分:3)

A a = new A(){{
    final int x = 1; // IT HAS TO BE FINAL HERE. WHY?

It needn't.

两者之间的区别在于,在第一种情况下,您正在编写用于初始化双括号中每个对象的代码。 x是它的局部变量(与类A的对象没有任何关系。)

在第二种情况下,您将定义类主体。 x将是其成员变量。如果是static,则为其类变量。如果final a(基本上)不变。

答案 2 :(得分:1)

第一个实例A a = new A(){{...在声明中有一个初始化块。另一种写作方式是这样的:

A a = new A()
{
    {
        final int x = 1; // This is inside an initialisation block
    }        
};

更改格式使其更加明显。