当前位置:首页 >> 计算机软件及应用 >>

第4章 Java类和对象_图文

第4章 类和对象
? ? ?

?

?

学习导读 本章着重介绍Java编程中类和对象等非常重要的 概念。 Java 程序是由一个个类定义组成的,编写 Java 程序的过程就是从现实世界中抽象出 Java 可实现的 类并用合适的语句定义它们的过程,这个定义过程 包括对类内各种属性和方法的定义,创建类的对象, 也包括类间的各种关系和接口的定义。 方法是类的主要组成部分。在一个类中,程序 的作用体现在方法中。方法是 Java 语言的基本构件。 利用方法可以组成结构良好的程序。本章介绍方法 的构成规则和设计、使用方法的基本要点。 Java的应用程序接口(API)大量的软件包库。

第4章 类和对象
4.1.面向对象的基本概念 ? 4.2 类 ? 4.3 方法 ? 4.4 访问控制符 ? 4.5 静态修饰符、静态字段和方法 ? 4.6 抽象类与抽象方法 ? 4.7 最终类、最终属性、最终方法与终结器 ? 本章小结 ? 思考与练习
?

4.1.面向对象的基本概念
学习要点之二

?OOD方法提供了抽象数据类型机制,遵循 软件设计的三条重要原则,即抽象、信息隐 藏和模块化;
数据 信息
封 装

+
双重

处理

模块化

对数据的操作

4.1.面向对象的基本概念
?

4.1.1 抽象 ?1.什么是抽象 抽象就是抽出事物的本质特性 而暂时不考虑它们的细节。过程抽象和数据抽象 是常用的两种主要抽象手段。
问题空间 客观世界的 对象和操作 客观世界的算法 客观世界的 对象 结果

数据

程序员对问题的表达(抽象)

输出数据 程序设计的 对象和操作 解空间 计算机算法

?

2.如何用面向对象的方法实现抽象

一个抽象数据类型(Abstract Data Type,ADT) 可以分解成4个部分,如图4-2所示。语法和语义构成 抽象数据类型ADT的说明,让使用者了解这个抽象数 据类型的特征。属性和方法构成ADT的实现,展示这 个ADT是怎样做成的。
说明 抽象数据类型 实现 属性 方法 语法 语义

图4-2 抽象数据类型

?

4.1.2 封装

将信息隐蔽的过程称为封装。 有两方面的原因促使我们控制对成员的访问。 第一个原因是防止程序员接触他们不该接触的东西 ——通常是内部数据类型的设计思想。若只是为了解 决特定的问题,用户只需操作接口即可,毋需明白这 些信息。 第二个原因是允许库设计人员修改内部结构,不用 担心它会对客户程序员造成什么影响。

?

4.1.3 对象
可将对象想象对象(object)应是 实际问题域中有意义的个体或概念实体。 此外,对象应该具有记忆自身状态的能 力。同时对象应该以某种方式与系统发 生关联,既对象应该与系统中其他有意 义的对象进行消息传递,并提供外部服 务。

?

4.1.3 对象

?(1) ?(2) ?(3) ?(4)

所有东西都是对象。可将对象想象成一种新型变 量;它保存着数据,但可要求它对自身进行操作。 程序是一大堆对象的组合;通过消息传递,各对 象知道自己该做些什么。 每个对象都有自己的存储空间,可容纳其他对象。

每个对象都有一种类型。根据语法,每个对象都 是某个“类”的一个“实例”。其中,“类”(Class) 是“类型”(Type)的同义词。一个类最重要的特征就 是“能将什么消息发给它?”
?(5)同一类所有对象都能接收相同的消息。

4.2
表示,对象是类的实例。



? 类是现实世界某些对象的共同特征 ( 属性和操作 ) 的

?类的属性:就是类的静态属性的简称,指类内包

含的 各项数据,如变量或其他类的对象; ?类的服务: 则被称为成员函数或方法。
?

4.2
类的基本定义方法如下:
[修饰符] class { 类成员变量声明 类方法声明 } 类名 [extends


父类] [implements 接口名]

类的修饰符用来说明类 的特殊性质。 分为三种: 访问控制符:public 公共类 抽象类说明符:abstract 最终类说明符:f inal

