日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java 父类子类的对象初始化过程

發(fā)布時(shí)間:2023/12/3 java 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 父类子类的对象初始化过程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載自?Java 父類子類的對(duì)象初始化過程

摘要: Java基本的對(duì)象初始化過程,子類的初始化,以及涉及到父類和子類的轉(zhuǎn)化時(shí)可能引起混亂的情況。

1. 基本初始化過程:

對(duì)于一個(gè)簡(jiǎn)單類的初始化過程是:

????static 修飾的模塊(static變量和static 塊) ?---> 按照代碼順序依次執(zhí)行。

????????|

????實(shí)例變量 ?及非static模塊---> 按照代碼順序依次執(zhí)行。

????????|

????構(gòu)造函數(shù) ---> 執(zhí)行對(duì)應(yīng)的構(gòu)造函數(shù)。

子類的初始化過程。

????父類static修飾的模塊

????????|

????子類static修飾模塊

????????|

????父類實(shí)例變量和非static塊

????????|

????父類對(duì)應(yīng)構(gòu)造函數(shù)。當(dāng)子類對(duì)應(yīng)構(gòu)造函數(shù)中沒有顯示調(diào)用時(shí)調(diào)用的是父類默認(rèn)的構(gòu)造函數(shù)。

????????|

????子類實(shí)例變量和非static塊

????????|

????子類構(gòu)造函數(shù)


Class的static模塊是唯一的,所以只初始化一次。所有類的實(shí)例公用Class的static模塊。

static模塊的初始化條件: ( From: 引用1 )

????(1)遇到new、getstatic、putstatic 或 invokestatic這4條字節(jié)碼指令時(shí),如果類還沒初始化,則觸發(fā)初始化。對(duì)應(yīng)場(chǎng)景是:new實(shí)例化對(duì)象時(shí)、讀或設(shè)置一個(gè)靜態(tài)字段時(shí)(被final修飾,已在編譯器把結(jié)果放入常量池的靜態(tài)字段除外),以及調(diào)用一個(gè)類的靜態(tài)方法時(shí)

????(2)對(duì)類進(jìn)行反射調(diào)用時(shí)

????(3)初始化子類。但父類還沒有初始化時(shí),先觸發(fā)父類初始化

????(4)當(dāng)虛擬機(jī)啟動(dòng)時(shí),需指定一個(gè)需要執(zhí)行的主類(包含main方法),虛擬機(jī)會(huì)先初始化該類



2. 關(guān)于覆蓋和隱藏

????覆蓋:被覆蓋的方法相當(dāng)于被擦除了,不可恢復(fù)(即使類型強(qiáng)制轉(zhuǎn)換也無法調(diào)用)。

????隱藏:一直保存的某個(gè)位置,等需要的時(shí)候可以繼續(xù)使用(類型強(qiáng)制轉(zhuǎn)換后可以調(diào)用)。

關(guān)于父類子類之間的覆蓋和隱藏關(guān)系: (From :引用2)

????1. 父類的實(shí)例變量和類變量能被子類的同名變量隱藏。?

????2. 父類的靜態(tài)方法被子類的同名靜態(tài)方法隱藏,父類的實(shí)例方法被子類的同名實(shí)例方法覆蓋。?

????3. 不能用子類的靜態(tài)方法隱藏父類的實(shí)例方法,也不能用子類的實(shí)例方法覆蓋父類的靜態(tài)方法,否則編譯器會(huì)異常。?

????4. 用final關(guān)鍵字修飾的最終方法不能被覆蓋。?

????5. 變量只能被隱藏不會(huì)被覆蓋,子類的實(shí)例變量可以隱藏父類的類變量,子類的類變量也可以隱藏父類的實(shí)例變量。?


涉及的典型情況:

前提:

-----------------------------------------

class B extends A{……}

-----------------------------------------

(1) B instanceB = new B();

instanceB的初始化過程如第一部分中:子類的初始化過程。

此時(shí)instanceB中實(shí)際上有一個(gè)super的全部信息(除了父類中被覆蓋的實(shí)例方法),但是當(dāng)前的引用是子類的信息(如果子類中沒有的變量和方法則是從父類繼承來)。


(2)A instanceA = new B();

此時(shí)父類A的變量和靜態(tài)方法會(huì)將子類的變量和靜態(tài)方法隱藏。instanceA此時(shí)唯一可能調(diào)用的子類B的地方就是子類B中覆蓋了父類A中的實(shí)例方法。

執(zhí)行 B instanceB = (B) instanceA; 后

此時(shí)instanceB相當(dāng)于 B instanceB = new B();


注意:

? ? (1) 這里唯一的覆蓋的情況:父類的實(shí)例方法被子類的同名實(shí)例方法覆蓋。

????這里方法調(diào)用變量時(shí),實(shí)際上是帶有一個(gè)默認(rèn)的this的。也就是此實(shí)例方法中調(diào)用的是當(dāng)前Class的值。涉及到繼承的情況時(shí),要十分注意super,this的情況。

????(2) 在初始化的時(shí)候,有兩個(gè)階段。第一步是申請(qǐng)空間,第二步是賦值。

????具體見:

????????static的值和final static值在初始化時(shí)的區(qū)別。(引用1)

????????子類覆蓋父類實(shí)例方法時(shí),調(diào)用子類的實(shí)例方法,而此時(shí)子類的實(shí)例方法調(diào)用了子類中的變量(此時(shí)static變量已經(jīng)初始化,但是實(shí)例變量并沒有初始化)。(引用2)


這段代碼來自引用2,如何精煉,如此有趣。值得一看。

class Parent{int x=10;public Parent(){add(2);}void add(int y){x+=y;}}class Child extends Parent{int x=9;void add(int y){x+=y;}public static void main(String[] args){Parent p=new Child();System.out.println(p.x);} }


引用 1. 類加載機(jī)制:

http://blog.csdn.net/kai_wei_zhang/article/details/8234146?

引用 2. 隱藏和覆蓋,以及一個(gè)好例子:

http://www.cnblogs.com/binjoo/articles/1585342.html

引用 3. 隱藏和覆蓋

http://renyanwei.iteye.com/blog/258304?

引用 4. 基本的初始化過程

http://www.cnblogs.com/miniwiki/archive/2011/03/25/1995615.html?


總結(jié)

以上是生活随笔為你收集整理的Java 父类子类的对象初始化过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。