示例代码
public class Test {
private static List<String> list = new ArrayList<String>() { // 第一个花括号表示匿名内部类
{ // 第二花括号表示匿名内部类的构造代码块,可以有多个。构造代码块在构造函数前执行,匿名内部类的构造代码块在调用父类同参构造函数后执行
this.add("A");
this.add("B");
add("C");
add("D");
}
{ // 匿名内部类的构造代码块
this.add("E");
add("F");
}
};
public static void main(String[] args) {
System.out.println(list);
}
}
缺点
- 使用匿名内部类,会有效率上的损失。当然在大多数情况下,这点效率都是可接受的。
- 静态内部类持有所在外部类的引用。如果需要将 List 返回给到其他地方使用,可能造成内存泄漏。
等价于
public class MyList extends ArrayList {
{
this.add("A");
this.add("B");
add("C");
add("D");
}
}
public class Test {
public static void main(String[] args) {
System.out.println(new MyList());
}
}
Java的四种代码块
用{}括起来的称为代码块:
- 普通代码块:类中方法的方法体。
- 构造代码块:类中{}直接括起来的语句,每次创建对象都会被调用,先于构造函数执行。
- 静态代码块:类中static{}括起来的语句,只执行一次,先于构造代码块块执行。
- 同步代码块:类中synchronized(){}括起来的语句,多线程环境下互斥执行。
替代方式
public class Test2 {
private static List<String> list = new ArrayList<String>();
static {
list.add("A");
list.add("B");
list.add("C");
list.add("D");
}
public static void main(String[] args) {
System.out.println(list);
}
}