接口名跟在implements关键 字后面,用来说明当前类中实 现了哪个接口定义的功能和方 法。 接口是Java语言用来实现多 重继承的一种特殊机制,我们

?

1.关于类头---class

class关键字,在它的后面,应跟 随新数据类型的名称。(注意不要把 class写成Class)。 父类名跟在extends 关键字后面, 用来说明当前类是哪个已经存在类的 子类,存在继承关系。继承是类与类 之间的一种非常重要的关系。

?

1.关于类头---类的修饰符

“public”(公共) ——意味着后续的定义任
何人均可使用。 “private”(私有)——意味着除您自己、类 型的创建者以及那个类型的内部函数成员,其 他任何人都不能访问后续的定义信息。 “protected”(受保护的)——与“private”相 似,只是一个继承的类可访问受保护的成员, 但不能访问私有成员。 “friendly”(友好的)——若某样东西是“友 好的”,意味着它只能在这个包装的范围内使 用(所以这一访问级别有时也叫作“包装访 问”)。“

?

1.关于类头---接口名

接口名跟在implements关键字后面,用来 说明当前类中实现了哪个接口定义的功能 和方法。接口是Java语言用来实现多重继 承的一种特殊机制,我们将在后面详细介 绍它的使用方法。

2.关于类体 类体的定义要包括类的具体内容,包括 类的属性与方法。
class <class name> { <member Field declarations> <member Method declarations> }

2.关于类体---类的属性

Java中声明类属性为简单变量的语法如下:
[修饰符] 变量类型 变量名 [=变量初值];

变量类型和变量名是声明一个变量必 不可少的部分;变量的类型是简单数据类 型,如int、double等。

2.关于类体---类的方法
类中定义的方法通常起到两种作用:一是围绕着类的 属性进行各种操作;二是与其他的类或对象进行数据交流、 消息传递等操作。 Java中声明方法的语法如下: [修饰符] 返回值类型 方法名(参数 列表) throws 例外名1,例外名2,… { 方法体:
类的方法,又称 为成员函数,用 来规定类属性上 的操作,实现类 的内部功能的机 制,同时也是类 与外界进行交互 的重要窗口。

局部变量声明;
语句序列; }

2.关于类体---类的方法
Java语言中定义的方法有两类: 一类是需要程序书写专门的调用命令来调用的方法, 称为程序调用方法,例如isPfime (); 另一类是运行过程中系统自动调用的方法,称为系统方 法,例如我们前面程序中的action()、paint()、init()等。这 两类方法的定义和使用原则有很大差异。

注意:系统调用方法的最大特点: 不需要在程序里书写专门的调用 方法的命令

4.2.2 用户程序自定义类
Java程序员把注意力放在创建称为类的用户 自定义类型(user-defined type)上,类也称 为程序员定义的类型(programmer-defined type),每个类都含有数据和一组操作数据的 方法,类中的数据部分称为实例变量。用户定 义类型(即类)的实例称为对象。
下面是一个简单化的Employee类,在编写今后的职工工资 系统时,会用到它。

