这是什么构造的呼叫与以下双括号?
-
11-09-2019 - |
题
不幸的是我没有编码的Java约五年来,我绝对不能记得是怎么或者为什么以下代码的工作。
我偶然发现了一个类似的例子,并打破了下来。强调的是部分下面的评论:我不会构造符号之后通过的框在双方括号内。不幸的是我找不到任何东西在Java文件或通过使用谷歌(什么词(s)应当我谷歌?).
package syntaxtest;
public class Main {
public static void main(String[] args) {
// What kind of notation is this?
MyTest tester = new MyTest() {{
setName("John Johnson");
}};
System.out.println(tester.getName());
}
}
class MyTest {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这是我的问题:
- 这是怎么记号法/法叫什么?
- 在那里可以我读了一些文档?
我猜/希望我能回答第二个问题通过自己,如果有人能向我提供的回答第一个问题。
要清楚:我知道的输出 John Johnson
;)但是我不知道为什么它的工作。
解决方案
这是被称为 双撑初始化:
第一支具创建一个新的 AnonymousInnerClass,第二 声明的一个实例,初始化块 时运行的匿名内部 类实例化。这种类型的 初始化框正式称为 一个"实例的初始值",因为它 声明的内实例的范围 类--"静态的初始值" 是一个相关的概念在那里 关键字的静态之前放置的 撑开始的方框,以及哪 执行类级别以很快 作为这类装入器装载完成了 类(在指定 http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.6) 初始化块可以使用任何 方法、领域和最终变量 提供包含的范围,但是 一个具有警惕的事实, 初始运行之前 构造方法。
这仅仅适用于非最终 课程,因为它创建了一个 匿名的子类。
其他提示
让我们的布局的代码有点不同:
MyTest tester = new MyTest() {
{
setName("John Johnson");
}
};
什么你在这里看到的是被称为 双撑初始化.你有一个匿名内部的子类 MyTest
, ,随着初始化块,这是一块包含的代码时运行,对象是构成。
通常,你会把这样的代码,在构造,但是由于匿名的内部类不可能具有的构造,这是唯一的方法,以保证码是运行时,它应该。
有的说,这是一个有点丑陋做到这一点。有更好的方法。但是,我使用它自己的场合,通常在以下成语,以创建一个不可改变地图:
final Map<String, Integer> textToInt = Collections.unmodifiableMap(new HashMap<String, Integer>() {{
put("one", 1);
put("two", 2);
// etc
}});
它创建了一个新的地图,将复盖它,增加了一些值在初块,它包装在一个不可修改的地图。
MyTest tester = new MyTest() {{
setName("John Johnson");
}};
是一样的
MyTest tester = new MyTest();
tester.setName("John Johnson");