直接上**1:
class parent
static
public static int a=1;
}class sub extends parent
}public class teststaticorder
}
這段**的執行結果是:
par類靜態塊執行
sub類靜態塊執行
1
再看**2
class parent
public static int a=1;
static
}class sub extends parent
}public class teststaticorder
}
這段**的執行結果是:
par類靜態塊執行
sub類靜態塊執行
2
其實**1和**2, 區別只是 靜態塊的**和定義靜態變數** 位置互換了一下.執行結果卻不一樣.
前提說明:在編譯生成的class檔案時,會自動產生兩個方法,乙個是類的初始化方法,另乙個是例項的初始化方法
方法在jvm第一次載入class檔案時呼叫(所以靜態塊只會執行一次),包括靜態塊的執行和靜態變數初始化.
方法 在例項建立時候呼叫, 就是生成物件的時候, 例如new ,反射等等
結論:1.虛擬機會保證在子類的方法執行之前,父類的方法已經執行完畢.(第乙個被執行的肯定是object類)
2.由於父類的方法先執行,所以父類的靜態塊等要優先於子類的操作
3.方法是由編譯器自動收集類中的所有類變數的賦值動作和靜態塊中的語句合併產生的.
編譯器收集的順序,是由語句在原始檔中出現的順序決定的.
靜態語句塊中只能訪問到定義在靜態語句塊之前的變數
定義在它之後的變數,在前面的靜態語句塊中可以賦值,但是不能訪問.(例如**1中靜態塊直接輸出a是會報錯的.)
4.介面中不能使用靜態語句塊,單仍然有變數初始化的賦值操作,因此介面也會生成方法.
但是與類不同的是,執行介面的方法不需要先執行父類介面的方法.
只有當父介面中定義的變數被使用時,父介面才會被初始化.
介面的實現類在初始化時也一樣不會執行介面的方法.
5.可以看到test()方法並沒有執行.static方法不在clinit的執行範圍內.可以說跟載入順序沒有任何關係.
關於樣式載入順序,js載入順序
對於大型 樣式表,js檔案有多個,這時載入順序有講究 以京東為例 對於js 先載入全域性配置,然後載入當前頁面配置 先載入base v1.js,再載入當前頁面配置 window.pageconfig 為啥要把pageconfig定義為乙個屬性,而不是單獨定義乙個變數,因為如果用乙個未定義的屬性時會i...
父子類以及static的載入順序
static可以被寫在變數和 塊上,此時該變數和 塊不屬於物件,而屬於類,會在jvm執行類載入機制時的準備階段就被賦值以及執行,而非static的變數和 塊在初始化階段才會被賦值並執行。因此如果問靜態方法能否呼叫非靜態變數,答案是不能,因為後者在前者執行時還沒有初始化。通過結果,可以看到父子類的初始...
關於類的靜態載入順序
關於類中靜態變數和靜態方法以及構造方法之類的載入順序問題現在成了面試中的基本問題,今天閒來無事,就寫一篇部落格來記述一下。package com.cn.bb public class testparentstatic private static string staticfield 父類靜態變數 ...