class Employee { //构造函数 public Employee(String n,double s,int year,int month,int day) { name = n; //职工姓名 salary = s; //职工工资 hireDay=new GregorianCalendar(year,month-1,day);//出勤数 } //方法1 public String getName() { return name; } //更多的方法 …… //属性的实例 private String name; private double salary; private Date hireDay; }

4.2.3 创建类及类的实例对象
对象是类的一个实例,类是同种对象的抽象, 是创建对象的模板。在程序中创建—个对象将在内 存中开辟一块空间,其中包括该对象的属性和方法。 我们将分步讲述这个类的实现细节。创建对象使 用 关 键 字 运 算 符 new, 例 如 下 面 的 语 句 将 创 建 Employee的对象:

【例4.1】显示三个员工的相关信息

4.2.3 创建类及类的实例对象
在程序中我们构造了一个 Employee 数组,并给它赋给三个 Employee 对 象。关于数组我们将在下一章讲述。 staff[0] = new Employee("张三", 75000,1987, 12, 15); staff[1] = new Employee("李四", 50000,1989, 10, 1); staff[2] = new Employee("王五", 40000,1990, 3, 15);

创建对象以某个类为模板,这个类里定义了哪 些属性和方法,新建的对象就必然在内存里拥有 相应的属性和方法。 可见,相对于简单数据类型,类就是用户自己 定义的复杂的抽象数据类型:而相对于简单变量 ,对象就是复杂的既包括数据又包括方法代码的 复杂数据单位。

4.2.4 构造函数 ? 1.构造函数的一般概念 ? 2.创建自己的构造函数 ? 3.构造函数的作用

4.2.4 构造函数---构造函数的一般概念
要使用对象,首先必须构造它们,并指定它们的初始状态, 然后将方法应用于对象。 在Java程序设计语言中,使用构造函数(constructor)来构 造新的实例。一个构造函数是一个新的方法,它的作用是构造 并初始化对象。 构造函数是类的一种特殊方法,它的特殊性主要体现在如下的 几个方面: (1)构造函数的方法名与类名相同。 (2)构造函数没有返回类型。 (3)构造函数的主要作用是完成对类对象的初始化工作。 (4)构造函数不能由编程人员显式地直接调用。 (5)在创建一个类的新对象的同时,系统会自动调用该类的 构造函数为新对象初始化。

4.2.4 构造函数---创建自己的构造函数
构造函数的名字和类的名字是相同的。当构造 Employee 类的对象时,此构造函数被启动,实例字段赋初值,在 Java中,定义和初始化是统一的——两者缺一不可。 例如,用下面的代码创建Employee类的一个实例时,
new Employee (“James Bond”,100000,1950,1,1);

构造函数的特点有: (1)构造函数和类具有相同的名字。 (2)一个类可以有多个构造函数。 (3)构造函数可以有0个、1个或多个参数。 (4)构造函数没有返回值。 (5)构造函数总是和new运算符一起被调用。

4.2.4 构造函数---构造函数的作用
(1)对象初始化 (2)引入更多的灵活度(变量赋值或更复杂的操作) (3)Java中可以不定义构造函数 Java中可以不定义构造函数,此时系统会自动为 该 系统生成一个默认的构造函数。这个构造函数的名字与类 名相同,它没有任何形式参数,也不完成任何操作。 为了避免失去控制,一般将构造函数的声明与创建分开 处理。

4.3 方法
4.3.1 方法概述
Java 程序是由一个个类定义组成的,类有两个部分: 属性和方法。属性描述类是什么,方法描述类做什么。任 何对象都有独立的内存存储它的属性。类的所有的对象共 享存贮在内存的方法。 换言之:方法是类的主要组成部分。在一个类中,程 序的作用体现在方法中。 方法即是JAVA创建一个有名字的子程序。一个主方法 和若干个子方法构成。主方法调用其他方法,其他方法间 也可互相调用,同一个方法可被一个或多个方法调用任意 次。

4.3.1 方法概述
Java程序的基本结构如下:
引入Java类库; 定义用户类1 { 定义类1的若干变量或对象: 定义类1的方法1; 定义类1的方法2; … 定义类1的方法M1; } 定义用户类2 { 定义类2的若干变量或对象: 定义类2的方法1; 定义类2的方法2; … 定义类2的方法M2 } }

4.3.1 方法概述
Java语言的方法实现子任务处理时,有下面几 个原则与规律: ( 1 )算法中需要细化的步骤、程序中重复的代码 以及重载父类方法都可以定义成类的方法。 (2)界面清晰。 (3)大小适中。 ( 4)方法有两种:一种是标准方法, Java API 提 供了丰富的类和方法,这些方法提供了程序员所需 的许多功能。另一种是用户自定义的方法,以解决 用户专门需要。 ( 5) Java 应用程序中,程序的执行从 main 类开始, 调用其他方法后又回到 main 类,在 main 类中结束 整个程序的运行。

4.3.2 定义方法 ? 1.声明方法头 ? 2.声明方法体
Java中声明方法的语法如下: [修饰符] 返回值类型 方法名(参数 列表) throws 例外名1,例外名2,… { 方法体:
类的方法,又称 为成员函数,用 来规定类属性上 的操作,实现类 的内部功能的机 制,同时也是类 与外界进行交互 的重要窗口。

局部变量声明;
语句序列; }

