關于這個問題,全局變量(成員變量)是在創建對象的時候分配內存的創建對象過程為1分配空間2遞歸的創建父類對象(無父類這步可省略)3初始化成員變量4調用構造方法創建一個對象靜態變量是在類加載的時候分配空間的,靜態變量和對象沒有關系是在JVM第一次讀到一個類的時候加載信息的過程中分配空間的類加載過程為1加載父類(如果父類已經加載過,則不在加載)2初始化靜態屬性3按順序的初始化靜態代碼塊初始化的前提就是分配空間而且靜態變量在以后的創建對象的時候不在初始化所以一般用靜態來保存共享信息
創新互聯建站擁有網站維護技術和項目管理團隊,建立的售前、實施和售后服務體系,為客戶提供定制化的網站建設、網站制作、網站維護、遂寧服務器托管解決方案。為客戶網站安全和日常運維提供整體管家式外包優質服務。我們的網站維護服務覆蓋集團企業、上市公司、外企網站、成都商城網站開發、政府網站等各類型客戶群體,為全球上1000家企業提供全方位網站維護、服務器維護解決方案。
1.父類靜態代碼塊;
2.子類靜態代碼塊;
3.父類非靜態代碼塊;
4.父類構造函數;
5.子類非靜態代碼塊;
6.子類構造函數;
舉例:
public class ExA {
static {
System.out.println("父類靜態代碼塊。");
}
public ExA() {
System.out.println("父類構造函數。");
}
{
System.out.println("父類非靜態代碼塊。");
}
public static void main(String[] args) {
new ExB();
}
}
class ExB extends ExA {
static {
System.out.println("子類靜態代碼塊。");
}
{
System.out.println("子類非靜態代碼塊。");
}
public ExB() {
System.out.println("子類構造函數。");
}
}
執行結果:父類靜態代碼塊。子類靜態代碼塊。父類非靜態代碼塊。父類構造函數。子類非靜態代碼塊。子類構造函數。
先說執行順序:我們在new一個對象時,如果類還沒加載,就需要先將類加載到內存,此時就會執行靜態代碼塊,在創建對象時,是先執行代碼塊,然后執行構造器。所以靜態代碼塊、代碼塊、構造器的執行順序是:靜態代碼塊→代碼塊→構造器。
再說作用:靜態代碼塊是用于初始化類的(在加載類時執行,只執行一次),代碼塊是用于初始化對象的(在創建對象時執行,每次創建對象時都執行),構造器是用于創建對象的。
原因就是一句話:先有了父親,才會有兒子!
程序運行時,加載AB兩類,因為A是B子類,所以先加載B類,Load B,再加在A類 LoadA,調用A a = new A()代碼時,會先調用其父類B的構造方法 Create B 再調用A的構造方法 Create A