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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
這個(gè)世界根本沒(méi)有什么面向?qū)ο螅?/div>

面向?qū)ο罂梢哉f(shuō)是各大語(yǔ)言一個(gè)重要的特性了,不過(guò)如果我們換個(gè)角度,在內(nèi)存中看看對(duì)象的布局,就會(huì)發(fā)現(xiàn)根本沒(méi)有什么面向?qū)ο?,只有面向過(guò)程。

成都創(chuàng)新互聯(lián)公司于2013年成立,先為蛟河等服務(wù)建站,蛟河等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為蛟河企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

讓我們從一個(gè)簡(jiǎn)單的Shape類開始,這個(gè)類有兩個(gè)字段int x, int y, 它們?cè)趦?nèi)存中是這么存放的:

非常容易理解,對(duì)吧?

再來(lái)看一下繼承, class Circle繼承了Shape,增加了一個(gè)字段radius, Circle對(duì)象在內(nèi)存中是這樣的:

這也沒(méi)什么大不了的,但是這里只是字段(x,y,radius), 如果Shape類有個(gè)方法:draw(),在內(nèi)存中該怎么放?

首先,不能把draw()方法都放在每個(gè)對(duì)象上,那樣就需要復(fù)制很多份,太浪費(fèi)了。

我們可以把這個(gè)draw()方法在內(nèi)存中生成一份, 然后在每個(gè)對(duì)象上增加一個(gè)指針,指向這個(gè)draw()方法就行了。

(三個(gè)Shape對(duì)象,都指向了同一個(gè)代碼)

但是這么做也有問(wèn)題, 如果Shape類又增加了一個(gè)方法 move() ,那每個(gè)對(duì)象都需要記錄move方法的指針:

如果方法很多,對(duì)象也很多,還是浪費(fèi)!

很明顯,我們需要一個(gè)中間層, 用這個(gè)中間層把所有函數(shù)指針都記下來(lái)。這個(gè)中間層就是所謂的虛函數(shù)表:

每個(gè)類,只要維持一個(gè)虛函數(shù)表就可以了。

每個(gè)對(duì)象,只要記錄一個(gè)虛函數(shù)表的地址就可以了。

當(dāng)然,也可以在虛函數(shù)表中記錄一些關(guān)于這個(gè)類的相關(guān)信息,不是本文的重點(diǎn),就不展開了。

為什么叫做虛函數(shù)表呢?這個(gè)概念可能是從C++中來(lái)的,在C++中有個(gè)關(guān)鍵字virtual ,修飾一個(gè)函數(shù)的時(shí)候,這個(gè)函數(shù)就會(huì)變?yōu)樘摵瘮?shù),在調(diào)用時(shí)就具備了多態(tài)的行為。(注:在Java中,一個(gè)類的函數(shù)默認(rèn)都是虛函數(shù))

那多態(tài)到底是怎么實(shí)現(xiàn)的呢?

非常簡(jiǎn)單,只要把虛函數(shù)表給設(shè)置好就行了。假設(shè)子類Circle 也定義了一個(gè)move 函數(shù),把父類Shape的move函數(shù)覆蓋了,在內(nèi)存將會(huì)是這個(gè)樣子:

當(dāng)你調(diào)用circle.draw()的時(shí)候,在虛函數(shù)表中找到的還是Shape類的draw()方法。

但是當(dāng)調(diào)用circle.move()的時(shí)候,就會(huì)從Circle類的虛函數(shù)表中找到Circle.move(),而不是Shape.move(),多態(tài)發(fā)生了!

仔細(xì)看看上面這張圖,在內(nèi)存中,三個(gè)方法和兩個(gè)對(duì)象是分開的,這里沒(méi)有Class的概念,多態(tài)是通過(guò)虛函數(shù)表實(shí)現(xiàn)的。如果我們寫程序的時(shí)候,寫下這樣的函數(shù)Shape_draw(), Shape_move(), Circle_move(),再寫下Shape和Circle這樣的數(shù)據(jù)結(jié)構(gòu),然后把他們用虛函數(shù)表連接到一起。也就實(shí)現(xiàn)了面向?qū)ο罅恕?/p>

在內(nèi)存中,“面向?qū)ο蟆币呀?jīng)褪去漂亮的包裝,退化成“面向過(guò)程”, 退化成那個(gè)最基本的公式:程序 = 數(shù)據(jù)結(jié)構(gòu) + 算法。

當(dāng)然,在絕大部分情況下,程序員不需要手工地去實(shí)現(xiàn)這個(gè)虛函數(shù)表,這件事情應(yīng)該交給機(jī)器去做。

對(duì)于C++,編譯器可以在編譯期間生成虛函數(shù)表。對(duì)于Java,編譯出的字節(jié)碼中是沒(méi)有的,只有invokevirtual這樣的指令,虛函數(shù)表是在類裝入虛擬機(jī)的時(shí)候創(chuàng)建的。


當(dāng)前名稱:這個(gè)世界根本沒(méi)有什么面向?qū)ο螅?
網(wǎng)頁(yè)路徑:http://m.5511xx.com/article/cddcgsc.html