欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

如何理解Java中OO程序執(zhí)行的順序

本篇文章為大家展示了如何理解Java中OO程序執(zhí)行的順序,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

成都創(chuàng)新互聯(lián)服務項目包括牡丹江網(wǎng)站建設、牡丹江網(wǎng)站制作、牡丹江網(wǎng)頁制作以及牡丹江網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,牡丹江網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到牡丹江省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!

在介紹Java的聲明和初始化的執(zhí)行順序之前,讓我們先來看兩個類:Base和Derived類。注意其中的whenAmISet成員變量,和方法preProcess()

public class Base  {      Base() {          preProcess();      }       void preProcess() {}  }
public class Derived extends Base  {     public String whenAmISet = "set when declared";      @Override void preProcess()     {         whenAmISet = "set in preProcess()";     }  }

如果我們構(gòu)造一個子類實例,那么,whenAmISet 的值會是什么呢?

public class Main  {     public static void main(String[] args)     {         Derived d = new Derived();         System.out.println( d.whenAmISet );     }  }

再續(xù)繼往下閱讀之前,請先給自己一些時間想一下上面的這段程序的輸出是什么?是的,這看起來的確相當簡單,甚至不需要編譯和運行上面的代碼,我們也應該知道其答案,那么,你覺得你知道答案嗎?你確定你的答案正確嗎?

很多人都會覺得那段程序的輸出應該是“set in preProcess()”,這是因為當子類Derived 的構(gòu)造函數(shù)被調(diào)用時,其會隱晦地調(diào)用其基類Base的構(gòu)造函數(shù)(通過super()函數(shù)),于是基類Base的構(gòu)造函數(shù)會調(diào)用preProcess() 函數(shù),因為這個類的實例是Derived的,而且在子類Derived中對這個函數(shù)使用了override關鍵字,所以,實際上調(diào)用到的是:Derived.preProcess(),而這個方法設置了whenAmISet 成員變量的值為:“set in preProcess()”。

當然,上面的結(jié)論是錯誤的。如果你編譯并運行這個程序,你會發(fā)現(xiàn),程序?qū)嶋H輸出的是“set when declared ”。怎么為這樣呢?難道是基類Base 的preProcess() 方法被調(diào)用啦?也不是!你可以在基類的preProcess中輸出點什么看看,你會發(fā)現(xiàn)程序運行時,Base.preProcess()并沒有被調(diào)用到(不然這對于Java所有的應用程序?qū)且粋€***災難性的Bug)。

雖然上面的結(jié)論是錯誤的,但推導過程是合理的,只是不完整,下面是整個運行的流程:

◆進入Derived 構(gòu)造函數(shù)。

◆Derived 成員變量的內(nèi)存被分配。

◆Base 構(gòu)造函數(shù)被隱含調(diào)用。

◆Base 構(gòu)造函數(shù)調(diào)用preProcess()。

◆Derived 的preProcess 設置whenAmISet 值為 “set in preProcess()”。

◆Derived 的成員變量初始化被調(diào)用。

◆執(zhí)行Derived 構(gòu)造函數(shù)體。

等一等,這怎么可能?在第6步,Derived 成員的初始化居然在 preProcess() 調(diào)用之后?是的,正是這樣,我們不能讓成員變量的聲明和初始化變成一個原子操作,雖然在Java中我們可以把其寫在一起,讓其看上去像是聲明和初始化一體。但這只是假象,我們的錯誤就在在我們把Java的聲明和初始化看成了一體。在C++的世界中,C++并不支持成員變量在聲明的時候進行初始化,其需要你在構(gòu)造函數(shù)中顯式的初始化其成員變量的值,看起來很土,但其實C++用心良苦。

在面向?qū)ο蟮氖澜缰校驗槌绦蛞詫ο蟮男问匠霈F(xiàn),導致了我們對程序執(zhí)行的順序霧里看花。所以,在面向?qū)ο蟮氖澜缰?,程序?zhí)行的順序相當?shù)闹匾?/p>

下面是對上面各個步驟的逐條解釋。

◆進入構(gòu)造函數(shù)。

◆為成員變量分配內(nèi)存。

◆除非你顯式地調(diào)用super(),否則Java 會在子類的構(gòu)造函數(shù)最前面偷偷地插入super() 。

◆調(diào)用父類構(gòu)造函數(shù)。

◆調(diào)用preProcess,因為被子類override,所以調(diào)用的是子類的。

◆于是,初始化發(fā)生在了preProcess()之后。這是因為,Java需要保證父類的初始化早于子類的成員初始化,否則,在子類中使用父類的成員變量就會出現(xiàn)問題。

◆正式執(zhí)行子類的構(gòu)造函數(shù)(當然這是一個空函數(shù),居然我們沒有聲明)。

上述內(nèi)容就是如何理解Java中OO程序執(zhí)行的順序,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當前名稱:如何理解Java中OO程序執(zhí)行的順序
分享網(wǎng)址:http://aaarwkj.com/article28/jjpejp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供標簽優(yōu)化、企業(yè)建站、網(wǎng)站設計公司虛擬主機、ChatGPT服務器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設
日韩黄色免费在线观看| 片子免费毛片日韩不卡一区| 国产亚洲黄片免费在线观看| 国产亚洲欧美日韩网站| 最新日韩人妻中文字幕一区| 91精品人妻互换一区二区| 婷婷91麻豆精品国产人妻| 91蜜臀在线视频播放| 午夜免费成人在线视频| 日本一区二区三区在线观看视频| 亚洲综合五月天色婷婷| 日韩国产在线一区二区| 日本 一区二区在线| 欧美人与性一区二区三区| 欧美大片免费久久精品| 日本乱码一区二区三区在线观看| 亚洲精品一区二区三区网站| 欧美国产日韩二区一区在线| 欧美激情中文字幕日韩精品| 亚洲免费av第一区第二区| 国产亚洲欧美成人精品久久| 自拍偷拍亚洲精品第一页| 视频一区二区中文字幕日韩| 亚洲国产精品高清久久| 国产av人妻精品一区二| 午夜福利福利一区二区| 中文字幕av日韩在线| 国产欧美又粗又猛又爽老| 熟女一区二区三区免费视频| 国产亚洲一区二区日韩欧美| 欧美一区二区精品网站| 五月婷婷亚洲激情综合网| 亚洲精品精品一区二区| 性欧美一区二区三区| 欧美日韩欧美日韩一区二区| 四影虎影永久免费观看 | 哪里可以看黄色片日韩| 91人妻人澡人人爽| 国产成年人拍拍免费视频| 久久国产精品99久久久| 亚乱熟女一区二区三区|