日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
何時創(chuàng)建Java對象實(shí)例

Java對象實(shí)例何時被創(chuàng)建,這個問題也許你用一句話就能回答完了。但是它的潛在陷阱卻常常被人忽視,這個問題也許并不像你想的那么簡單,不信請你耐心看下去。

10年積累的成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有正定免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

我前幾天問一個同學(xué),是不是在調(diào)用構(gòu)造函數(shù)后,對象才被實(shí)例化?他不假思索的回答說是。

請看下面代碼:

 
 
 
  1. Date date=new Date();  
  2. em.out.println(date.getTime()); 

新手在剛接觸構(gòu)造函數(shù)這個概念的時候。他們常常得出這樣的結(jié)論:對象實(shí)例是在調(diào)用構(gòu)造函數(shù)后創(chuàng)建的。因?yàn)檎{(diào)用構(gòu)造函數(shù)后,調(diào)用引用(date)的實(shí)例方法便不會報(bào)NullPointerException的錯誤了。

一、經(jīng)驗(yàn)者的觀點(diǎn)

然而,稍稍有經(jīng)驗(yàn)的Java程序員便會發(fā)現(xiàn)上面的解釋并不正確。這點(diǎn)從構(gòu)造函數(shù)中我們可以調(diào)用this關(guān)鍵字可以看出。

請看下面代碼:

 
 
 
  1. public class Test  
  2. {  
  3. public Test()  
  4. {  
  5. this.DoSomething();  
  6. }  
  7. private void DoSomething()  
  8. {  
  9. System.out.println("do init");  
  10. }  
  11. }  

這段代碼中我們在構(gòu)造函數(shù)中已經(jīng)可以操作對象實(shí)例。這也就證明了構(gòu)造函數(shù)其實(shí)只是用于初始化,早在進(jìn)入構(gòu)造函數(shù)之前。對象實(shí)例便已經(jīng)被創(chuàng)建了。

二、父類構(gòu)造函數(shù)

當(dāng)創(chuàng)建一個有父類的子類的時候。對象的實(shí)例又是何時被創(chuàng)建的呢?我們也許接觸過下面經(jīng)典的代碼: 

 
 
 
  1. public class BaseClass  
  2. {  
  3. public BaseClass()  
  4. {  
  5. System.out.println("create base");  
  6. }  
  7. }  
  8. public class SubClass  
  9. {  
  10. public SubClass()  
  11. {  
  12. System.out.println("create sub");  
  13. }  
  14. public static void main(String[] args)  
  15. {  
  16. new SubClass();  
  17. }  

結(jié)果是先輸出create base,后輸出create sub。這個結(jié)果看起來和現(xiàn)實(shí)世界完全一致,先有老爸,再有兒子。因此我相信有很多程序員跟我一樣會認(rèn)為new SubClass()的過程是:實(shí)例化BaseClass->調(diào)用BaseClass構(gòu)造函數(shù)初始化->實(shí)例化SubClass->調(diào)用SubClass構(gòu)造函數(shù)初始化。然而非常不幸的是,這是個錯誤的觀點(diǎn)。

三、奇怪的代碼

以下代碼是為了駁斥上面提到的錯誤觀點(diǎn)。但是這種代碼其實(shí)在工作中甚少出現(xiàn)。 

 
 
 
  1. public class BaseClass  
  2.  
  3. {  
  4.  
  5. public BaseClass()  
  6.  
  7. {  
  8.  
  9. System.out.println("create base");  
  10.  
  11. init();  
  12.  
  13. }  
  14.  
  15. protected void init()  
  16. {  
  17. System.out.println("do init");  
  18. }  
  19. }  
  20. public class SubClass  
  21. {  
  22. public SubClass()  
  23. {  
  24. System.out.println("create sub");  
  25. }  
  26. @Override 
  27. protected void init()  
  28. {  
  29. assert this!=null;  
  30. System.out.println("now the working class is:"+this.getClass().getSimpleName());  
  31. System.out.println("in SubClass");  
  32. }  
  33. public static void main(String[] args)  
  34. {  
  35. new SubClass();  
  36. }  

這段代碼運(yùn)行的結(jié)果是先調(diào)用父類的構(gòu)造函數(shù),再調(diào)用子類的init()方法,再調(diào)用子類的構(gòu)造函數(shù)。

這是一段奇妙的代碼,子類的構(gòu)造函數(shù)居然不是子類第一個被執(zhí)行的方法。我們早已習(xí)慣于通過super方便的調(diào)用父類的方法,但是好像從沒這樣嘗試從父類調(diào)用子類的方法。

再次聲明,這只是個示例。是為了與您一起探討對象實(shí)例化的秘密。通過這個示例,我們再次印證了開頭的觀點(diǎn):早在構(gòu)造函數(shù)被調(diào)用之前,實(shí)例便已被創(chuàng)造。若該對象有父類,則早在父類的構(gòu)造函數(shù)被調(diào)用之前,實(shí)例也已被創(chuàng)造。這讓java顯得有些不面向?qū)ο?,原來老子兒子其?shí)是一塊兒出生的。

四、奇怪但危險(xiǎn)的代碼

本篇是對上篇奇怪代碼的延續(xù)。但是這段代碼更加具有疑惑性,理解不當(dāng)將會讓你出現(xiàn)致命失誤。

請看下面代碼:

 
 
 
  1. public class BaseClass {  
  2. public BaseClass()  
  3. {  
  4. System.out.println("create base");  
  5. init();  
  6. }  
  7. protected void init() {  
  8. System.out.println("in base init");  
  9. }  
  10. }  
  11. public class SubClass extends BaseClass{  
  12. int i=1024;  
  13. String s="13 leaf";  
  14. public SubClass()  
  15. {  
  16. System.out.println("create sub");  
  17. init();  
  18. }  
  19. @Override 
  20. protected void init() {  
  21. assert this!=null;  
  22. System.out.println("now the working class is:"+this.getClass().getSimpleName());  
  23. System.out.println("in SubClass");  
  24. /////////////great line/////////////////  
  25. System.out.println(i);  
  26. System.out.println(s);  
  27. }  
  28. public static void main(String[] args) {  
  29. new SubClass();  
  30. //oh!my god!!  
  31. }  
  32. }  

這段代碼相比上一篇,只是在子類中添加了一些成員變量。而我們的目標(biāo)正是集中在討論成員變量初始化的問題上。

這段代碼的執(zhí)行順序是:父類、子類實(shí)例化->調(diào)用父類構(gòu)造函數(shù)->調(diào)用子類init()方法->調(diào)用子類構(gòu)造函數(shù)->調(diào)用子類init()方法。最終的輸出結(jié)果向我們揭示了成員變量初始化的秘密。

當(dāng)父類構(gòu)造函數(shù)調(diào)用子類的init()方法的時候。子類的成員變量統(tǒng)統(tǒng)是空的,這個空是指的低級初始化。(值類型為0,布爾類型為false,引用類型為null)。而當(dāng)子類構(gòu)造函數(shù)調(diào)用init()方法的時候,成員變量才真正被初始化。這是一個危險(xiǎn)的訊息,那就是使用父類構(gòu)造函數(shù)調(diào)用子類時存在成員變量未初始化的風(fēng)險(xiǎn)。

我們的討論也到此為止了。再次回顧,總結(jié)一下實(shí)例何時被創(chuàng)建這個問題。我得出了以下結(jié)論:

本文到此便結(jié)束了。鑒于本人才疏學(xué)淺,若是專業(yè)術(shù)語有錯誤,或是哪里講的不對,也歡迎各位高手拍磚。

【編輯推薦】

  1. Java編程之四大名著
  2. 關(guān)于java數(shù)組的深度思考
  3. Java架構(gòu)設(shè)計(jì)和開發(fā)中的小技巧
  4. Java編程解析節(jié)省內(nèi)存效率高的方法

網(wǎng)頁名稱:何時創(chuàng)建Java對象實(shí)例
轉(zhuǎn)載源于:http://m.5511xx.com/article/dpceeii.html