Java父子類載入順序

2021-09-20 01:37:35 字數 1157 閱讀 3566

先上桌結論:

父類靜態屬性(成員變數) > 父類靜態**塊 > 子類靜態屬性 > 子類靜態**塊 > 父類非靜態屬性 > 父類非靜態**塊 > 父類構造器 > 子類非靜態屬性 > 子類非靜態**塊 > 子類構造器

這麼長怎麼記呀?!

靜態屬性和**塊,當且僅當該類在程式中第一次被 new 或者第一次被類載入器呼叫時才會觸發(不考慮永久代的**)。也正是因為上述原因,類優先於物件載入/new,即靜態優先於非靜態

屬性(成員變數)優先於構造方法,可以這麼理解,載入這整個類,需要先知道類具有哪些屬性,並且這些屬性初始化完畢之後,這個類的物件才算是完整的。另外,非靜態**塊其實就是物件 new 的準備工作之一,算是乙個不接受任何外來引數的構造方法。因此,屬性 > 非靜態**塊 > 構造方法

有趣的是,靜態部分(前4個)是父類 > 子類,而非靜態部分(後6個)也是父類 > 子類

另外容易忽略的是,非靜態**塊在每次 new 物件時都會執行,可以理解:非靜態**塊是正式構造方法前的準備工作(非靜態**塊 > 構造方法)。

/**

* @author lean.li

* @date 2018/10/15

*/public class main

public a()

}static class b extends a

public b()

}static class hi

}public static void main(string args)

}

執行結果如下:

初次 new b:

hi a

a static

hi b

b static

hi a2

aaaa init

hi b2

bbbb init

第二次 new b:

hi a2

aaaa init

hi b2

bbbb init

父子類以及static的載入順序

static可以被寫在變數和 塊上,此時該變數和 塊不屬於物件,而屬於類,會在jvm執行類載入機制時的準備階段就被賦值以及執行,而非static的變數和 塊在初始化階段才會被賦值並執行。因此如果問靜態方法能否呼叫非靜態變數,答案是不能,因為後者在前者執行時還沒有初始化。通過結果,可以看到父子類的初始...

Java面試之父子類(3) 構造方法順序

在檢視答案之前,先猜測一下正確答案吧!package com.company class parentclass public parentclass string name static public class subclass extends parentclass public subcla...

Java中父類和子類載入順序

最近在總結一些和jvm相關的知識,現在總結一下關於父類和子類載入順序的問題。簡而言之就是先靜態後非靜態,先父類後子類,具體順序如下 父類靜態變數 父類靜態 塊 若有多個按 先後順序執行 子類靜態變數 子類靜態 塊 若有多個按 先後順序執行 父類非靜態變數 父類非靜態 塊 若有多個按 先後順序執行 父...