(61)面向对象设计方法和面向对象特性(一)
最后更新于:2022-04-01 10:59:38
## Java编程那些事儿61—面向对象设计方法
郑州游戏学院陈跃峰
出自:[http://blog.csdn.net/mailbomb](http://blog.csdn.net/mailbomb)
### 8.4 面向对象设计方法
前面介绍了面向对象技术的两个最基本、最重要的概念——类和对象,下面介绍一下面向对象技术的设计思路。
对于初学者来说,面向对象是学习Java语言时的第一个难点,其实面向对象只是一种思考问题的方式,或者理解为组织数据和功能的方式而已,当系统中的数据和功能都实现以后,按照数据和功能的相关性进行组织。
在使用面向对象技术设计项目时,一般的步骤如下:
1、 抽象类
2、 抽象类的属性和方法
3、 通过对象的关联构造系统
其中步骤1和2是设计需要实现的功能,步骤3更多的和业务逻辑相关,体现设计的结构不是很多。
1. 抽象类
抽象类最基本的方式是——将名词转换为类。
在一个系统中会存在很多的名词,如果这些名词需要频繁的在系统中进行使用时,则可以将这些名词抽象成类,便于后续的时候。例如在一个学生成绩管理系统中,则名词:学生、课程等则可以抽象成类。
而实际在抽象时,由于有一定的主观性,所以在系统设计时,不同人设计的系统会存在一些不同。
2. 抽象类的属性和方法
把系统中的类抽象出来了以后,就可以设计每个类的内部结构了,而每个类内部最重要的结构就是属性和方法了。
抽象属性最基本的方式是——将数据抽象为属性。
抽象方法最基本的方式是——将功能抽象为方法。
在一个类内部会存在很多的数据和功能,在实际抽象时,只需要抽象自己需要的数据和功能即可。例如在学生成绩管理系统中,学生的姓名、班级和各个科目的成绩都是系统中需要使用的数据,而学生的家庭住址,联系电话则不会必须的属性,可以根据实际的需要取舍数据的值。
抽象功能时,只需要把该类在系统中需要执行的动作提取出来,然后使用方法的语法进行描述即可。
当然,面向对象设计还涉及很多其它的知识,这里讲解的只是一些基础的入门知识,更多的有关面向对象的知识可以阅读关于面向对象技术的专门书籍,并且在项目开发中逐步体会这些知识。
### 8.5 面向对象三大特性
面向对象技术在实际开发中有很多的特性,总结起来最核心的特性主要有三个:封装、继承和多态。
#### 8.5.1 封装性
封装性指在实际实现时,将复杂的内部结构隐藏起来,并为这组复杂的结构取一个统一的名称进行使用。在现实世界中,大量的存在封装的例子,例如电脑的硬盘,将多组复杂的线路和存储信息的磁片封装起来,并将该组结构取名为硬盘,以后就可以使用硬盘来代表该结构,而不需要更多的了解内部的信息。
在面向对象技术中,类是典型的封装性的体现,类将一组属性和功能组合成一个统一的结构,并使用类名来代表该结构。
封装性的最大优势在于隐藏每个类的内部实现(内部结构),从而既方便项目的分解也降低了项目的难度。
例如以设计汽车为例,我们可以把汽车看作是软件开发中的整个项目,在实际设计时,首先可以将设计汽车分解为设计汽车的每个组件,然后具体对每个组件进行设计,而组件和组件的设计之间关联性很小,例如设计发动机的设计小组不需要很详细的了解轮胎设计小组的工作。而这里的每个组件可以看作实际面向对象设计中的类,每个类都把自己的内部实现隐藏起来,只通过名称使其它类了解该类的作用,并开放一些基本的功能供其它的类使用即可。
这样可以在实际设计时,每个类都更注重自身的实现,而对于其它类的实现不需要深入了解,这样可以在总体上降低交流的频率,从而降低整个项目的复杂度。
通常情况下,一般把类和类之间的关联性又称作耦合性,类和类之间的关联性比较低也称作耦合性比较低。在实际设计项目时,低耦合的项目是程序设计人员设计系统的目标之一。
#### 8.5.2 继承性
在我们认知现实世界时,一般会把事物进行分类,而每一类内部又划分出很多的小类,生物学中将该方式体现的很彻底。例如猩猩属于动物中的哺乳类灵长目,这里的动物、哺乳类和灵长目都是一个特定的类别,和以前不同的是这些类别之间存在包含关系(is-a),换句话说,也就是哺乳类是动物类的一种,灵长目是哺乳类的一种。
其实在程序设计中,很多设计出来的类也存在这样的包含关系,这样一个类的内部会包含和其它类类似的特征和属性,如果在设计时可以以另外一个类为基础进行设计,那将是多么激动人心的特性,这个特性就是面向对象设计中的继承性。
在一个项目中,如果类和类之间存储包含关系,即一个类是另外一个类的一种,就可以使用继承。
继承性提供了全新的类设计方式,可以充分利用了已有类内部的结构和功能,极大的降低了类内部的代码重复,是设计类的一种显著的变革,对于大型的项目设计十分有用。另外很多技术的应用中也包含大量的继承成分,使整个技术体系比较固定。
##### 8.5.2.1 继承语法
在Java语言中,继承的语法格式比较简单,如下所述:
访问控制符 [修饰符] class 类名 extends 父类名{
……
}
在声明类时,声明该类的继承关系,使用extends关键字实现,其中extends关键字前面是声明出的新类名,extends关键字后面的类名是被继承的类名,要求被继承的类名已存在。Java语言采用的是单重继承,也就是说一个类只能有一个直接父类。在类声明时,如果没有使用extends关键字声明父类,则自动继承Object类。说明:Object类是系统提供的类,该类已存在。
示例代码如下:
~~~
//Animal.java
public class Animal {
/**类型名称*/
String name;
/**移动方式*/
int moveType;
}
//Mammalia.java
public class Mammalia extends Animal{
/**哺育时间*/
int fosterTime;
}
~~~
这里Mammalia类就是Animal类的子类,Animal类就是Mammalia类的父类,子类和父类具有相对性,正如一个祖孙三代的家庭内部,每个人相对于不同的人扮演不同的角色一样。同时类和类之间的继承具备传递性,就如现实中的血缘关系一样。
##### 8.5.2.2 继承说明
两个类之间如果存在了继承关系以后,将带来哪些不同呢?下面依次来进行说明:
1. 子类拥有父类的所有属性
子类中继承父类中所有的属性,在父类中声明的属性在子类内部可以直接调用。说明:如果访问控制符限制则无法访问。
2. 子类拥有父类的所有方法
子类中继承父类中所有的方法,在父类中声明的方法在子类内部可以直接调用。说明:如果访问控制符限制则无法访问。
1. 子类不拥有父类的构造方法
子类不继承父类的构造方法,如果需要在子类内部使用和父类传入参数一样的构造方法,则需要在子类内部重新声明这些构造方法。
2. 子类类型是父类类型
子类类型的对象可以自动转换为父类类型的对象,父类类型的对象则需要强制转换为子类的对象,转换的语法个基本数据类型转换的语法相同。