目录
6.1 面向对象概述
随着软件的规模越来越庞大,结构化语言的弊端也逐渐暴露出来,开发周期被无休止地拖延,产品的质量也不尽如人意,结构化语言已经不再适合当前的软件开发。这时人们开始将另一种开发思想引入程序中,即面向对象的开发思想。面向对象思想是人类最自然的一种思考方式,它将所有预处理的问题抽象为对象,同时了解这些对象具有哪些相应的属性以及行为,以解决这些对象面临的一些实际问题,这样就在程序开发中引入了面向对象设计的概念,面向对象设计实质上就是对现实世界的对象进行建模操作。
6.1.1 对象
现实世界中,随处可见的一种事物就是对象,对象是事物存在的实体,如人类、书桌、计算机、高楼大厦等。人类解决问题的方式总是将复杂的事物简单化,于是就会思考这些对象都是由哪些部分组成的。通常都会将对象划分为两个部分,即静态部分与动态部分。静态部分,顾名思义,就是不能动的部分,这个部分被称为“属性”,任何对象都具备其自身属性,如一个人,其属性包括高矮、胖瘦、性别、年龄等。然而具有这些属性的人会执行哪些动作也是一个值得探讨的部分,这个人可以哭泣、微笑、说话、行走,这些是这个人具备的行为(动态部分),人类通过探讨对象的属性和观察对象的行为了解对象。
在计算机的世界中,面向对象程序设计的思想要以对象来思考问题,首先要将现实世界的实体抽象为对象,然后考虑这个对象具备的属性和行为。
6.1.2 类
不能将所谓的一个事物描述成一类事物,如一只鸟不能称为鸟类。如果需要对同一类事物统称,就不得不说明类这个概念。
类就是同一类事物的统称,如果将现实世界中的一个事物抽象成对象,类就是这类对象的统称,如鸟类、家禽类、人类等。类是构造对象时所依赖的规范,如一只鸟具有一对翅膀,它可以用这对翅膀飞行,而基本上所有的鸟都具有翅膀这个特性和飞行的技能,这样具有相同特性和行为的一类事物就称为类,类的思想就是这样产生的。
类是封装对象的属性和行为的载体,反过来说具有相同属性和行为的一类实体被称为类。
6.1.3 面向对象程序设计的特点
面向对象程序设计具有以下特点: 封装性、继承性、多态性
1.封装
封装是面向对象编程的核心思想。将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想。例如,用户使用计算机时,只需要使用手指敲击键盘就可以实现一些功能,无须知道计算机内部是如何工作的,即使可能知道计算机的工作原理,但在使用计算机时也并不完全依赖于计算机工作原理这些细节。
采用封装的思想保证了类内部数据结构的完整性,应用该类的用户不能轻易地直接操作此数据结构,只能执行类允许公开的数据。这样就避免了外部操作对内部数据的影响,提高了程序的可维护性。
2.继承
类与类之间同样具有关系,如一个百货公司类与销售员类相联系,类之间的这种关系被称为关联。关联主要描述两个类之间的一般二元关系,例如,一个百货公司类与销售员类就是一个关联,学生类与教师类也是一个关联。两个类之间的关系有很多种,继承是关联中的一种。
继承性主要利用特定对象之间的共有属性。例如,平行四边形是四边形,正方形、矩形也是四边形,平行四边形与四边形具有共同特性,就是拥有4条边,可以将平行四边形类看作四边形的延伸,平行四边形复用了四边形的属性和行为,同时添加了平行四边形独有的属性和行为,如平行四边形的对边平行且相等。这里可以将平行四边形类看作是从四边形类中继承的。
3.多态
介绍了继承,了解了父类和子类,其实将父类对象应用于子类的特征就是多态,多态的实现并不依赖具体类,而是依赖于抽象类和接口。下面以图形类来说明多态。
图形类作为所有图形的父类,具有绘制图形的能力,这个方法可称为“绘制图形”,但如果要执行这个“绘制图形”的命令,没有人知道应该画什么样的图形,并且如果要在图形类中抽象出一个图形对象,没有人能说清这个图形究竟是什么图形,所以使用“抽象”这个词来描述图形类比较恰当。
6.2 类与对象
在6.1.2节中已经讲过类是封装对象的属性和行为的载体,Java中定义类使用class关键字,其语法如下:
class 类名称 {
//类的成员变量
//类的成员方法}
6.2.1 成员变量
在Java中对象的属性也称为成员变量,成员变量的定义与普通变量的定义一样,语法如下:
数据类型 变量名称[=值];
其中,[=值表示可选内容,即定义变量时可以为其赋值,也可以不为其赋值。
为了了解成员变量,首先定义一个鸟类,成员变量对应于类对象的属性,在Bird类中设置4个成员变量,分别为wing、claw、 beak和feather,分别对应于鸟类的翅膀、爪子、喙和羽毛。
例如,在项目中创建鸟类Bird,在该类中定义成员变量。
public class Bird {
String wing; //翅膀
String claw; // 爪子
String beak; //喙
String feather; //羽毛
}
Bird 类中定义了4个成最必量 层族图的来期得有了不建义尖,Bird是类的名称。同时在
类中定义了4个成员变量,成员变量的类型可以设置为Java中合法的数据类型,其实成员变量就是普通的变量,可以为它设置初始值,也可以不设置初始值。如果不设置初始值,则会有默认值。Java中常见类型的默认值如表6.1所示:
6.2.2 成员方法
成员方法对应于类对象的行为,它主要用来定义类可执行的操作,它是包含一系列语句的代码块。
1. 成员方法的定义
定义成员方法的语法格式如下:
[权限修饰符] [返回值类型] 方法名( [参数类型 参数名] ) [throws 异常类型] {
...//方法体
return 返回值;
}
其中,“权限修饰符”可以是private、public、protected中的任一个,也可以不写,主要用来控制方法的访问权限,关于权限修饰符将在下一章中详细讲解;“返回值类型”指定方法返回数据的类型,可以是任何类型,如果方法不需要返回值,则使用void关键字;一个成员方法既可以有参数,也可以没有参数,参数可以是对象也可以是基本数据类型的变量。
例如,定义一个showGoods方法,用来输出库存商品信息,代码如下:
public void showGoods() {
System.out.print1n("库存商品名称:");
System.out.println(FullName);
}
如果定义的方法有返回值,则必须使用retum关键字返回一个指定类型的数据,并且返回值类型要与方法返回的值类型一致。例如,定义一个返回值类型为int的方法,就必须使用return返回一个int类型的值,代码如下:
public int showGoods() {
System.out.println("库存商品名称:");
return 1;
}
2. 成员方法的参数
调用方法时可以给该方法传递一个或多个值,传给方法的值叫做实参,在方法内部,接收实参的变量叫做形参,形参的声明语法与变量的声明语法一样。形参只在方法内部有效。Java中方法的参数主要有3种,分别为值参数、引用参数和不定长参数。
(1) 值参数
值参数表明实参与形参之间按值传递,当使用值参数的方法被调用时,编译器为形参分配存储单元,然后将对应的实参的值复制到形参中,由于是值类型的传递方式,所以,在方法中对值类型的形参的修改并不会影响实参。
例6.1 定义一个add方法,用来计算两个数的和,该方法中有两个形参,但在方法体中,对其中的一个形参x执行加y操作,并返回x;在main方法中调用该方法,为该方法传入定义好的实参;最后分别显示调用add方法计算之后的x值和实参x的值。
代码如图所示:
运行结果如图所示: