JAVA物件的例項化過程與多型的理解

2021-08-22 05:54:12 字數 1733 閱讀 5655

原博文在:

jvm--從jvm層面深入解析物件例項化、多型性實現機制  (

一. 雖然看不懂位元組碼及棧分析,但至少理解到了兩點

1. this相當於指標變數,唯讀指標

2. 物件例項化次序(可能是): 

2.1 this物件分配記憶體: 父類和當前類成員變數獲得記憶體, 父類方法載入,當前類方法載入,this變數賦值

2.2 如果有靜態成員: 父類靜態成員變數初始化,父類靜態方法可能被呼叫,

當前類靜態成員變數初始化, 當前類靜態方法可能被呼叫  

2.3 繼承自父類的成員變數初始化,呼叫繼承自父類的構造方法,當前類的成員變數初始化,呼叫當前類的構造方法

3. 由於成員方法是所有物件"公用"的, 所以每個物件的記憶體中, 應該只儲存了成員方法的入口位址(方法指標)

以下**引自前述博文

public class superclass 

public void setx(int x)

}public class subclass extends superclass

@override

public void setx(int x)

public void printx()

}

最後在main裡呼叫:

public class main 

}

答案是這樣的:

subx is assigned 99

subx = 1

二. 關於多型的理解

jvm--詳解虛擬機器位元組碼執行引擎之靜態鏈結、動態鏈結與分派

示例**引自上述博文, 略有改動

1. 物件的靜態型別與實際型別

物件變數宣告語句 定義的變數型別是其 "靜態型別" (有可能是父類 ), 在被強制向上轉型時的型別也是靜態型別

實際型別是由"建構函式"來決定的

例如 superclass objvar=new subclass()

objvar 的 靜態型別 是superclass, 實際型別是 subclass

2. 在過載函式呼叫時, objvar作為實參被傳入函式, 使用的是靜態型別, 也就是變數宣告時的型別

class human   

}class man extends human

} class woman extends human

} public class staticdispatch

// public void sayhello(man guy)

public void sayhello(woman guy)

public static void main(string args)

}

輸出結果: 

hello, guy!

hello, guy!

yes, man!

yes, woman!

3. 在以物件名來呼叫其成員函式時, 會使用其實際型別

class father   

} class child extends father

} public class singledoublepai

}

爸爸在吃飯

兒子在吃飯

Java物件例項化過程

jvm會讀取指定路徑下的class檔案,並載入進記憶體,並會先載入其父類 如果有直接的父類的情況下 在堆記憶體中開闢空間,分配位址。並在物件空間中,對物件中的屬性進行預設初始化。呼叫對應的建構函式進行初始化。在建構函式中,第一行會先呼叫父類中的建構函式進行初始化。父類初始化完畢後,再對子類的屬性進行...

物件例項化過程

1.首先分析一下記憶體空間 棧訪問速度比堆要快,僅次於直接位於cpu中的暫存器 2.物件例項化 1 首先,靜態 塊在載入時就執行了,所以肯定是最先執行的 2 對於非靜態 塊會在構造方法中的 塊之前載入 執行結果 static成員在載入位元組碼檔案到記憶體過程是會被優先執行,靜態成員變數會在方法區優先...

例項化物件的過程

在js中,物件的建立方式有許多種,new objec 字面量 建構函式等等,在es6中提供了採用class關鍵字來建立物件的方式,這些林林種種的寫法各有優劣,但是追根究底都是採用new object的方式來建立的。object是js的內建物件,也是所有物件的起源,那麼為什麼new乙個object得到...