日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
這個世界根本沒有什么面向對象!

面向對象可以說是各大語言一個重要的特性了,不過如果我們換個角度,在內(nèi)存中看看對象的布局,就會發(fā)現(xiàn)根本沒有什么面向對象,只有面向過程。

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

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

非常容易理解,對吧?

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

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

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

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

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

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

如果方法很多,對象也很多,還是浪費!

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

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

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

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

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

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

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

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

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

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

在內(nèi)存中,“面向對象”已經(jīng)褪去漂亮的包裝,退化成“面向過程”, 退化成那個最基本的公式:程序 = 數(shù)據(jù)結構 + 算法。

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

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


新聞標題:這個世界根本沒有什么面向對象!
文章源于:http://www.dlmjj.cn/article/cddcgsc.html