瞭解靜態代碼塊,可以先抽幾分鐘時間看看連結
http://blog.csdn.net/androidbluetooth/article/details/6454135
先給個樣本程式
package it.mark;import java.util.HashMap;public class StaticDemo {public static HashMap<Integer, String> map;public StaticDemo() {System.out.println("construct StaticDemo-----");map = new HashMap<Integer, String>();map.put(1, "google");map.put(2, "baidu");map.put(3, "sina");// --------省略添加的 4~1113 項資料-----------map.put(1114, "souhu");map.put(1115, "git");map.put(1116, "svn");}}
map 是 StaticDemo 類的靜態成員
在 StaticDemo 的構造方法裡面對 map 進行了執行個體化。
其他類可以直接存取這個 StaticDemo 類的 map,或者建立 StaticDemo 對象再訪問 map
// 直接存取HashMap<Integer, String> map1 = StaticDemo.map;String value1 = map1.get(1);// 通過執行個體化類來訪問HashMap<Integer, String> map2 = new StaticDemo().map;String value2 = map2.get(2);
仔細看看這段代碼有甚麽問題。
從表面上看,沒有任何問題。但是看看 StaticDemo
構造方法,你就會發現
String value1 = map1.get(1);
執行的時候,會報null 指標異常的錯誤。
這是因為,map 對象根本沒有被執行個體化。
那麼,我們這樣試一試
// 通過執行個體化類來訪問HashMap<Integer, String> map2 = new StaticDemo().map;String value2 = map2.get(2);// 直接存取HashMap<Integer, String> map1 = StaticDemo.map;String value1 = map1.get(1);
運行是沒有錯誤的。
原因很簡單,在
// 通過執行個體化類來訪問HashMap<Integer, String> map2 = new StaticDemo().map;String value2 = map2.get(2);
調用了 StaticDemo 構造方法,從而樣本化了 map,那麼
// 直接存取HashMap<Integer, String> map1 = StaticDemo.map;String value1 = map1.get(1);
由於 map 是 static 的成員變數,已經被執行個體化,自然可以訪問到!
上面的一個例子,其實是我工作當中遇到一個 bug 的縮影。
回過頭來,我們可以想一想,在 StaticDemo
構造方法裡面做了下面幾件事情
1. 執行個體化 map
2. 為 map 對象添加資料(1000多條)
也就是說,我們每次 new StaticDemo
對象的時候,都要重複上面的事情。
但是,既然 map 是 static 的,為什麼不可以使用靜態代碼塊?
package it.mark;import java.util.HashMap;public class StaticDemo {public static HashMap<Integer, String> map;static {map = new HashMap<Integer, String>();map.put(1, "google");map.put(2, "baidu");map.put(3, "sina");// --------省略添加的 4~1113 項資料-----------map.put(1114, "souhu");map.put(1115, "git");map.put(1116, "svn");}}
這樣做的話,我們可以在其它地方隨心所欲的直接存取 map 對象。不用擔心 null pointer !
另一個關於 static 的 bug
http://blog.csdn.net/androidbluetooth/article/details/6823430