4.3.2 定义方法------声明方法头 1.声明方法头 方法头一般由方法名、参数列表、返回类型、 方法修饰符和方法抛出的例外五部分组成。
(1)方法名可以是任何有效的标识符,命名规则与标识 符命名规则相同。 (2)类型说明符用来指定方法返回值的类型,方法最多 只能返回一个值。 (3)参数列表是方法的输入接口,它列出了一系列形式 参数的类型和名称,在方法参数表的右括号后加一个分 号是语法错误。 参数表以逗号为分隔符,其中包含了方法被调用时传递 给方法的参数说明。对于方法定义中的每一个参数,方 法调用时必须有一个参量与之对应,而且该参量的类型 必须与对应参数类型相一致。

4.3.2 定义方法------声明方法体
方法头定义了方法的性质,方法体则定义了方法的具体内容。 方法体通常起到两种作用,一是围绕类的属性进行各种操作; 二是与其他的类与对象进行数据交流、消息传递等操作。 在一个方法中定义另一个方法将产生语法错误。

(1)最好避免局部变量“屏蔽”实例变量,在一个类中不使 用同名标识符就可以做到这一点;方法调用中参数用来传递数 值、传递引用,同时方法还可以嵌套、递归调用。 (2 )方法体中如果指定了非 void的返回值类型,方法中就必 须包含一条 return语句保证任何情况下都有返回数值, return 语句后面不能跟任何表达式;

4.3.2 定义方法------声明方法体
例如下面的语句为部门类Department定义了若干方法: Class Department { int m_ DeptNo; //部门编号

String m_DeptName; //部门名称 int m_DeptTotalEmp;//部门雇员数

ManagerEmployee m_DeptMgr; //部门主管
int getDeptNo( ) //获取当前对象的部门号

{ return _DeptNo; } //返回这个对象的部门号

? ? ?

4.3.3 方法的调用 1.系统调用方法 2.程序调用方法
Java语言中调用方法有两类:

一类是需要程序书写专门的调用命令来调用的方法, 称为程序调用方法,例如isPfime ();

另一类是运行过程中系统自动调用的方法,称为系统方 法,例如我们前面程序中的action()、paint()、init()等。这 两类方法的定义和使用原则有很大差异。
注意:系统调用方法的最大特点:不 需要在程序里书写专门的调用方法的 命令

?

4.3.3 方法的调用

在类中调用类自身的方法,可以直接使用这个方法的 名称;调用其他对象或类的方法,则需要使用该对象或类 为前缀。例如在isSameDept( )方法中,语句
if(getDeptNo( )=d.getDeptNo( )) 中通过getDeptNo( )调用当前对象自身的方法并获得当前对 象的部门号,通过d.getDeptNo( )调用形式参数d的方法获 得d的部门编号。这里的形式参数d也是一个Depamnent类 的对象。

?

4.3.3 方法的调用(实例)

boolean setDeptNo(int NewNo) //把当前部门号重新设置称参数值 { if( NewNo >0) { //若给出的新部门号合法

m_DeptNo=NewNo;//修改类属性m_DeptNo
return true; } else return false; //若形式参数给出新部门号非法,返回false } //返回true,声明部门编号修改成功

4.3.4 Java API中的方法 1.Math类的方法 2.Math方法的调用实例

在Java中,Java API(Application Program Interface,也称为Java类库)提 供了丰富的类和方法,可以执行常见的 算术运算、字符串操作、字符操作、输 入输出、错误检查等操作。

4.3.4 Java API中的方法--Math类的方法
方法 说明 x的绝对值(这个方法还有 float,int和long型值的版本) 不小于x的最小整数(向上取整 ) x的余弦函数值(x以弧度为单 位) 指数方法e的x次幂 方法 说明 取x和y中较大者。

abs(x)

max(x,y)

ceil(x)
cos(x)

min (x,y)
pow (x,y)

取x和y中较小者。
x的y次幂 x的正弦函数值(x 以弧度为单位)

exp(x) floor(x ) log(x)

sin (x)

不大于x的最大整数(向下取整 )
x的自然对数(以e为底)

sqrt (x)

x的平方根

?

表4-1 Math类常用的方法

?

表4-1 Math类常用的方法
4.3.4 Java API中的方法--Math方法的调用实例

调用方法的一般格式是先写方法名,然后是左括号,接着 是参数(argument)或由逗号分隔的参数表,最后是右括号。 例如,要计算并且打印出 900 的平方根,调用方法的语句格 式: System.out.prtntln(Math.sqrt(900));

注意,所有 Math 类方法的调用 必须采用方法名前冠以类名 Math和点(.)运算符的形式。

【例 4.2】掷一个六面骰子6000次的程序

4.4 访问控制符
Java 推出了“访问控制修饰符”的概念,允许库创建者声明哪些 东西是客户程序员可以使用的,哪些是不可使用的。 这种访问控制的级别在“最大访问”和“最小访问”的范围之间, 分别包括:public,“defaut”(无关键字),protected以及private。下 面的列表说明访问控制修饰符含义:
类的访问控制修饰符(一种符号) public 公共访问 属性与方法的访问控制修饰符(四种符号) public 公共访问 protected 保护访问 private protected 私有保护访问 priva 私有访问

符号 含义

4.4 访问控制符 ? 4.4.1 公共访问控制符public
Java中类的访问控制符只有一个:public,即公共的。 一个类被声明为公共类,表明它可以被所有的其他类所访 问和引用,这里的访问和引用是指这个类作为整体是可见 和可使用的,程序的其他部分可以创建这个类的对象、访 问这个类内部可见的成员变量和调用它的可见的方法。

一个类作为整体对程序的其他部分可见,并不能代表类 内的所有属性和方法也同时对程序的其他部分可见,前者只 是后者的必要条件,类的属性和方法能否为所有其他类所访 问,还要看这些属性和方法自己的访问控制符。 实例字段应用public关键字,这是一种非常糟糕的做法, 破坏封装。

4.4.2 缺省访问控制符
假如一个类没有访问控制符,说明它具有缺省的 访问控制特性。这种缺省的访问控制权规定该类只能 被同一个包中的类访问和引用,而不可以被其他包中 的类使用,这种访问特性称为包访问性。通过声明类 的访问控制符可以使整个程序结构清晰、严谨,减少 可能产生类间干扰和错误。

4.4.3 私有访问控制符private
用private修饰的属性或方法只能被该类自身所访问 和修改,而不能被任何其他类,包括该类的子类,来获 取和引用。
?

1. 对私有数据访问的方法

例如有三个实例字段,它们含有在 Employee 类的实例内部 被操作的数据。 private string name; private double salary; private Date hireDay; private(私有的)关键字用来确保可以访问这些实 例字段的只能是Employee类本身的方法。

4.4.3 私有访问控制符private ? 2. 私有方法
在实现类时,我们使所有的数据字段都是私 有的,因为公开的数据是危险的。对于方法又是什 么情况呢 ?虽然大多数方法是公开的,但是私有 方法也经常使用。这些方法只能被同一个分离的方 法。 总起来说,在下面的情况下可以选择私有方法: (1)与类的使用者无关的那些方法。 (2)如果类的实现改变了,不容易维护的那些 方法。

4.4.4 保护访问控制符protected
?

?

用protected修饰的成员变量可以被三种类所引 用:该类自身、与它在同一个包中的其他类、在其 他包中的该类的子类。使用 protected 修饰符的主要 作用是允许其他包中的它的子类来访问父类的特定 属性。 protected关键字为我们引入了一种名为“继承” 的概念,它以现有的类为基础,并在其中加入新的 成员,同时不会对现有的类产生影响 —— 我们将这 种现有的类称为“基础类”或者“基本类”( Base Class)。亦可改变那个类现有成员的行为。对于从 一个现有类的继承,我们说自己的新类“扩展” (extends)了那个现有的类。

?

4.4.5 私有保护访问控制符private protected
private和protected按顺序连用构成一个完整的访 问控制符:私有保护访问控制符。用pnvateprotected修 饰的成员变量可以被两种类访问和引用,一种是该类 本身,一种是该类的所有子类,不论这些子类是与该 类在同一个包里,还是处于其他的包中。 相对于protected,privateprotected修饰符把同一包 内的非子类排除在可访问的范围之外,使得成员变量 更专有于具有明确继承关系的类,而不是松散地组合 在一起的包。

访问控制符

private protected public

private ? protected
?

? ? ? ? ? ?
*

当前 类 (D)

当前类的所有子 类 (C)

当前类所在的 包 (B)

所有类 (A)

? ? ?

?

A:所有类 B:包中的类 C:所 有子类

D:本类

E:包中 子类

