对于Java中新建一个对象,大家可能再熟悉不过了,如:
class="java">public class Person { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } public String aaa() { return "AAA"; } public static void main(String[] args) { Person p = new Person(); p.setName("123"); System.out.println(p.getName()); } }
?上面的main方法中的 新建对象方式,对于每个Javaer来说,都不应该有任何疑问。
但是,今天在看Struts2源码时,遇到了以下的代码:
protected List<String> extensions = new ArrayList<String>() {{ add("action"); add(""); }};
?一开始还楞了一下,怀疑这代码能运行么?
因为这跟我以前声明list的方式不一样,相比之前,我们一般都是如下来声明并初始化list的:
protected List<String> extensions = new ArrayList<String>(); extensions.add("action"); extensions.add("");
?
然后我就脑洞开了一下,既然List可以这么来写,那么其他类是不是也可以这么搞呢?
就拿本文开头的Person类来举例吧,我发现如下这样声明也是可以的:
public class Person { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } public String aaa() { return "AAA"; } public static void main(String[] args) { Person p = new Person() { { setName("123"); } public String aaa() { return "aaa"; } public String bbb() { return "bbb"; } }; System.out.println(p.name); System.out.println(p.aaa()); } }
?这样看起来感觉 很怪,但是它是可以运行的,而且它的运行结果是:
123 aaa
也就是 Person类中定义的aaa()方法被 p 实例中的aaa()给覆盖了。
?
现象比较好玩,但是不知道这是什么语法,还请有识者指点一下。