java 基礎:static 與構造方法

來源:互聯網
上載者:User

瞭解靜態代碼塊,可以先抽幾分鐘時間看看連結

 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














聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.