图4-3 程序中的访问控制区域

4.5静态修饰符、静态字段和方法
?4.5.1

静态修饰符

( 2 )另一种情形是我们需要一个特殊的方法,它没 有与这个类的任何对象关联。也就是说,即使没有创建 对象,也需要一个能调用的方法。

static一项重要的用途 就是帮助我们在不必创建对 象的前提下调用那个方法。

4.5静态修饰符、静态字段和方法
?4.5.1

静态修饰符

static称为静态修饰符,它可以修饰类中的属性和方法。 使用static(静态)关键字,可满足两方面的要求: (1)一种情形是只想用一个存储区域来保存一个特定 的数据——无论要创建多少个对象,甚至根本不创建对 象;被static修饰的属性称为静态属性,这类属性一个最 本质的特点是:它们是类的属性,而不属于任何一个类 的具体对象。换句话说,对于该类的任何一个具体对象 而言,静态属性是一个公共的存储单元,任何一个类的 对象访问它时,取到的都是相同的数值,同样任何一个 类的对象去修改它时,也都是在对同一个内存单元做操 作。

?

4.5.2 静态字段
如果把一个字段定义为static.(静态的),那么在一个类中只能有 一个这类字段。

? 4.5.3 静态常量 静态变量是很少见的。然而,静态常量却很普遍。例如,Math类中定 义了一个静态常量: public class Math { …… public static final double PI=3.1.4159265358979323846; …… } ? ?

4.5.4 静态方法 4.5.5 main方法

4.5.4 静态方法
声明一个方法为static至少有三重含义: (1)使用这个方法时,应该使用类名做前缀,而不是某一 个具体的对象名; (2)static的方法是属于某个对象的方法,在这个对象创建 时对象的方法在内存中拥有自己专用的代码段;而static 的方法是属于整个类的,它在内存中的代码段将随着类 的定义而分配和装载,不被任何一个对象专有; (3)由于static方法是属于整个类的,所以它不能操纵和处 理属于某个对象的成员变量,而只能处理属于整个类的 成员变量。

4.5.5 main方法
main 方法并不对任何对象施加操作。实际上,当程 序开始执行时,还不存在任何对象。静态方法被执行, 并构造程序所需的对象。 提示 每个类都可以有一个main方法。这是对类进行 单元测试的一个很方便技巧。

4.6抽象类与抽象方法
abstract是抽象修饰符,可以用来修饰类或方法。

?
? ?

4.6.1 抽象类
当一个类被声明为abstract时,这个类被称为是抽象类。所谓 抽象类就是没有具体实例对象的类。 针对这个问题, Java 专门提供了一种机制,名为“抽象方 法”。它属于一种不完整的方法,只含有一个声明,没有方 法主体。下面是抽象方法声明时采用的语法: abstract void X(); 人类就是一个典型的抽象类。我们知道,类是对象的集合, 对象是类的实例化,而人类这个类却不存在一个仅属于它的 具体对象。

? ?

?

4.6.2 抽象方法
作为类方法修饰符, abstract 则声明了一 种仅有方法头,而没有具体的方法体和操作 实现的抽象方法。 可见, abstract 方法只有方法头的声明, 而用一个分号来代替方法体的定义:至于方 法体的具体实现,那是由当前类的不同子类 在它们各自的类定义中完成的。
需要特别注意的是,所有的抽象方法,都必须 存在于抽象类之中。 除了抽象方法,抽象类也可以有具体的数据和 方法。例如, Person 类存储人的名字并且用一个 具体的方法来返回它。 在Java编程语言中抽象方法是非常重要的概念。 在接口里你会大量的用到它。

4.7最终类、最终属性、最终方法 与终结器
final 是最终修饰符,它可以修饰类、属性和方法。 另外终结器的关键字与final很相近,一并介绍。

4.7.1 最终类
如果一个类被声明为final,意味着它不能再派生出新的子 类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。 被定义成 final 的类,通常是一些有特殊作用的、用来完成标 准功能的类,将一个类定义为 final 则可以将它的内容、属性 和功能固定下来,与它的类名形成稳定的映射关系,从而保 证引用这个类时所实现的功能是准确无误的。

?

4.7.2 最终属性

无论 static 还是 final 字段,都只能存储一个数据, 而且不得改变。 许多程序设计语言都有自己的办法告诉编译器某 个数据是“常数”。常数主要应用于下述两个方面: (1)编译期常数,它永远不会改变; ( 2 )在运行期初始化的一个值,我们不希望它发生 变化。 可以把一个实例字段定义为 final(不能改变的)。 在对象被构造时,这种字段必须被初始化。即,必 须保证在每一个构造函数结束之前其值已被设定。 以后字段的值不能改变。

4.7.3 最终方法
之所以要使用 final 方法,可能是出于对两方面理由的考 虑。 第一个是为方法“上锁”,防止任何继承类改变它的本来 含义。设计程序时,若希望一个方法的行为在继承期间保持 不变,而且不可被覆盖或改写,就可以采取这种做法。
采用final方法的第二个理由是程序执行的效率。

4.8 本章小结
?
?

1.关于类
必须要学会如何创建、引用和继承已建立的类。 Java 程序 的基本单位是类。类的定义可以看作是建立对象的原形。 你建立类之后,就可用它来建立许多你需要的对象。 Java 把每一个可执行的成分都变成类,使面向对象发展到极点。 类的基本定义方法如下: [修饰符] class 类名 [extends 父类] [implements 接口名] { 类成员变量声明 类方法声明 }

? ?

?
? ? ?

2.关于对象
?

?

对象是类的一个实例,类是同种对象的抽象 综合,是创建对象的模板。在程序中创建 — 个对象将在内存中开辟一块空间,其中包括 该对象的属性和方法。 创建对象使用关键字运算符new。

?

3.关于构造函数
构造函数是类的一种特殊方法,它的特殊性主要体现 在如下的几个方面: (1)构造函数的方法名与类名相同。 (2)构造函数没有返回类型。 ( 3 )构造函数的主要作用是完成对类对象的初始化 工作。 (4)构造函数不能由编程人员显式地直接调用。 ( 5 )在创建一个类的新对象的同时,系统会自动调 用该类的构造函数为新对象初始化。

4.关于方法 ? 4.关于方法
? ? ? ? ? ?

?
? ?

方法的基本组成部分包括方法头与方法体两部分,下面便是 它最基本的形式: [修饰符]返回类型方法名(参数列表) throws 例外名 1, 例外名2…… { 方法体: 局部变量声明; 语句序列; } ( 1)算法中需要细化的步骤、程序中重复的代码以及重载 父类方法都可以定义成类的方法。 ( 2)方法通常具有相对独立的功能和明确的输入输出接口。

4.关于方法
? ?

?

?

(3)定义方法分定义方法头和方法体两部分。 (4)方法头包括方法名、参数列表、返回值类型、方法 修饰符和方法抛出的例外列表。重载方法的方法头要与其 父类方法的方法头基本一致。 ( 5 )方法命名要遵循 Java 对标识符的规定:以字母、 $ 或—开头,由字母、数字组成。 (6)参数列表是方法的输入接口,它列出了一系列形式 参数的类型和名称,方法通过它们接收外界输入的数据; 参数列表必须括在方法名后面的小括号里,小括号是方法 的标志,如果方法不需要输入数据,小括号里可以为空。

?

5.其它
(1)永远保持数据私有。这是首先需要考虑的最重要的一点: ( 2 )永远初始化数据。 Java 并不对本地变量初始化,但它会初 始化对象中的实例字段。但是永远不要依赖于默认值; (3)不要在一个类中使用太多的基本类型。 ( 4 )用标准形式对类定义。我们总是以下面的次序列出类的内 容: 公开部件;包作用域部件;私有部件 在每一部分内我们列出次序如下: 实例方法;静态方法;实例字段;静态字段 (5)把有太多职责的类分解。 (6)使类和方法的名字反映它们的职责。

( 7 )类及其成员修饰符关系:下表是为了帮助理 解而整理,请结合前面的内容,加深理解。
类修饰符 Public 公共类 所有其他类皆 可访问 本包中其他类 和所有其他包 中的子类 缺省 本包中 的类可 以访问 本包中 的其他 类 仅该类 当前包 中子类 abstract 抽象类无 对象 Final 最终类

类成员 public

成员 访问 控制 符

protecte d private

protecte d private
缺省

仅该类的所有 子类

仅该类本身可以访问
本包中的类可以访问

非法