1.抽象:
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。
抽象包括两个方面,一是过程抽象,二是数据抽象。
过程抽象:忽略任务具体完成的过程,只精确描述该任务所要完成的功能
数据抽象:利用数学结构(如集合、关系、函数、序列等)进行功能性描述,而不关心这些抽象数学结构在计算机中是如何具体表示和实现的
用更加形象的话来说:
数据抽象就是针对对象的属性,比如建立一个鸟这样的类,鸟会有以下特征,两个翅膀,两支脚,有羽毛等等特性,写成类都是鸟的属性
过程抽象就是针对对象的行为特征,比如鸟会飞,会跳等等,这些方面的就会抽象为方法,即过程,写成类都是鸟的方法
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
其中对多态性更进步一的理解:
1.面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态 而准备的。
2.多态的定义:指允许不同类的对象对同一消息作出响应。即同一消息可以根据发送对象的不同而采用多种不同
的行为方式。
3.实现多态的技术成为:动态绑定(dynamic binding ),是指在执行期间判断所引用对象的实际类型,根据其实际的类型
调用其相应的方法。
在这之前,先理解父类引用执指向子类对象
要理解多态性,首先要知道什么事“向上转型”。
我定义了一个子类cat ,它继承了Animal类,那么后者是前者的父类。我可以通过Cat c=new Cat();实例化一个Cat对象,这个不难理解
但当我这样定义时,Animal a=new Cat();
表示定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型引用是
可以指向Cat类型的对象的。
那么这样做有什么意义呢?因为子类是父类的一个改进和扩充,所以一般子类在功能上交父类更强大,属性较父类更独特,
定义一个父类类型的引用指向一个子类对象既可以使用子类强大的功能,又可以抽取父类的共性。
所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,他是无可奈何的;
同时,父类中一个方法只有在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;对于父类中定义的方法,
如果子类重写了该方法,那么父类类型的引用将会调用子类中这个方法,这就是动态链接。也可以叫动态绑定。
动态绑定是指在执行期间判断所引用对象的实际类型,根据实际的类型调用其相应的方法。
对于多态,可以总结它为:
一、使用父类类型的引用指向子类的对象;
二、该引用只能调用父类中定义的方法和变量;
三、如果子类中重写了父类中的一个方法,那么在调用子类中的这个方法;
四、变量不能被重写(覆盖),重写的概念只针对方法,如果在子类中重写了父类中的变量,那么在编译时会报错。
多态的概念
多态==迟绑定
不要把函数重载理解为多态。
因为多态是一种运行时的行为,不是编译期的行为。
多态:父类型的引用可以指向子类型的对象。
比如: Parent p=new Child();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;
如果有,再去调用子类的该同名方法。(注意此处,静态static方法属于特殊情况,静态方法只能继承,不能重写,
如果子类中定义了同名同形式的静态方法,它对父类方法只起到隐藏的作用。调用的时候用谁的引用,则调用谁的版本)
如果想要调用子类中有而父类中没有的方法,需要进行强制类型转换,如上面的例子中,将p转换为子类Child类型的引用。
因为当用父类的引用指向子类的对象,用父类引用调用方法时,找不到父类中不存在的方法。这时候需要进行向下的类型转换,将
父类引用转换为子类引用。
代码如下: