面向对象
一切皆对象。程序是对象的集合,它们通过发送消息来告知彼此所要做的。也就是说:以对象为中心,以消息(发送消息即为函数调用)为驱动。对象具有状态,行为和标识。
- 状态:指类的数据成员,即属性;
- 行为:指类的方法成员;
- 标识:指每个对象在内存中有唯一的地址标识。
四个(3+1)特征:封装、继承、抽象、多态
面向对象的三大特征:抽象、继承、封装。
1. 封装
隐藏该隐藏的,暴露该暴露的。有所隐藏又有所公开,是指隐藏对象的属性和实现细节,仅对外提供公共访问的方式。
好处:隐藏细节,将变化隔离;便于使用;提高重用性;控制访问,提高安全性。
2. 继承
从一般到特殊的关系,是一种扩展关系,子类对象是父类的一种,也可称为”is a“的关系,Java中表现为类的单继承、接口的多继承。
- 继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力
- 继承通过extends来实现
- 继承提高了代码的复用性,提高了软件的开发效率。让类与类之间产生关系,这个是实现多态的前提。
3. 抽象
抽象:从特定的角度出发,从已经存在的一些事物中抽取我们所关注的特性、行为,从而形成一个新的事物的思维过程,是一种从复杂到简洁的思维方式。
- 数据结构的抽象:复杂的数据类型,隐藏实现细节,公开相关的操作。
- 行为方法的抽象
Java中的接口和抽象类。接口可以看成是一种协议或者约定。可以参考开闭原则(OCP:Open/Closed Principle)【对扩展开放,对修改关闭】,其关键是做到“抽象化设计”
4. 多态
指允许类的不同对象对同一消息做出不同的响应,即同一消息可以根据接收对象的不同而采用多种不同的行为方式(发送消息就是函数调用)。
实现多态的技术称为:动态绑定(dynamic binding),是指在运行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
多态的作用:消除类型之间的耦合关系。
多态存在的三个必要条件
- 继承或接口实现;
- 重写Override;
- 父类引用指向子类对象。
多态的好处:
- 可替换性(substitutability):多态对已存在代码具有可替换性。父类引用可以指向任意的子类实现。
- 可扩展性(extensibility):多态对代码具有可扩展性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。增加子类会增加不同的实现方式。
- 接口性(interface-ability):多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
- 灵活性(flexibility):它在应用中体现了灵活多样的操作,提高了使用效率。
- 简化性(simplicity):多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
方法调用过程如下
- 编译器查看对象的声明类型和方法名。
- 接下来,编译器将查看调用方法时提供的参数类型。如果在所有的同名方法中存在一个与提供的参数类型完全匹配,就选择这个方法。这个过程被称为重载解析(overloading resolution)。方法的名字和参数列表称为方法的签名。返回类型不是签名的一部分。
- 如果是private方法、static方法、final方法或者构造器,那么编译器将可以准确地知道应该调用哪个方法,这种调用方式称为静态绑定(static binding)。
- 当程序运行,并且采用动态绑定调用方法时,虚拟机会调用与对象变量所引用对象的实际类型最合适的那个类的方法。
- 虚拟机预先为每个类创建了一个方法表(method table),其中列出了所有的方法签名。在覆盖一个方法时,子类方法不能低于超类方法的可见性。动态绑定只是针对方法,对属性无效。