(3)多态的种类
1、 基类继承多态(Base Class Polymorphism)
2、 接口继承多态(Intece Polymorphism)
多态并不仅仅局限于传统的虚函数,接口的使用也体现出多态的应用。具体的区分要从设计模式的论域(problem space)的角度来进行区分。我在博客的《从设计模式看抽象类与接口的区别》和《深刻剖析经典面试题之三:关于虚函数》中都有具体的提到。
(4)多态的运行机制
所谓“绑定(binding)”,就是建立method call(函数调用)和method body(函数本体)的关联。如果绑定动作发生于程序执行前(由编译器和连接器完成),称为“先期绑定”。对于面向过程的语言它们没有其他选择,一定是先期绑定。比如C编译器只有一种method call,就是先期绑定。(C++有先期联编和后期联编)
当有多态的情况时,解决方法便是所谓的后期绑定(late binding):绑定动作将在执行期才根据对象型别而进行。后期绑定也被称为执行期绑定(run-time binding)或动态绑定(dynamic binding)。程序语言若想实现后期绑定,必须具备“得以在执行期判定对象型别”并“调用其相应之函数”的机制。也就是说,编译器仍然不知道对象的型别,但“method call”机制会找出正确的method body并加以调用。oop 多态oop 多态程序语言的后期绑定机制做法因人而异,但是你可以想象,必须有某种“型别信息”被置于对象内。
Java的所有函数,除了被声明为final者,都使用后期绑定。从表面上来理解,将函数声明为final型这样是为了防止他人覆写该函数。但是或许更重要的是,这么做可以“关闭”动态绑定。或者说,这么做便是告诉编译器:动态绑定是不需要的。于是编译器可以产生效率较佳的程序代码。这样说来,动态绑定(后期绑定)的效率不如先期绑定了。
这让我想起了我被面试官问的最惨的一次------他问我多态的运行机制,也就是说编译器是怎么识别不同的对象调用了不同类里的函数的。我以前并没仔细想过这个问题。然后面试官进一步暗示我说:“为什么我们有时候要把函数声明为final型的?”我答曰:“不想让别人覆写该函数。”面试官然后又不依不饶的追问道:“没有其他的原因了吗?”今天想来,怕是面试官追问的是:如果我们将函数声明为final后,就“关闭”了动态绑定,或许能得到较好的执行效率。但是《Java编程思想》又说了:“这样做并不会为你的程序带来整体效能的提升。所以最好是基于设计上的考量来决定是否使用final,而不要企图藉由它来改善性能。”真是学无止境啊,不将《Java编程思想》烂熟于心,只是找两本Java的教辅来看看的人怎么能应付面试官如此诡异的问题。我想不出意外,有天我也会成为PM级别以上的人,也会去面试新人。我想那时候我会以平常的心态去面对面试者,而不是卖弄自己的小聪明,给他人布下陷阱而显露出自己的高深。这也是我为什么要自己查资料翻阅书籍“剖析”“经典面试题”的原因,一方面是为了批判的继承这些面试题中的精华之处,将基础知识融会贯通。另一方面就是为了去批驳网上满天飞的面试题的不严谨的地方。
后记:对待一个问题我总希望能追寻到我能触及到的最深处,但是今天发现“昨天的认识”总是要比“今天的认识”肤浅,计算机技术博大精深,而我们绝大多数人却都只是在管中窥豹。今天想想,前几日的心态有点不太端正。我的总结应该是为了提高自己,而不是去征服别人。因为学无止境,今天总要比明天肤浅一些。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-26262-3.html
而俄是拳头外交
年利率1
很棒哦