成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

這個世界根本沒有什么面向對象!

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

 [[281872]]

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

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

 

非常容易理解,對吧?

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

 

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

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

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

 

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

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

 

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

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

 

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

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

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

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

那多態到底是怎么實現的呢?

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

 

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

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

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

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

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

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

 

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2012-02-09 14:02:35

JavaScript

2023-01-10 09:38:09

面向對象系統

2025-03-13 10:31:20

DeepSeek開源EPLB

2020-08-17 08:39:36

API監控

2010-02-04 16:44:14

Ubuntu Mono

2020-11-04 10:33:19

數據

2015-09-24 09:04:36

程序員

2011-07-05 16:15:49

面向對象

2011-06-21 16:38:34

SEO

2010-03-03 17:01:27

Linux Ubunt

2020-07-09 15:20:16

代碼開發GitHub

2021-04-06 15:23:28

機器人人工智能系統

2019-10-15 08:40:29

軟件通訊錄相冊權限

2014-11-04 10:57:42

移動優先

2017-07-27 08:56:59

javascriptJavaWeb

2019-09-24 10:17:14

2020-02-16 11:25:22

物聯網硬件技術

2019-11-20 15:51:55

網絡保險網絡攻擊安全

2021-02-19 09:45:50

Python面向對象代碼

2021-03-04 13:25:22

Python面向對象代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品国产乱码久久久久久a丨 | 免费黄色在线观看 | 久久久久久亚洲精品 | 亚洲国产成人精品女人久久久 | 污污免费网站 | 在线一区二区三区 | 日韩另类视频 | 亚洲国产精品成人久久久 | 亚洲一级淫片 | 国产午夜精品福利 | 国产精彩视频在线观看 | 欧美综合久久 | 成人在线中文 | 欧美一二精品 | 成人黄在线观看 | 亚洲免费人成在线视频观看 | 亚洲国产精品一区二区久久 | www.亚洲国产精品 | 久久久久久网站 | 欧美中文字幕一区二区三区亚洲 | 亚洲经典一区 | 黄色在线观看网站 | av在线一区二区三区 | 亚洲人成人一区二区在线观看 | 精品国产不卡一区二区三区 | 美女日批免费视频 | 男女羞羞视频在线 | 国产高清视频一区二区 | 成人在线国产 | 美女国内精品自产拍在线播放 | 国产精品久久久久久久久久免费看 | 久久久一区二区 | 色狠狠桃花综合 | 午夜精品影院 | 日日爽 | 日日噜噜噜夜夜爽爽狠狠视频, | 中文字幕在线观看第一页 | 欧美精品二区 | 国产精品美女久久久久aⅴ国产馆 | 亚洲免费高清 | 日韩精品一区二区三区中文在线 |