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;
}
};
有人可以回答片段中提到的问题吗?
由于
答案 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?
两者之间的区别在于,在第一种情况下,您正在编写用于初始化双括号中每个对象的代码。 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
}
};
更改格式使其更加明显。