4.3 构造方法与对象
构造方法用于将对象中的所有成员变量进行初始化。对象的属性通过变量来刻画,也就是类的成员变量,而对象的行为通过方法来体现,也就是类的成员方法。方法可以通过操作属性形成一定的算法来实现一个具体的功能。类可以把属性和方法封装成一个整体。
4.3.1 构造方法的概念及用途
构造方法是一种特殊的方法,它的名字必须与它所在类的名字完全相同,而且没有返回值,也不需要使用关键字void 进行标识。例如:
构造方法用于将对象中的所有成员变量进行初始化,在创建对象时立即被调用。
图4.5 Tiger 类的UML 图
1.默认构造方法和自定义构造方法
如果类中定义了一个或多个构造方法,则Java 中不提供默认的构造方法。
【例4.2】 定义Apple 类,在该类的构造方法中初始化成员变量,具体代码如下:
图4.6 类初始化成员变量的值
程序运行结果如图4.6 所示。
2.构造方法没有返回值
需要注意的是,构造方法没有返回值,例如,下面这段代码,如果强行添加返回值类型则会报错:
需要注意的是,如果用户没有定义构造方法,Java 会自动提供一个默认的构造方法,用来实现成员变量的初始化。在Java 中,各种类型变量的初始值如表4.1 所示。
表4.1 各种类型变量的初始值
4.3.2 对象的概述
在面向对象语言中,对象是对类的一个具体描述,是一个客观存在的实体。“万物皆对象”,也就是说,任何事物都可以被看作对象,如一个人、一个动物,或者没有生命体的轮船、汽车、飞机,甚至概念性的抽象,如公司业绩等。
一个对象在Java 中的生命周期包括创建、使用和销毁3 个阶段。
4.3.3 对象的创建
对象是类的实例。Java 定义任何变量都需要指定变量类型,因此,在创建对象之前,一定要先声明该对象。
1.对象的声明
声明对象的一般格式如下:
●类名:必选参数,用于指定一个已经被定义的类。
●对象名:必选参数,用于指定对象的名称。对象名必须是合法的Java 标识符。
例如,声明Apple 类的一个对象redApple 的具体代码如下:
2.实例化对象
在声明对象时,只是在内存中为其建立一个引用,并设置初始值为null,表示不指向任何内存空间。
在声明对象后,需要为对象分配内存,这个过程被称为实例化对象。在Java 中使用关键字new 来实例化对象,具体语法格式如下:
●对象名:必选参数,用于指定已经被声明的对象名。
●类名:必选参数,用于指定构造方法名,即类名,因为构造方法名与类名相同。
●参数列表:可选参数,用于指定构造方法的入口参数。如果构造方法无参数,则可以省略。
在声明Apple 类的一个对象redApple 后,可以通过以下代码为对象redApple 分配内存(即创建该对象):
这相当于同时执行了对象声明和创建对象:
4.3.4 对象的使用
在创建对象之后,不仅可以访问对象的成员变量,并改变成员变量的值,而且可以调用对象的成员方法。通过使用运算符 “.” 实现对成员变量的访问和成员方法的调用。
其语法格式如下:
【例4.3】 定义一个类,创建该类的对象,同时改变对象的成员变量的值并调用该对象的成员方法。例如,创建一个名称为Round 的类,在该类中定义一个常量PI、一个成员变量r、一个不带参数的方法getArea() 和一个带参数的方法getCircumference()。Round类的具体代码如下:
程序运行结果如图4.7 所示。
图4.7 圆面积和圆周长的计算结果
4.3.5 对象的销毁
在许多程序设计语言中,需要手动释放对象所占用的内存,而在Java 中不需要手动完成这项工作。Java 提供的垃圾回收机制可以自动判断对象是否还在使用,并且能够自动销毁不再使用的对象,回收被销毁的对象所占用的资源。
Java 提供了一个名称为finalize() 的方法,用于在对象被垃圾回收机制销毁之前执行一些资源回收工作,并由垃圾回收系统调用。但是垃圾回收系统的运行是不可预测的。finalize() 方法没有任何参数和返回值,每个类有且只有一个finalize() 方法。