1、了解面向对象的发展历史,为什么引入面向对象。
面向对象的发展历史
1.雏形阶段
20世纪60年代挪威计算中心发布的simula语言,首次引入了类的概念和继承机制,该语言的诞生是面向对象发展历史上的第一个里程碑。
70年代CLU、并发Pascal、Ada和Modula-2等语言对抽象数据类型理论的发展起到重要作用(支持数据和操作封装)。
1972年Palo Alno研究中心(PARC)发布了Smalltalk 72,其中正式使用了面向对象这个术语。Smalltalk的问世标志着面向对象程序设计方法的正式形成,但是这个时期的Smalltalk语言还不够完善。
2.完善阶段
PARC先后发布了Smalltalk 72,76和78等版本,直至1981年推出该语言完善的版本Smalltalk 80。Small talk 80的问世被认为是面向对象语言发展史上最重要的里程碑。迄今绝大多数面向的基本概念及其支持机制在Small talk 80中都已具备。他是第一个完善的、能够实际应用的面向对象语言。Small talk 80的问世被认为是面向对象语言发展史上最重要的里程碑。迄今绝大多数面向的基本概念及其支持机制在Small talk 80中都已具备。他是第一个完善的、能够实际应用的面向对象语言。
3.繁荣阶段
从20世纪80年代中期到90年代,是面向对象语言走向繁荣的阶段。其主要表现是大批比较实用的面向对象编程语言的涌现,例如 C++、Objective C 、Object Pascal、CLOS(Common Lisp Object System)、Eiffel和Actor等。这些面向对象的编程语言分为纯OO型语言和混合型OO语言。混合型语言是在传统的过程式语言基础上增加了OO语言成分形成的,在实用性方面具有更大的优势。此时的纯OO型语言也比较重视实用性。现在,在面向对象编程方面,普遍采用语言、类库和可视化编程环境相结合的方式,如Visual C++、JBuilder和Delphi等。面向对象方法也从编程发展到设计、分析,进而发展到整个软件生命周期。
4.面向对象的当前状况
当前,面向对象方法几乎覆盖了计算机软件领域的所有分支。例如,已经出现了面向对象的编程语言、面向对象的分析、面向对象的设计、面向对象的测试、面向对象的维护、面向对象的图形用户界面、面向对象的数据库、面向对象的数据结构、面向对象的智能程序设计、面向对象的软件开发环境和面向对象的体系结构等。此外,许多新领域都以面向对象理论为基础或作为主要技术,如面向对象的软件体系结构、领域工程、智能代理(Agent)、基于构件的软件工程和面向服务的软件开发等。
为什么引入面向对象
1、面向对象符合人类看待事物的一般规律。
2、对象的方法的实现细节是屏蔽的,只有对象方法的实现者了解细节。
2、掌握面向对象编程与非面向对象编程的优缺点。
面向过程是一种以过程为中心的编程思想,它首先分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,在使用时依次调用,是一种基础的顺序的思维方式。面向过程开发方式是对计算机底层结构的一层抽象,它将程序分为数据和操纵数据的操作两部分,其核心问题是数据结构和算法的开发和优化。常见的支持面向过程的编程语言有 C语言、COBOL 语言等。
面向对象是按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的编程思想,通过面向对象的理念使计算机软件系统能与现实世界中的系统一一对应。
面向对象方法直接把所有事物都当作独立的对象,处理问题过程中所思考的不再主要是怎样用数据结构来描述问题,而是直接考虑重现问题中各个对象之间的关系。面向对象方法的基础实现中也包含面向过程的思想。常见的支持面向对象的编程语言有 C++ 语言、C# 语言、Java 语言等。
具体来说,面向对象与面向过程有以下四个方面的不同:
- 出发点不同
面向对象使用符合常规思维的方式来处理客观世界的问题,强调把解决问题领域的“动作”直接映射到对象之间的接口上。而面向过程则强调的是过程的抽象化与模块化,是以过程为中心构造或处理客观世界问题。
- 层次逻辑关系不同
面向对象使用计算机逻辑来模拟客观世界中的物理存在,以对象的集合类作为处理问题的单位,尽可能地使计算机世界向客观世界靠拢,以使处理问题的方式更清晰直接,面向对象使用类的层次结构来体现类之间的继承与发展。面向过程处理问题的基本单位是能清晰准确地表达过程的模块,用模块的层次结构概括模块或模块间的关系与功能,把客观世界的问题抽象成计算机可以处理的过程。
- 数据处理方式与控制程序方式不同
面向对象将数据与对应的代码封装成一个整体,原则上其他对象不能直接修改其数据,即对象的修改只能由自身的成员函数完成,控制程序方式上是通过“事件驱动”来激活和运行程序的。而面向过程是直接通过程序来处理数据,处理完毕后即可显示处理的结果,在控制方式上是按照设计调用或返回程序,不能自由导航,各模块之间存在着控制与被控制,调动与被调用的关系。
- 分析设计与编码转换方式不同
面向对象贯穿于软件生命周期的分析、设计及编码中,是一种平滑的过程,从分析到设计再到编码是采用一致性的模型表示,实现的是一种无缝连接。而面向过程强调分析、设计及编码之间按规则进行转换贯穿于软件生命周期的分析、设计及编码中,实现的是一种有缝的连接。
面向对象 | 面向过程 | |
---|---|---|
特性 | 抽象、继承、封装、多态 | 功能模块化,代码流程化 |
优点 | 易维护、易复用、易扩展、低耦合 | 性能高,适合资源紧张、实时性强的场合 |
缺点 | 性能比面向过程低 | 没有面向对象易维护、易复用、易扩展 |
3、掌握抽象的5个层次,抽象形式。
抽象的5个层次
1.变量和函数
2.接口
3.消息传递
4.对象集单元
5.设计模式
抽象形式
1.概念
2.推理
3.判断
4、掌握类和方法。
类
1.概念
java中没有结构体类型,类就是高度封装的结构体类型。还有c是面向过程的编程语言,而java是面向对象的,所以对数据的处理方式会有些不同,java中的类更适用于对数据的高度封装,适合调用。
类是具有相同特性(数据元素)和行为(功能)的对象的抽象。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。
类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。
类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。
2.类与类之间最常见的关系主要有以下3种。
依赖(或uses–a)。
聚合(或has–a)。
继承(或is–a)。
方法
1.概念
方法是指对象能够进行的操作,方法同时还有另外一个名称,叫做函数。方法是类中的定义函数,其具体的作用就是对对象进行描述操作。
方法用于定义该类或该类实例的行为特征和功能实现。方法是类和对象行为特征的抽象。方法很类似于面向过程中的函数。
面向过程中,函数是最基本单位,整个程序由一个个 函数调用组成。面向对象中,整个程序的基本单位是类,方法是从属于类和对象的。
5、掌握消息、实例和初始化。
6、了解继承和替换。
一、继承
父类:基类
子类:派生类
继承的概念:
1.传递性:子类能继承父类的所有方法、属性
2.单根性:类只能继承一个父类
继承的注意的问题:
1.创建子类对象的时候,会为子类与父类的对象的字段提供空间
2.父类不能继承子类
3.构造方法不能被继承,但是可以在子类用添加 base(指定引用)
4.子类能继承父类的属性与方法、但是私有的方法只能被继承,不能被使用
5.基本格式:
子类:父类 base(“构造方法”)
6.基本的访问修饰符
public 公开的类 任何都能访问
prive 私有的类 只能在类中进行访问
protected 受保护的类 只能在本类或者子类进行访问
7.过程:创建子类的时候先条用子类的构造函数,然后再调用父类的构造函数
执行父类的构造函数后,再执行子类的构造函数。
二、里氏替换
概念:父类引用可以指向一个子类,看到的也只是父类的引用
1.父类引用能引用到子类的父类引用,可以看到,但是无法使用。
例:a(父类引用)se(子类对象)=new se();
子类可以访问包括父类的引用以及自己的属性
se(子类) ss=new se();
2.里氏替换的原则:
父类不能替换成子类
子类能替换成父类
Parent p=new Son()
Son s=(Son)p; –正确
Parent p=new Parent()
Son s=(Son)p; –错误
注:因为继承的概念就是子孙类会越来越比祖先类详细,所以可以将子孙类强制转换成祖先类,因为祖先有的行为子孙类示例都有了(重新定义的或者是默认的);但是当将祖先类示例强制转换成子孙类示例的时候,一些子孙类有的行为祖先是没有的(即使的是默认的实现也没有)。
3.如果需要父类访问到子类的字段,必须要转换
4.转换的方式有两种:
(1)(子类类型) 父类引用 //会报错
(2)父类引用 as 子类类型 //不会报错、但是会返回一个null值
5.判断父类的对象引用类型,父类引用 is 子类类型 并且返回一个布尔值
例:if(数组[i] is pe)
{
((pe)数组(I).方法/属性)
}
7、了解静态行为和动态行为。
动态行为是指代码具有一定的响应能力的行为,比如,一个对于线程进行封装的类,其行为应当就是动态的。另一个例子,就是Socket通讯问题,我们需要对连接进行测试,此时其所表现出来的也是动态行为。对于动态行为的代码,其在不同的操作系统中表现有可能是不同的。
与动态行为不同的是,静态行为只是被动的计算或是组织数据结构。比如,一个MD5的计算函数,其行为就是静态的,这种行为不论你是在任何操作系统或是处理器上运行,其结果都是一样的。