继承,多态,重载

数据抽象,继承,多态,重载等是面向对象的四大特征。

     数据抽象解决人们不要受限于机器,而是把思考问题的方式直接面向了问题本身,

     继承:继承主要用来解决什么问题的呢?面向对象编程为什么要有继承这个重要的特性呢?如果情形是这样的:在创建了一个类之后,即使另一个新类与具有相似的功能,你还是得重新创建一个新类。如果我们能够以现有的类为基础,复制它,然后通过添加和修改这个新类就好多了。通过继承便可以达到这样的效果

     多态:在处理类型的层次结构时,经常想把一个对象不当作它所属的特定类型来对待,而是将其当作其基类的对象来对待。这使得人们可以编写出不依赖特定类型的代码。在“几何形”的例子中,方法操作的都是泛化的形状。而不关心它们是圆形、正方形、三角形还是其他什么尚未定义的形状、所有的几何形状都可以被绘制、擦除和移动,所以这些方法都是直接对一个几何形对象发送消息;它们不用担心对象将如何处理消息。这样的代码是不会受添加新类型影响的,而且添加新类型是扩展一个面向对象程序以便处理新情况的最常用的方式。例如,可以从“几何形”中导出一个新的子类型“五角形”,而并不需要修改处理泛化几何形状的方法。通过导出新的子类型而轻松拓展设计的能力是对改动进行封装的基本方式之一。但是,在试图将导出类型的对象当作其泛化基类对象来看待时,仍然存在一个问题。如果某个方法要让泛化几何形状绘制自己,那么编译器在编译时是不可能知道应该执行哪一段代码的。这就是关键所在:当发送这样的消息时,程序员并不想知道哪一段代码将被执行;

     这个问题的答案,也是面向程序设计的最重要的妙诀:编译器不可能产生传统意义上的函数调用。一个非面向对象编程的编译器产生的函数调用会引起所谓的前期绑定,这么做意味着编译器将产生对一个具体函数名字的调用,而运行时将这个调用解析到将要被执行的代码的绝对地址。然而在OOP中,程序直到运行时才能够确定代码的地址,所以当消息发送到一个泛化对象时,必须采用其他的机制。为了解决这个问题,面向对象程序设计语言使用了后期绑定的概念。当向对象发送消息时,被调用的代码直到运行时才能确定。编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查,但是并不知道将被执行的确切代码

      为了执行后期绑定,java使用一小段特殊的代码来替代绝对地址调用。这段代码使用在对象存储的信息来计算方法体的地址。这样,根据这一小段代码的内容,每一个对象都可以具有不同的行为表现。当向一个对象发送消息,该对象就能够知道对这条消息应该做些什么

参考资料:《Java编程思想第四版》,《深入Java虚拟机》

原文地址:https://www.cnblogs.com/jasonteststudy/p/2123617.html