最近重讀Java 編程思想,讀到有關實例化代碼塊兒 的內容,使我對於使用兩個大括號進行初始化有了更深的理解。
實例化代碼塊兒:
和靜態代碼塊兒的概念相對應,靜態代碼塊兒是static 關鍵字 + 大括號,把靜態代碼塊兒的static關鍵字去掉就是實例化代碼塊兒,靜態代碼塊兒在類初始化的時候執行一次
而實例化代碼塊兒在每次生成對象的時候都會執行(實例化代碼塊兒會先於構造方法執行)。
使用匿名內部類進行初始化:在new 一個對象的時候,小括號后邊跟一個大括號
使用匿名內部類 + 實例化代碼塊兒 = 使用兩個大括號進行初始化
例子如下:
package com.jiaoyiping.thinking; import java.util.ArrayList; import java.util.List; /* * Created with Intellij IDEA * USER: 焦一平 * Date: 2015/10/25 * Time: 10:41 * To change this template use File | Settings | File Template */ public class TestInstanceCodeBlock { public static void main(final String[] args) { //匿名內部類 Person person = new Person("張三"){ @Override public String getName() { return super.getName()+"123"; } }; System.out.println(person.getName()); //兩個大括號的方式初始化(本質上是匿名內部類 + 實例化代碼塊兒) List<String> personList = new ArrayList<String>(){{ add("AA"); add("BB"); add("CC"); }}; for (String s : personList){ System.out.println(s); } } } class Person{ String name; public Person(String name){ this.name = name; System.out.println("構造方法執行..."); } //實例化代碼塊兒,先於構造方法執行 { System.out.println("實例初始化..."); } public String getName(){ return name; } }