Lesson 4,Classes and Objects (Part 1)
类与对象 (上 )
LiFan(李凡)
Chengdu University of Information Technology
The Department Of Computer Science
2005
Classes In Java Language
? The class is the fundamental programming unit
of the Java programming language,(类是 Java
语言的基本编程单元 )
? Classes provide the structure for objects and
the mechanisms to manufacture objects from a
class definition.(类提供了对象的结构,可以
根据类的定义创建对象 )
? Each object is an instance of a class.(每一个
对象都是某个类的实例 )
Declaring Classes (声明类 )
? 声明类使用如下的语法,
<修饰符 > class <类名 >{
//…class members…
}
? 保留字 class用于声明类
? 类名用于标识类,类名的第一个字母必须是
Unicode字母或下划线,_”
class Body{
public long idNum;
public String name;
public Body orbits;
public static long nextID=0;
}
Class Modifiers (类的修饰符 )
? 类的修饰符主要用于描述类的可见性、可扩
展性和计算精度等属性,可用修饰符如下,
public — 声明为 public的类可以在其它任何类中
被使用,如果没有声明为 public,则类只能在类所
在的包中可使用
abstract — 用于声明抽象类,抽象类不能为实例
化,抽象类通常声明了需要子类实现的抽象方法
final — 声明为 final的类不能被继承
strictfp — 声明为 strictfp的类中的浮点计算在所
有平台的 JVM中都要求严格相同
注意:一个类不能同时声明为 abstract和 final的
Class Members (类的成员 )
? 类的成员是指可以声明在类体中构成类的结
构的各种组成部分,类可以有成员,
域 (Fields) — 域是声明在类体中的各种变量,域可以分
为类的域和类的对象的域,分别表示类或对象的状态
方法 (Methods) — 方法是一段可执行的代码,方法可以
分为类的方法和类的对象的方法,分别表示类或类的对象
的行为
嵌套类 (Nested Classes) — 声明在类体中的类
嵌套接口 (Nested Interfaces) — 声明在类体中的接口
Fields (域 )
? 域是声明在类体中的变量 (variables),声明
域的语法如下,
<修饰符 > <类型 > <域名 >;
<修饰符 > <类型 > <域名 >=<初始值表达式 >;
class Body{
public long idNum;
public String name;
public Body orbits;
public static long nextID=0;
}
Field Modifiers (域的修饰符 )
? 域的修饰符主要用于描述域的可见性、作用范围以及
其它特性,域的修饰符可以有以下几种,
访问控制修饰符 — 包括 public,protected,private,
如果不指定,则域使用默认访问修饰符
static — 声明为 static的域是类的域,否则为对象的域
final — 声明为 final的域只能被初始化一次
transient — 声明为 transient的域不能被序列化
volatile — 声明为 volatile的域被多个线程访问时永远
提供域的最新值
注意:一个域不能同时声明为 volatile和 final的
Field Types (域的类型 )
? 域可以被声明为基本数据类型和类类型
? 基本数据类型包括,
布尔类型 boolean
字符类型 char
整数类型 byte short int long
浮点类型 float double
? 类类型包括各种类、抽象类和接口
Field Initialization (域的初始化 )
? Java语言是一种强类型语言,所有变量 (域和
方法中的局部变量 )必须被初始化后才能使用
? 域的初始化可以使用两种方式:隐式和显式
? 隐式初始化:被声明为域的变量取其类型的
默认值 <修饰符 > <类型 > <域名 >;
? 显式初始化:由初始化表达式计算得到域的
初值 <修饰符 > <类型 > <域名 >=<初始值表达式 >;
域类型的默认值
类型 初始值
boolean false
char ‘\u0000’
byte 0
short 0
int 0
long 0
float 0.0f
double 0.0
Object Reference null
class Body{
public long idNum;
public String name;
public Body orbits;
public static long nextID=5;
}
0
null
null
5
Static Fields (静态域 )
? 声明为 static的域,称为静态域或类变量
(class variables),没有被 static修饰的域,称
为非静态域或实例变量 (instance variables)
? 静态域类似于类的全局变量,用于表示类本
身的状态,被类的所有对象共享
? 静态域可以通过类名或对象两种方式访问,
一般通过类名访问
System.out.println(Body.nextID)
final 域
? 被声明为 final的域只能被初始化一次,即不能再次
被赋值
? final域一般用于声明那些类或对象的不可变的属性,
比如常量
? 被同时声明为 static和 final的域又称为命名常量
(Named Constant),用于表示那些在类的使用范围内
有意义的常数或不变对象,命名常量的变量名通常
都是大写字母,单词之间用下划线,_”连接
? final域如果是对象引用 (object reference),仍然可以
通过该域去改变所引用对象的状态
Access Control (域的访问控制 )
? Encapsulation and Data-hiding (封装和数据隐藏 )
? 通过访问控制修饰符 (access modifiers)可以限制域
在类或对象外部的可见性
public — 共有的,域在任何地方都可以访问
protected — 受保护的,域仅在类体中、子类类
体中或同包的其它类类体中可访问
private — 私有的,域仅在类体中可访问
package — 默认的,没有任何访问修饰符修饰的
域,仅在类体中、同包的其它类类体中可访问
Class Constructor (类的构造函数 )
? 构造函数用于初始化对象的状态,一般与保
留字 new 一起使用,用于创建类的对象
? 构造函数与一般的方法相似,但没有返回值,
而且构造函数必须与类同名
? 如果声明类时没有声明构造函数,则类将自
动拥有一个无参数的默认构造函数
? 一个类可以声明多个构造函数,但构造函数
的参数必须不同
class Body{
public long idNum;
public String name=“<unnamed>”;
public Body orbits=null;
public static long nextID=0;
Body(){
idNum=nextID++;
}
Body(String name){
this.name=name;
idNum=nextID++;
}
}
this 保留字
? this保留字在类体中有两种用途,
(1) 在类的构造函数中用于调用类的另
一个构造函数 this() 或 this(…)
(2) 在类的构造函数或非静态方法中作
为对当前对象本身的引用
class Body{
……,
Body(){
idNum=nextID++;
}
Body(String name){
this.name=name;
idNum=nextID++;
}
}
class Body{
……,
Body(){
idNum=nextID++;
}
Body(String name){
this();
this.name=name;
}
}
Initialization Block (初始化块 )
? 初始化块使用花括号对,{,}”包含的一系
列语句,初始化块一般声明在类的构造函数
之前
? 在创建对象时,初始化块中的语句将在类的
构造函数调用前被执行
? 初始化块中可以抛出可检查性异常,只要该
异常在构造函数的异常列表中被声明
class Body{
public long idNum;
public String name=“<unnamed>”;
public Body orbits=null;
public static long nextID=0;
{
idNum=nextID++;
}
Body(String name){
this.name=name;
}
}
Static Initialization Block (静态初始化块 )
? 被声明为 static的初始化块,称为静态初始化
块或静态初始化器 (Static Initializer)
? 静态初始化块中的语句只能访问类的静态域,
并且不能抛出任何异常
? 在类被类装载器 (Class Loader)第一次加载的
过程将执行静态初始化块中的语句,以后将
不再被执行
? 静态初始化块通常用于初始化类的命名常量
和静态域
class Primes{
static int[] knowPrimes=new int[4];
static{
knownPrimes[0]=2;
for(int i=1;i<knownPrimes.length;i++)
knownPrimes[i]=nextPrimes();
}
……
}
Creating Objects (创建对象 )
? 类的对象,又称为类的实例,一般通过使用保
留字 new和类的构造函数来创建
Body unnamed=new Body();
Body earth=new Body(“Earth”);
? 使用 new创建对象的过程中可能启动垃圾收集,
如果 JVM发现垃圾收集后仍没有足够的内容来
创建对象,将抛出 OutOfMemberyError错误
Access Object Fields (访问对象的域 )
? 在对象被创建后,就可以通过对象的引用
(object reference)来访问对象的域
? 对象的域和类的域,都是通过句点,.”来访

Body earth=new Body(“Earth”);
earth.idNum=Body.nextID;
System.out.println(earth.name);
Assignments (作业 )
? 如果类 X的静态初始化中调用了类 Y的静态
方法,而类 Y的静态初始化块中由调用了类
X的静态方法,这种情况叫循环静态初始化,
请分析这种情况下类 X和类 Y的初始化过程。
(周一前上传 )
? 完成课本第二章的下列习题
P37 练习 2.1 P40 练习 2.3 P41 练习 2.4
P43 练习 2.5 P48 练习 2.7