關於java的類例項化的先後順序

2021-08-20 10:31:15 字數 1219 閱讀 9201

最近有同事在部署乙個舊系統的時候遇到問題,在本地部署是沒事的,但一到正式線上伺服器就報錯。報錯的大概意思就是某個類裡面的乙個靜態變數為空導致出現空指標異常。為了幫忙解決這個問題,我再詳細地深入**,然後模擬實際情況建立如下類:

1.定義了乙個載入配置檔案的類test1,使用spring註解@service來例項化這個類。

2.定義了乙個final的工具類test2,然後在這個類裡面新增靜態變數型別為test1的test1。使用spring註解@service來例項化這個類。

3.定義乙個需要獲取test2裡面的靜態方法類test3,test3裡面有靜態變數需要通過test2的靜態方法賦值。使用spring註解@service來例項化這個類。

好了,編譯執行之後問題重現如下錯誤nullpointerexception:

那麼要如何解決這個問題呢?這裡首先要解決思路一定要清晰,從問題報錯的地方入手,明顯是靜態變數沒有賦值,那麼為什麼沒有賦值呢?明顯的跟類載入的首先順序有關,也就是說類的靜態變數會優先執行初始化賦值,但這個時候test2尚未例項化。那麼如何解決呢?這裡我提供一種解決辦法,就是通過init方法給靜態變數賦值,如下:

先猜猜執行結果會怎樣,下面將上圖:

從結果來看解決了空指標的問題,讓我們來總結一下:

1.類的靜態變數,靜態**塊和靜態方法等會優先初始化。注意靜態**塊是會有類的構造方法之前執行。

2.如果要把乙個bean例項化並賦值給乙個靜態變數,需要使用init方法初始化並賦值。

3.乙個類裡面的靜態變數或者靜態**塊的執行先後順序是根據在類裡面定義的順序,跟有沒有final等沒有關係。

java類例項化執行先後順序

1 父類的靜態成員 靜態方法塊 2 子類中的靜態成員 靜態方法塊 3 父類中的成員變數 方法塊 5 父類建構函式 4 子類中的成員變數 方法塊 6 子類建構函式 例項 public class a static int id f2 static int f2 public a static void...

Java類的例項化順序

類的例項化順序,比如父類靜態資料,建構函式,字段,子類靜態資料,建構函式,字段,他們的執行順序 先靜態 先父後子 先靜態 父靜態 子靜態 優先順序 父類 子類 靜態 塊 非靜態 塊 建構函式 乙個類的例項化過程 1,父類中的static 塊,子類的static 2,順序執行父類的普通 塊 3,父類的...

java 子類例項化後子類 父類各語句執行順序

解決問題 子類例項化後子類 父類語句誰先執行?條件 父類 子類各有屬性string型別的name 子類重寫父類printinfo 方法 實現 class animal public void printinfo public class t extends animal public static ...