原博文在:
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得到...