在一个面向对象系统中:
对象是对现实世界中事物的抽象,是 Java 程序的基本封装单位,是类的实例;
类是对象的抽象,是数据和操作的封装体;
属性是事物静态特征的抽象,在程序中用数据成员加以描述;
操作是事物动态特征的抽象,在程序中用成员方法来实现。
把客观世界中的事物映射到面向对象的程序设计中就是对象。
对象是面向对象程序设计中用来描述客观事物的程序单位。
客观世界中的许多对象,无论其属性还是其行为常常有许多共同性,抽象出这些对象的共同性便可以构成类。
类是对象的抽象和归纳,对象是类的实例。
1. 抽象原则
抽象(Abstraction)就是从被研究对象中舍弃个别的、非本质的、或与研究主旨无关的次要特征,而抽取与研究工作有关的实质性内容加以考察,形成对所研究问题正确的、简明扼要的认识。
1.1 过程抽象
软件开发者可以把任何一个完成确定功能的操作序列都看作是一个单一的实体,尽管它实际上可能是由一系列更低级的操作完成的。
过程抽象可以把复杂的功能一层层分解为更简单的子模块,这样开发者可在不同层次上考虑问题,如在高层上就不必关心低层的细节问题。
面向过程的程序设计采用的是过程抽象方法。
过程抽象有利于控制、降低整个程序的复杂度,但是,这种方法允许在全系统的范围内进行功能的描述,本身自由度大,难于规范化和标准化,不易保证软件的质量,而且操作起来也有一定难度。
1.2 数据抽象
数据抽象把系统中需要处理的数据和施加于这些数据之上的操作结合在一起,根据功能、性质、作用等因素抽象成不同的抽象数据类型。
每个抽象数据类型既包含了数据,也包含了针对这些数据的授权操作,并限定数据的值只能由这些操作来观察和修改。
因此,数据抽象是相对于过程抽象更为严格、更为合理的抽象方法。
面向对象程序设计就是采用数据抽象这一方法来构建程序中的类和对象的。
它强调把数据和操作结合为一个不可分的系统单位 - 对象,对象的外部只需要知道这个对象能做什么,而不必知道它是如何做的。
2. 对象
把客观世界这一事实映射到面向对象的程序设计中,则把问题域中的事物抽象成了对象(Object),事物的静态特征(属性)用一组数据来描述,事物的动态特征(行为)则用一组方法来刻画。
对象具有以下特征:
对象标识:即对象的名字,是用户和系统识别它的唯一标志。对象标识有“外部标识”和“内部标识”之分。外部标识供对象的定义者或使用者用,内部标识供系统内部唯一地识别每一个对象。在计算机世界中,可以把对象看成计算机存储器中一块可标识的区域,它能保存固定或可变数目的数据(或数据的集合)。
属性:即一组数据,用来描述对象的静态特征。在 Java 程序中,把这一组数据称为数据成员。
方法:也称为服务或操作,它是对象动态特征(行为)的描述。每一个方法确定对象的一种行为或功能。在 Java 程序中称为成员方法。
在 Java 程序中,类是创建对象的模板,对象是类的实例,任何一个对象都是隶属于某个类的。
Java 程序设计是从类的设计开始的。
3. 类
在面向对象的编程语言中,类是一个独立的程序单位,是具有相同属性和方法的一组对象的集合。
类的概念使我们能对属于该类的全部对象进行统一的描述。
在定义对象之前应先定义类。
描述一个类需要指明下述三个方面内容:
类标识:类的一个有别于其他类的名字。
属性说明:用来描述相同对象的静态特征。
方法说明:用来描述相同对象的动态特征。
4. 类与对象的关系
类给出了属于该类的全部对象的抽象定义,而对象则是符合这种定义的一个实体。
可以把类与对象之间的关系看成是抽象与具体的关系。
在面向对象的程序设计中,对象被称作类的一个实例(Instance),而类是对象的模板(Template)。
类是多个实例的综合抽象,而实例又是类的个体实物。
由于对象是类的实例,因此在定义对象之前应先定义类。在定义了类之后,才可以在类的基础上创建对象。
5. 定义类的一般格式
进行 Java 程序设计,实际上就是定义类的过程。
一个 Java 源程序文件往往是由许多个类组成的。
从用户的角度看,Java 源程序中的类分为两种:
系统定义的类:即 Java 类库,它是系统定义好的类。Java 语言由语法规则和类库两部分组成,语法规则确定 Java 程序的书写规范;类库则提供了 Java 程序与运行它的系统软件(Java 虚拟机)之间的接口。
用户自定义类:系统定义的类虽然实现了许多常见的功能,但是用户程序仍然需要针对特定问题的特定逻辑来定义自己的类。
在 Java 程序中,用户自定义类的一般格式如下:
class 类名
{
数据成员
成员方法
}
类的结构是由类说明和类体两部分组成的。
类的说明部分由关键字 class 与类名组成,类名的命名遵循 Java 标识符的定义规则。
类体是类声明中花括号所包括的全部内容,它又是由数据成员(属性)和成员方法(方法)两部分组成。
数据成员描述对象的属性;成员方法则刻画对象的行为或动作,每一个成员方法确定一个功能或操作。
6. Java 类库
Java 的类库是系统提供的已实现的标准类的集合,是 Java 编程的 API(Application Program Interface),它可以帮助开发者方便、快捷地开发 Java 程序。
Java 基础类库(JFC)是由 Sun 公司提供的,也有少量则是由其他软件开发商以商品形式提供的。
学习 Java 语言程序设计,一是要学习其语法规则中的基本数据类型、基本运算和基本语句等,这是编写 Java 程序的基本功;二是要学习使用类库,这是提高编程效率和质量的必由之路,甚至从一定程度上来说,能否熟练自如地掌握尽可能多的 Java 类库,决定了一个 Java 程序员编程能力的高低。
在 Java 系统中,系统定义好的类根据实现的功能不同,可以划分成不同的集合。每个集合称为一个包,所有包称为类库。根据功能的不同,Java 类库的每个包中都有若干个具有特定功能和相互关系的类和接口。
使用类库中系统定义好的类有三种方式:一是直接使用系统类;二是继承系统类,在用户程序里创建系统类的子类;三是创建系统类的对象。
无论采用哪种方式,使用系统类的前提条件是这个系统类应该是用户程序可见的类。为此用户程序需要用 import 语句引入它所用到的系统类或系统类所在的包。
类库包中的程序都是字节码形式的程序,利用 import 语句将一个包引入到程序里,就相当于在编译过程中将该包中的所有系统类的字节码加入到用户的 Java 程序中,这样用户的 Java 程序就可以使用这些系统类及其中的各种功能了。
Java 程序常用的包:
java.lang 包
Java 语言的核心类库,包含了运行 Java 程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等。
每个 Java 程序运行时,系统都会自动地引入 java.lang 包,所以这个包的加载是缺省的。
java.io 包
包含了实现 Java 程序与操作系统、用户界面以及其他 Java 程序之间进行数据交换所使用的类,如基本输入/输出流、文件输入/输出流、过滤输入/输出流、管道输入/输出流、随机输入/输出流等。
凡是需要完成与操作系统有关的较底层的输入/输出操作的 Java 程序,都要用到 java.io 包。
java.awt 包
它是 Java 语言用来构建图形用户界面(GUI)的类库,包括了许多界面元素和资源。
java.awt 包主要在三个方面提供界面设计支持:一是低级绘图操作;二是图形界面组件和布局管理;三是界面用户交互控制和事件响应。
java.awt.event 包
它是对 JDK 1.0 版本中原有的 Event 类的一个扩充,它使得程序可以用不同的方式来处理不同类型的事件,并使每个图形界面的元素本身可以拥有处理它上面事件的能力。
java.awt.image 包
用来处理和操作来自于网上的图片的 Java 工具类库。
java.applet 包
用来实现运行于 Internet 浏览器中的 Java Applet 的工具类库,它仅包含少量几个接口和一个非常有用的类 java.applet.Applet。
java.net 包
它是 Java 语言用来实现网络功能的类库。
目前已经实现的 Java 网络功能主要有:底层网络通信;编写用户自己的 Telnet、FTP、邮件服务等实现网上通信的类;用于访问 Internet 上资源和进行 CGI 网关调式的类。
利用 java.net 包中的类,开发者可以编写自己的具有网络功能的程序。
java.rmi 包、java.rmi.registry 包和 java.rmi.server 包
这三个包用来实现 RMI(Remote Method Invocation,远程方法调用)功能。
利用 RMI 功能,用户程序可以在远程计算机(服务器)上创建对象,并在本地计算机(客户机)上使用这个对象。
java.util 包
包括了 Java 语言中的一些低级的实用工具,如时间的处理、变长数组的处理、栈和哈希(散列)表的处理。
java.sql 包
它是实现 JDBC(Java Database Connection)的类库。
利用这个包可以使 Java 程序具有访问不同种类的数据库的功能。
只要安装了合适的驱动程序,同一个 Java 程序不需要修改就可以存取、修改这些不同的数据库中的数据。
JDBC 的这种功能,再加上 Java 程序本身具有的平台无关性,大大拓宽了 Java 程序的应用范围,特别是商业应用的使用领域。
java.security 包、java.security.acl 包、java.security.interfaces 包
这三个包提供更完善的 Java 程序安全性控制和管理,利用它们可以对 Java 程序加密,也可以把特定的 Java Applet 标记为“可信赖的”,使它能够具有与 Java Application 相近的安全权限。
java.awt.peer 包
它是实现 Java 语言跨平台特性的手段之一。
其作用是将不同的平台包裹、隐藏起来,使这些平台在用户程序面前呈现基本相同的面貌。
java.util.zip 包
用来实现文件压缩功能。
java.awt.datatransfer 包
提供了处理数据传输的工具类,如剪贴版、字符串发送器等。
java.lang.reflect 包
提供了用于反射对象的工具,反射允许程序监视一个正在运行的对象并获得它的构造函数、方法和属性。
java.corba 包、java.corba.orb 包
这两个包将 CORBA(Common Object Request Broker Architecture,一种标准化接口体系)嵌入到 Java 环境中,使得 Java 程序可以存取、调用 CORBA 对象,并与 CORBA 对象共同工作。
这样,Java 程序就可以方便、动态地使用已经存在的由 Java 或其他面向对象语言开发的部件,简化软件的开发。
7. 创建对象
7.1 声明对象
声明对象就是确定对象的名称,并指明该对象所属的类。
声明格式如下:
类名 对象名表;
类名是指对象所属类的名字,它是在声明类时定义的;
对象名表是指一个或多个对象名,若为多个对象名时,用逗号进行分隔。
声明对象的作用是为将来的编译过程提供必要的信息。
7.2 建立对象
建立对象,实际上就是用 Java 提供的 new 关键字为对象分配存储空间。
在声明对象时,只确定了对象的名称和它所属的类,并没有为对象分配存储空间,此时对象还不是类的实例。
只有通过建立对象这一步,才为对象分配内存,使该对象成为类的实例。
建立对象的格式如下:
对象名=new 构造方法();
也可以在声明对象的同时建立对象,这称为创建一个对象,其格式如下:
类名 对象名=new 构造方法();
关键字 new 的作用是建立对象,为对象分配存储空间。
7.3 初始化对象
初始化对象是指由一个类生成对象时,为这个对象确定初始状态,即为它的数据成员赋初始值的过程,当然,它主要由一些赋值语句组成。
由于初始化操作是最常用的操作之一,为简化这一过程,Java 还提供了专用的方法来完成它,这个方法被称为构造方法。
8 使用对象
一个对象可以有许多属性和多个方法。
在面向对象的系统中,一个对象的属性和方法被紧密地结合成一个整体,二者是不可分割的,并且限定一个对象的属性值只能由这个对象或它的方法来读取和修改。
当一个对象被创建后,这个对象就拥有了自己的数据成员和成员方法,我们可以通过引用对象的成员来使用对象。
对象的数据成员的引用方式如下:
对象名.数据成员名;
对象的成员方法的引用方式如下:
对象名.成员方法名(参数表);
9 对象的初始化与构造方法
构造方法是一个类的方法中方法名与类名相同的类方法。
每当使用 new 关键字创建一个对象,为新建对象开辟了内存空间之后,Java 系统将自动调用构造方法初始化这个新建对象。
构造方法是类的一种特殊方法,它的特殊性主要体现在以下几个方面:
构造方法的方法名与类名相同。
构造方法是类的方法,它能够简化对象数据成员的初始化操作。
不能对构造方法指定类型,它有隐含的返回值,该值由系统内部使用。
构造方法一般不能由编程人员显式地直接调用,在创建一个类的对象的同时,系统会自动调用该类的构造方法将新对象初始化。
构造方法可以重载,即可定义多个具有不同参数的构造方法。
构造方法可以继承,即子类可以继承父类的构造方法。
如果用户在一个自定义类中未定义该类的构造方法,系统将为这个类定义一个缺省的空构造方法。这个空构造方法没有形式参数,也没有具体语句,不能完成任何操作。但在创建一个类的新对象时,系统要调用该类的构造方法将新对象初始化。
特殊情况下,构造方法中的参数名可能与数据成员名相同,此时,在构造方法中可用下面两种形式之一来区分数据成员名与参数名:
默认法。当构造方法的参数名与数据成员名相同时,将赋值号左边的标识符默认为对象的数据成员名,而赋值号右边的标识符为参数。
使用代表本类对象的关键字 this 指出数据成员名之所在。