面向对象的思想面向过程的思想有着本质的区别的,对于面向过程的思维来说,我们分析解决问题时会将问题拆分成n个步骤,第一步先做什么,第二步再做什么;而对于面向对象的思维来说,会首先分析问题里面涉及到哪些类和对象,然后再分析这些类和对象应该具有哪些属性和方法,最后分析类与类之间的关系。
面向对象有一个非常重要的设计思维:合适的方法应该出现在合适的类里面。
1. 简单理解面向对象的思想
面对问题域:
不能
考虑解决方案实现,第一步应该干什么,第二步应该干什么…
应该
- 先分析问题解决方案 涉及到的类和对象
- 然后分析各个类和对象对应的动静态属性
- 最后分析抽象对象和对象之间的关系
2. 面向对象的设计思想
面向对象的基本思想是,从现实世界中可观存在的事物出发来构造软件系统,并在系统的构造中尽可能运用人类的自然思维方式。
面向对象更加强调运用人类在日常生活的逻辑思维中经常采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。
人在思考的时候,首先眼睛里看到的是一个个对象。
2.1 对象和类的概念
对象是用于计算机语言对问题域中事物的描述,对象通过“属性(attribute)”和“方法(method)”来分别对应事物所具有的静态属性和动态属性。
类是用于描述同一类对象的一个抽象的概念,类中定义了这一类对象所具有的静态属性和动态属性。
类可以看成一类对象的模板,对象可以看成该类的一个具体的实例。
举个栗子:
人的定义:能制造工具并能熟练使用工具进行劳动的高等动物。
给人下定义的过程,其实就是把人的相关特性抽象出来,如:
- 能制造工具;
- 能熟练使用工具;
- 高等动物。
人在这里叫做这一类事物的抽象,在你的脑子里有人的概念,可人的概念在脑子里到底是怎样的? 首先人是高等动物,那么高等动物这个特征就是人的静态属性,其次,这个高等动物可以 制造工具并熟练使用工具,制造工具和熟练使用工具就是人的动态属性。反应到java的类上,就是一个是成员变量(静态属性),一个是方法(动态属性)。脑子里的人的概念其实是一类事物的抽象,这种抽象的东西我们就叫做类,椅子是类,桌子是类,交通工具也是类,而这一类事物的具体实例就是对象了。
2.2 如何抽象出一个类
上文已经说明面向对象的设计思想就是对问题域特征进行抽象,抽象出一些类,那么该如何去做呢?首先需要明确的是,类具有静态属性和动态属性,那么反应到java类中的体现就是,成员变量和方法。
让我们来看一下职员的抽象:
首先分析下,职员有哪些属性?有姓名,年龄,目前薪资等属性;有哪些方法?显示姓名,显示年龄,修改姓名,领取工资。当然,所有的方法其实都可以让别人来做,但面向对象的设计思想就是方法应该出现在最合适的类里面,这里显然职员这个类自己最合适。
对于每个对象来说,它都有一些属性(成员变量),只不过对象间的取值不同而已。上图所描述的职员这个类实例化出两个职员,职员A和职员B,他们都有姓名、年龄和目前薪资这些属性,但具体数值却不一样,正因为这些变化,对象和对象之间才能区分开来。
如何区分类和对象?类是一类具有共同特征事物的抽象,而对象就是这个类下面的具体实例了。
2.3 类(对象)之间的关系
2.3.1 关联关系
类和类之间存在关系的,如学生和老师这两个类,老师可以教学生,学生可以向老师学习,这是他们之间的关系,而关系和关系之间也是不同,你和你老婆的关系和你和你其他女朋友的关系是不能混为一谈的。关系中最弱的一种关系就是关联关系了。关联关系反应到程序上往往是一个类的方法里面的参数是另一个类的具体对象,比如教授教学生,教哪个学生,教学是教授这个类的一个方法,某个研究生是研究生这个类里面的一个具体对象,这两个类或者说对象之间有关系,但是不是很紧密的关系。
2.3.2 继承关系
对应:一般和特殊
继承关系的前提:XX是一种XX。满足继承的前提就可以称之为继承关系,如游泳运动员是一种运动员,这点是满足的,那么游泳运动员就是从运动员继承过来的,游泳运动员和运动员之间就是一种继承关系。学生是一个人,学生从人继承,老师也是一个人,老师也从人继承,学生是一种老师,这点说不过去,所以学生和老师之间就不存在继承关系,因此做设计的时候分清继承关系很简单,那就是使得“XX是一种XX”说的过去。图中,运动员派生出了不同种类的运动员,包括游泳的,球类的,射击的。球类运动员再派生出足球的,篮球的,排球的,这就是一棵继承树,不过这棵树是比较理想的情况,只有一个根节点。但是实际中,继承关系不一定只从一个类继承,可能从多个类继承,比如说,孩子即继承父亲这个类,也继承母亲这个类。C++正是想封装这种关系,所以它存在多继承。
2.3.3 聚合关系
对应:整体和部分
什么是聚合?聚合就是一个整体和部分的关系。我们是“XX是XX的一部分”,只要说的通,他就是聚合关系,队长是球队的一部分,队员也是球队的一部分,因此队长和球队,队员和球队都是聚合关系。脑袋是人的一部分,身体和胳膊也是人的一部分,因此脑袋、身体和胳膊与人都是聚合关系。聚合关系再分细一点就是聚集关系和组合关系,比如球队、队长、队员,这三者是聚集关系,假如这个队长既是足球队的队长,也是篮球队的队长,一个人分属两个不同的球队,这是可以的,球队和队长之间没有不可分割的关系,这就是聚集关系。而另一种组合关系,就是一种不可分割的关系,相对于一个人的脑袋不可能既属于你又属于别人,身体也一样不可能同时属于多个人。
2.3.4 实现关系
对于父类(抽象类)或接口来说,我觉得应该具有这样一个方法,但是不知道具体怎么实现,谁去实现,我的子类实现,这就是实现关系。而根据实现不同,具有不同的表现形态,这就是多态。
2.3.5 多态
3. Java与面向对象
- 对象是Java程序的核心,在Java程序中“万物皆对象”;
- 对象可以看成是静态属性(成员变量)和动态属性(方法)的封装体;
- 类是创建同一类型对象的“模板”,在类中定义了一个对象所应具有的成员变量和方法;
- J2SDK提供了很多类供编程人员使用,编程人员也可以定义自己的类。
对象和类是分不开的,必须首先定义类才能有对象,首先定义方法才能调用。对象是Java里面的核心,做任何东西你首先造出一个对象才能做。静态属性简称属性,也叫成员变量,以后说属性或者说成员变量他们指的都是同一回事。
整个类可以看作是静态的属性还有方法之间的一个综合。怎么抽象出一个类的概念,从两方面入手,一个是静态属性,即具有哪些成员变量,另一个就是动态属性,具有哪些方法。
下面是一段示例代码,可以仔细体会下:
1 | public class Person { |
4. 为什么使用面向对象编程?
面向对象编程就是使用一组对象互相配合通过沟通一起完成特定的功能.做软件苦苦追求的一种境界是可重用性(reusable),可扩展性。如果是面向过程,一般情况下属性和方法是分开的,没有关系的,这样复用起来很麻烦,而且局限在方法这个层次上,而面向对象则不同,它将属性和方法包装,可以综合起来复用,就是整个对象的复用。所以面向对象和面向过程相比,前者明显更容易让我们达到可重用性。