9. 对象和类
9.1 为对象定义类
类为对象定义属性和行为。
面向对象程序设计(OOP) 就是使用对象进行程序设计。对象(object) 代表现实世界中可以明确标识的一个实体。例如:一个学生、一张桌子、一个圆、一个按钮甚至一笔贷款都可以看作是一个对象。每个对象都有自己独特的标识、状态和行为。
一个对象的状态(state,也称为特征(property) 或属性(attribute)) 是由具有当前值的数据域来表示的。例如:圆对象具有一个数据域 radius, 它是标识圆的属性。一 个矩形对象具有数据域 width 和 height, 它们都是描述矩形的属性。
— 个对象的行为(behavior, 也称为动作(action))是由方法定义的。调用对象的一个方法就是要求对象完成一个动作。例如:可以为圆对象定义一个名为 getAreaO 和 getPerimeter( ) 的 方法。圆对象可以调用 getArea() 返回圆的面积,调用 getPerimeter( ) 返回它的周长。还可以定义 setRadius(radius) 方法。圆对象可以调用这个方法来修改它的半径。
使用一个通用类来定义同一类型的对象。类是一个模板、蓝本或者说是合约,用来定义对象的数据域是什么以及方法是做什么的。一个对象是类的一个实例。可以从一个类中创建多个实例。创建实例的过程称为实例化(instantiation)。对象(object) 和实例(instance)经常是可以互换的。类和对象之间的关系类似于苹果派配方和苹果派之间的关系。可以用一种配方做出任意多的苹果派来。显示名为 Circle 的类和它的三个对象。
Java 类使用变量定义数据域,使用方法定义动作。除此之外,类还提供了一种称为构造方法(constructor) 的特殊类型的方法,调用它可以创建一个新对象。构造方法本身是可以完成任何动作的,但是设计构造方法是为了完成初始化动作,例如:初始化对象的数据域。
9.2 使用构造方法构造对象
构造方法在使用 new 操作符创建对象的时候被调用。
构造方法是一种特殊的方法。它们有以下三个特殊性:
- 构造方法必须具备和所在类相同的名字。
- 构造方法没有返回值类型,甚至连 void 也没有。
- 构造方法是在创建一个对象使用 new 操作符时调用的。构造方法的作用是初始化对象。
构造方法具有和定义它的类完全相同的名字。和所有其他方法一样,构造方法也可以重载(也就是说,可以有多个同名的构造方法,但它们要有不同的签名),这样更易于用不同的初始数据值来构造对象。
一个常见的错误就是将关键字 void 放在构造方法的前面。例如:
public void Circle() {
}
在这种情况下,Circle( )是一个方法,而不是构造方法。
构造方法是用来构造对象的。为了能够从一个类构造对象,使用 new 操作符调用这个类的构造方法,如下所示:
new ClassName(arguments);
例如:new Circle( )使用Circle 类中定义的第一个构造方法创建一个 Circle 对象。new Circle(25)调用 Circle 类中定义的第二个构造方法创建一个 Circle 对象。
通常,一个类会提供一个没有参数的构造方法(例如:Circle( ) )。这样的构造方法称 为无参构造方法(no - arg 或 no - argument constructor)。— 个类可以不定义构造方法。在这种情况下,类中隐含定义一个方法体为空的无参构造方法。这个构造方法称为默认构造方法(default constructor),当且仅当类中没有明确定义任何构造方法时才会自动提供它。
9.3 通过引用变量访问对象
9.3.1 引用变量和引用类型
对象是通过对象引用变量(reference variable)来访问的,该变量包含对对象的引用,使用如下语法格式声明这样的变量:
ClassName objectRefVar;
本质上来说,一个类是一个程序员定义的类型。类是一种引用类型(reference type),这意味着该类类型的变量都可以引用该类的一个实例。下面的语句声明变量 myCircle 的类型是 Circle 类型:
Circle myCircle;
变量 myCircle 能够引用一个 Circle 对象。下面的语句创建一个对象,并且将它的引用赋给变量 myCircle:
myCircle = new Circle();
采用如下所示的语法,可以写一条包括声明对象引用变量、创建对象以及将对象的引用赋值给这个变量的语句。
ClassName objectRefVar = new ClassNaroe():
下面是一个例子:
Circle myCircle = new Circle();
变量 myCircle中放的是对 Circle 对象的一个引用。
注意:从表面上看,对象引用变量中似乎存放了一个对象,但事实上,它只是包含了对该对象的引用。严格地讲,对象引用变量和对象是不同的,但是大多數情况下,这种差异是可以忽略的。因此,可以简单地说 myCircle 是一个 Circle 对象,而不用冗长地描述说, myCi rcle 是一个包含对 Circle 对象引用的变量。
注意:在 Java 中,数组被看作是对象。數组是用 new 操作符创建的。一个数组变量实际上是一个包含数组引用的变量。
9.3.2 访问对象的数据和方法
在面向对象编程中,对象成员可以引用该对象的数据域和方法。在创建一个对象之后,它的数据和方法可以使用点操作符( )来访问和调用,该操作符也称为对象成员访问操作符 (object member access operator):
- objectRefVar.dataField 引用对象的数据域。
- obj