|
|
|
|
移动端
创建专栏

这个世界根本没有什么面向对象!

本文来源:http://www.2233122.com/sports_cctv_com/

太阳城娱乐网最快登入,据她介绍,自己买中交长盈天地商铺除了觉得这个楼盘位置好、租金便宜外,主要看重楼盘开发商是中交地产这个品牌。对于玩家来说,游戏主机市场急需一次变革。现神舟京东热促仅4999元。  购机时提及PConline太平洋电脑网将会获取更好的服务或优惠。

它配备了一款炫红色的背光键盘,键盘中带有红色光环的“WASD”四枚按键酷现指尖,在你进行游戏时可以享有更专业、更炫酷的游戏体验!购机即送好礼全新游匣Firelord系列重点推出了14与15两种尺寸机型。当酒店遇到瓶颈,开始有了Airbnb,大家一起分享房间;因为交通资源的的低效应用,开始催生了载车领域的分享经济。像以前一辆10万块钱,车的成本是一部分,剩下的一部分是销售渠道的成本和做市场营销的成本,但是我们就会把这两块去节约下来。超融合架构能够让云基础架构平台与企业应用软件、中间件及数据库软件得以完全解耦,并可通过统一平台进行管理,从而提高了企业IT基础设施运维管理的效率。

拥有音乐平台账号即可享受音乐服务。以下为文章概要:Fitbit的活力正在下降。  独立学院的办学历史比较短,选择要看母体学校是否强大,985母体学校的独立学院得到的支持往往比较强,比如南京大学金陵学院、四川大学锦城学院等。王用生期待双方在更多重点领域展开合作,开启全面、深入、紧密的合作新篇章。

面向对象可以说是各大语言一个重要的特性了,不过如果我们换个角度,在内存中看看对象的布局,就会发现根本没有什么面向对象,只有面向过程。

作者:刘欣|2019-11-11 10:48

 

面向对象可以说是各大语言一个重要的特性了,不过如果我们换个角度,在内存中看看对象的布局,就会发现根本没有什么面向对象,只有面向过程。

让我们从一个简单的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这样的指令,虚函数表是在类装入虚拟机的时候创建的。

【编辑推荐】

  1. 太阳城娱乐网最快登入面向Google编程的Copy&Paste程序员要小心了!
  2. 过去50年间,十大热门语言及发明者大盘点
  3. 扒一扒编程语言排行榜
  4. 最近程序员频繁被抓,如何避免面向监狱编程?!
  5. Go语言出现后,Java还是最佳选择吗?
【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢
菲律宾申博开户网址 www.60705.com 申博会员登录 申博太阳城娱乐中心直营网 申博娱乐网址 申博苹果手机下载登入
申博安卓手机下载 www.88tyc.com 申博登录网址 申博现金网直营网 申博游戏登录直营网 www.666msa.com
太阳城亚洲登入 www.999sun.com 菲律宾申博太阳城娱乐 菲律宾申博直营网 申博现金网登入 申博登录不了