1. 程式人生 > >java中子類初始化流程(包括靜態區和非靜態區)

java中子類初始化流程(包括靜態區和非靜態區)

一. 類中的方法分為例項方法和類方法兩種,用static修飾的是類方法。二者有什麼區別呢?

例項方法:   

    當類的位元組碼檔案被載入到記憶體時,類的例項方法不會被分配入口地址,當該類建立物件後,類中的例項方法才分配入口地址,從而例項方法可以被類建立的任何物件呼叫執行。需要注意的是,當我們建立第一個物件時,類中的例項方法就分配了入口地址,當再建立物件時,不再分配入口地址,也就是說,方法的入口地址被所有的物件共享,當所有的物件都不存在時,方法的入口地址才被取消。

靜態方法(類方法):

    對於類中的類方法,在該類被載入到記憶體時,就分配了相應的入口地址。從而類方法不僅可以被類建立的任何物件呼叫執行,也可以直接通過類名呼叫。類方法的入口地址直到程式退出才被取消。 類方法在類的位元組碼載入到記憶體時就分配了入口地址,因此,java語言允許通過類名直接呼叫類方法,而例項方法不能通過類名呼叫。在講述類的時候我們強調過,在Java語言中,類中的類方法不可以操作例項變數,也不可以呼叫例項方法,這是因為在類建立物件之前,例項成員變數還沒有分配記憶體,而且例項方法也沒有入口地址。

總結:

1、方法宣告時,方法的型別前面不加關鍵字static的是例項方法,加static的是類方法即靜態方法。

2、例項方法既可以對類變數操作也可以對例項變數進行操作,而類方法(static  method)只能夠對類變數(static  varival)操作。

3、一個類中的方法可以互相呼叫,例項方法可以呼叫該類的其他方法,而類方法只能呼叫該類的類方法,不能呼叫例項方法。

4、類方法不能夠被重寫,但可以在子類重新定義他們。

5、例項方法中可以使用super、this關鍵字,類方法不可以。

二. 子類的初始化流程

採用new的方式,建立子類的例項,初始化順序如下:

初始化父類的靜態區(變數和方法)——> 子類的靜態區(變數和方法) ——> 父類的例項區(變數方法) ——> 父類建構函式

——> 子類的例項區(變數和方法) ——> 子類建構函式

如:以下圖片顯示,該圖片用的是processon做的,挺好用的,建議大家可以使用以下:https://www.processon.com/i/5757a23ae4b01a1f6f7cd2dd