`
bulote
  • 浏览: 1297174 次
文章分类
社区版块
存档分类
最新评论

类与对象的概念

 
阅读更多
第4章 类 与 对 象
4.1
类与对象的概念
4.2
封装机制
4.3
数据成员
4.4
成员方法
第4章 类 与 对 象
4.1
类与对象的概念
程序设计所面对的问题域——客观世界,是由许多事物构
成的,这些事物既可以是有形的(比如一辆汽车),也可以是无形
的(比如一次会议)。把客观世界中的事物映射到面向对象的程序
设计中就是对象。对象是面向对象程序设计中用来描述客观事
物的程序单位。客观世界中的许多对象,无论其属性还是其行
为常常有许多共同性,抽象出这些对象的共同性便可以构成类。
所以,类是对象的抽象和归纳,对象是类的实例。
第4章 类 与 对 象
4.1.1
抽象原则
所谓抽象(abstraction),就是从被研究对象中舍弃个别的、
非本质的、或与研究主旨无关的次要特征,而抽取与研究工作
有关的实质性内容加以考察,形成对所研究问题正确的、简明
扼要的认识。例如,“马”就是一个抽象的概念,实际上没有任
何两匹马是完全相同的,但是我们舍弃了每匹马个体之间的差
异,抽取其共同的、本质性的特征,就形成了“马”这个概念。
抽象是科学研究中经常使用的一种方法,是形成概念的必
要手段。在计算机软件开发领域,抽象原则的运用非常广泛,
概括起来,可分为过程抽象和数据抽象两类。
第4章 类 与 对 象
1.
过程抽象
过程抽象是指:软件开发者可以把任何一个完成确定功能
的操作序列都看作是一个单一的实体,尽管它实际上可能是由
一系列更低级的操作完成的。运用过程抽象,软件开发者可以
把一个复杂的功能分解为一些子功能(模块),如果子功能仍比较
复杂,则可以进一步分解。这使得开发者可以在不同的抽象层
次上考虑问题,在较高层次上思考时可以不关心较低层次的实
现细节。面向过程的程序设计采用的是过程抽象方法。
使用过程抽象有利于控制、降低整个程序的复杂度,但
是,这种方法允许在全系统的范围内进行功能的描述,本身自
由度大,难于规范化和标准化,不易保证软件的质量,而且操
作起来也有一定难度。
第4章 类 与 对 象
2.
数据抽象
数据抽象把系统中需要处理的数据和施加于这些数据之上
的操作结合在一起,根据功能、性质、作用等因素抽象成不同
的抽象数据类型。每个抽象数据类型既包含了数据,也包含了
针对这些数据的授权操作,并限定数据的值只能由这些操作来
观察和修改。因此,数据抽象是相对于过程抽象更为严格、更
为合理的抽象方法。
面向对象的程序设计就是采用数据抽象这一方法来构建程
序中的类和对象的。它强调把数据和操作结合为一个不可分的
系统单位——对象,对象的外部只需要知道这个对象能做什
么,而不必知道它是如何做的。
第4章 类 与 对 象
4.1.2
对象
只要仔细研究程序设计所面对的问题域——客观世界,我
们就可以看到:客观世界是由一些具体的事物构成的,每个事
物都具有自己的一组静态特征(属性)和一组动态特征(行为)。例
如,一辆汽车有颜色、型号、马力、生产厂家等静态特征,又
具有行驶、转弯、停车等动态特征。把客观世界的这一事实映
射到面向对象的程序设计中,则把问题域中的事物抽象成了对
象(Object),事物的静态特征(属性)用一组数据来描述,事物的
动态特征(行为)则用一组方法来刻画。因此,对象具有下述特
征:
第4章 类 与 对 象
(1) 对象标识:即对象的名字,是用户和系统识别它的唯一
标志。例如,汽车的牌照可作为每一辆汽车对象的标识。对象
标识有“外部标识”和“内部标识”之分。外部标识供对象的定义
者或使用者用,内部标识供系统内部唯一地识别每一个对象。
在计算机世界中,我们可以把对象看成计算机存储器中一块可
标识的区域,它能保存固定或可变数目的数据(或数据的集合)。
(2) 属性:即一组数据,用来描述对象的静态特征。例如,
汽车的颜色、型号、马力、生产厂家等。在Java程序中,把这
一组数据称为数据成员。
第4章 类 与 对 象
(3) 方法:也称为服务或操作,它是对象动态特征(行为)的
描述。每一个方法确定对象的一种行为或功能。例如,汽车的
行驶、转弯、停车等动作可分别用move( )、rotate( )、stop( )等
方法来描述。为避免混淆,本书中把方法称为成员方法。
在Java程序中,类是创建对象的模板,对象是类的实例,任
何一个对象都是隶属于某个类的。Java程序设计是从类的设计开
始的,所以,在进一步讲述对象的知识之前,必须先掌握类的
概念。
第4章 类 与 对 象
4.1.3

对象是对事物的抽象,而类是对对象的抽象和归纳。人类在
认识客观世界时经常采用的思维方法就是把众多的事物归纳成一
些类。分类所依据的原则是抽象,即抽象出与当前目标有关的本
质特征,而忽略那些与当前目标无关的非本质特征,从而找出事
物的共性,把具有共同性质的事物归结为一类,得出一个抽象的
概念——类。
在面向对象的编程语言中,类是一个独立的程序单位,是具
有相同属性和方法的一组对象的集合。类的概念使我们能对属于
该类的全部对象进行统一的描述。例如,“树具有树根、树干、
树枝和树叶,它能进行光合作用”。这个描述适合于所有的树,
从而不必对每棵具体的树都进行一次这样的描述。因此,在定义
对象之前应先定义类。描述一个类需要指明下述三个方面内容:
第4章 类 与 对 象
(1)
类标识:类的一个有别于其他类的名字,这是必不可少的。
(2)
属性说明:用来描述相同对象的静态特征。
(3)
方法说明:用来描述相同对象的动态特征。
第4章 类 与 对 象
例如,下面是对dog类进行的描述:
class dog // class指出这是一个类,dog是类标识
{
String name;
int AverageWeight; 类的属性(静态特征)
int AverageHeight;
public void move( )
{ …… } 类的方法(动态特征)
public void ShowDog( )
{ …… }
}
dog类
第4章 类 与 对 象
4.1.4
类与对象的关系
类给出了属于该类的全部对象的抽象定义,而对象则是符
合这种定义的一个实体。类与对象之间的关系就如同一个模具
与用这个模具铸造出来的铸件之间的关系一样。也就是说,我
们可以把类与对象之间的关系看成是抽象与具体的关系。在面
向对象的程序设计中,对象被称作类的一个实例(instance),而
类是对象的模板(temp1ate)。类是多个实例的综合抽象,而实例
又是类的个体实物。如图4.1所示为类与对象的关系。
第4章 类 与 对 象
图4.1 类与对象的关系
抽象
实例化
对象:刘丽
静态特征:刘丽

讲师
890.00
动态特征:授课
评职称
调工资
数据值
执行的
操作
方法名数据结构
类:教师
属性:姓名
性别
职称
工资
服务:授课
评职称
调工资
第4章 类 与 对 象
4.1.5
定义类的一般格式
(1) 系统定义的类,即Java
类库,它是系统定义好的类。类
库是Java语言的重要组成部分。Java语言由语法规则和类库两部
分组成,语法规则确定Java程序的书写规范;类库则提供了Java
程序与运行它的系统软件(Java虚拟机)之间的接口。Java类库是
一组由它的发明者SUN公司以及其他软件开发商编写好的Java程
序模块,每个模块通常对应一种特定的基本功能和任务,且这
些模块都是经过严格测试的,因而也总是正确有效的。当自己
编写的Java程序需要完成其中某一功能的时候,就可以直接利用
这些现成的类库,而不需要一切从头编写,这样不仅可以提高
编程效率,也可以保证软件的质量。
第4章 类 与 对 象
(2) 用户自己定义的类。系统定义的类虽然实现了许多常见
的功能,但是用户程序仍然需要针对特定问题的特定逻辑来定义
自己的类。用户按照Java的语法规则,把所研究的问题描述成
Java程序中的类,以解决特定问题。进行Java程序设计,首先应
学会怎样定义类。
在Java程序中,用户自己定义类的一般格式如下:
class 类名
{
数据成员
成员方法
}
第4章 类 与 对 象
图4.2
类的图形表示
类名
数据成员
成员方法
第4章 类 与 对 象
可以看出,类的结构是由类说明和类体两部分组成的。类
的说明部分由关键字class与类名组成,类名的命名遵循Java标
识符的定义规则;类体是类声明中花括号所包括的全部内容,
它又由数据成员(属性)和成员方法(方法)两部分组成。数据成员
描述对象的属性;成员方法刻画对象的行为或动作,每一个成
员方法确定一个功能或操作。图4.2为类的图形表示。
第4章 类 与 对 象
【示例程序c4_1.java】
import java.awt.*; //引用系统类库中的awt包
import java.applet.*; //引用系统类库中的applet包
public class c4_1 extends Applet // 由applet类派生的c4_1类
{ int a=5; //数据成员a
double b=23.4; //数据成员b
public void paint(Graphics g) //成员方法paint
{ //以下使用g对象的drawString方法
g.drawString("a="+a,25,25);
g.drawString("b="+b,25,35);
}
}
第4章 类 与 对 象
图4.3 程序c4_1的运行结果
第4章 类 与 对 象
4.1.6 Java
类库
要想掌握好Java的面向对象编程技术,编写出高质量的程
序,必须对Java的类库有足够的了解。Java的类库是系统提供的
已实现的标准类的集合,是Java编程的API(Application Program
Interface),它可以帮助开发者方便、快捷地开发Java程序。Java
类库的主要部分是由它的发明者SUN公司提供的,这些类库称为
基础类库(JFC),也有少量则是由其他软件开发商以商品形式提供
的。有了类库中的系统类,编写Java程序时就不必一切从头做
起,避免了代码的重复和可能的错误,也提高了编程的效率。一
个用户程序中系统标准类使用得越多、越全面、越准确,这个程
序的质量就越高;相反,离开了系统标准类和类库,Java程序几
乎寸步难行。
第4章 类 与 对 象
所以,学习Java语言程序设计,一是要学习其语法规则,
即第2~3章中的基本数据类型、基本运算和基本语句等,这是
编写Java程序的基本功;二是要学习使用类库,这是提高编程
效率和质量的必由之路,甚至从一定程度上来说,能否熟练自
如地掌握尽可能多的Java类库,决定了一个Java程序员编程能力
的高低。我从第7章起主要讲述类库的使用。
第4章 类 与 对 象
在Java系统中,系统定义好的类根据实现的功能不同,可
以划分成不同的集合。每个集合称为一个包,所有包合称为类
库。根据功能的不同,Java类库的每个包中都有若干个具有特
定功能和相互关系的类和接口。例如,java.lang
包中包含了运
行Java
程序必不可少的系统类,它们包括基本数据类型、基本
数学方法、字符串处理、线程、异常处理等类;java.awt
包中
包括了Java
语言用来构建图形用户界面(GUI)
的类库。
第4章 类 与 对 象
使用类库中系统定义好的类有三种方式:一种是直接使用
系统类,例如在字符界面向系统标准输出设备输出字符串时使
用的方法System.out.println( ),就是系统类System的动态属性
out的方法;另一种方式是继承系统类,在用户程序里创建系统
类的子类,例如每个Java Applet的主类都是java.applet包中的
applet类的子类;最后一种方式是创建系统类的对象,例如图
形界面的程序中要接受用户的输入时,就可以创建一个系统类
TextField类的对象来完成这个任务。
第4章 类 与 对 象
无论采用哪种方式,使用系统类的前提条件是这个系统类
应该是用户程序可见的类。为此用户程序需要用import
语句引
入它所用到的系统类或系统类所在的包。例如使用图形用户界
面的程序,应该用语句:
import java.awt.*;
import java.awt.event.*;
引入java.awt包和java.awt.event包。
第4章 类 与 对 象
类库包中的程序都是字节码形式的程序,利用import语句
将一个包引入到程序里,就相当于在编译过程中将该包中所有
系统类的字节码加入到用户的Java程序中,这样用户的Java程
序就可以使用这些系统类及其中的各种功能了。
第4章 类 与 对 象
下面列出一些在Java程序设计中经常使用的包。
1
.java.lang

java.1ang包是Java语言的核心类库,包含了运行Java程序
必不可少的系统类,如基本数据类型、基本数学函数、字符串
处理、线程、异常处理类等。每个Java程序运行时,系统都会
自动地引入java.1ang包,所以这个包的加载是缺省的。
第4章 类 与 对 象
2
.java.io

java.io包中包含了实现Java程序与操作系统、用户界面以
及其他Java程序之间进行数据交换所使用的类,如基本输入/输
出流、文件输入/输出流、过滤输入/输出流、管道输入/输出流、
随机输入/输出流等。凡是需要完成与操作系统有关的较底层的
输入输出操作的Java程序,都要用到java.io包。
第4章 类 与 对 象
3
.java.awt

java.awt包是Java语言用来构建图形用户界面(GUl)的类
库,它包括了许多界面元素和资源。利用java.awt包,开发人员
可以很方便地编写出美观、方便、标准化的应用程序界面。
java.awt包主要在三个方面提供界面设计支持:①低级绘图操
作, 如Graphics 类等; ② 图形界面组件和布局管理, 如
Checkbox类、Container类、LayoutManager接口等;③界面用户
交互控制和事件响应,如Event类。
第4章 类 与 对 象
4
.java.awt.event

java.awt.event包是对JDK1.0版本中原有的Event类的一个扩
充,它使得程序可以用不同的方式来处理不同类型的事件,并
使每个图形界面的元素本身可以拥有处理它上面事件的能力。
5
.java.awt.image

java.awt.image包是用来处理和操纵来自于网上的图片的Java
工具类库。
6
.java.applet

java.applet包是用来实现运行于Internet浏览器中的Java
Applet的工具类库,它仅包含少量几个接口和一个非常有用的类
Java.applet.Applet。
第4章 类 与 对 象
7
.java.net

java.net包是Java语言用来实现网络功能的类库。由于Java
语言还在不停地发展和扩充,它的功能,尤其是网络功能,也
在不断地扩充。目前已经实现的Java网络功能主要有:底层的
网络通信,如实现套接字通信的Socket类、ServerSocket类;编
写用户自己的Telnet、FTP、邮件服务等实现网上通信的类;用
于访问Internet上资源和进行CGl网关调用的类,如URL等。利
用java.net包中的类,开发者可以编写自己的具有网络功能的程
序。
第4章 类 与 对 象
8
.java.rmi
包、java.rmi.registry
包和java.rmi.server

这三个包用来实现RMI(Remote Method Invocation,远程方
法调用)功能。利用RMI功能,用户程序可以在远程计算机(服务
器)上创建对象,并在本地计算机(客户机)上使用这个对象。
9
.java.util

java.util包中包括了Java语言中的一些低级的实用工具,如
处理时间的Date类,处理变长数组的Vector类,实现栈的Stack
类和实现哈希(散列)表的HashTable类等,使用它们开发者可以
更方便快捷地编程。
第4章 类 与 对 象
10
.java.sql

java.sql包是实现JDBC(Java Database Connection)的类库。
利用这个包可以使Java程序具有访问不同种类的数据库(如
Oracle,Sybase,DB2,SQLServer等)的功能。只要安装了合适
的驱动程序,同一个Java程序不需修改就可以存取、修改这些
不同的数据库中的数据。JDBC的这种功能,再加上Java程序本
身具有的平台无关性,大大拓宽了Java程序的应用范围,尤其
是商业应用的适用领域。
第4章 类 与 对 象
11.java.security
ijtscerayuva.
包、java.security.acl
iljtscerayu.包和java.security.interfaces
ifjtsceraynu.包
这三个包提供了更完善的Java程序安全性控制和管理,利
用它们可以对Java程序加密,也可以把特定的Java Applet标记
为“可信赖的”,使它能够具有与Java Application相近的安全权
限。
12
.java.awt.peer

java.awt.peer包是实现Java语言跨平台特性的手段之一。这
个包虽然在程序中很少直接用到,但它的作用是将不同的平台
包裹、隐藏起来,使这些平台在用户程序面前呈现基本相同的
面貌。
第4章 类 与 对 象
14
.java.awt.datatransfer

java.awt.datatransfer包提供了处理数据传输的工具类,包括
剪贴板、字符串发送器等。
15
.java.lang.reflect

java.lang.reflect包提供了用于反射对象的工具,反射允许
程序监视一个正在运行的对象并获得它的构造函数、方法和属
性。
第4章 类 与 对 象
16
.java.corba
包和java.corba.orb

这两个包将CORBA(Common Object Request Broker
Architecture,是一种标准化接口体系)嵌入到Java环境中,使得
Java程序可以存取、调用CORBA对象,并与CORBA对象共同
工作。这样,Java程序就可以方便、动态地使用已经存在的由
Java或其他面向对象语言开发的部件,简化软件的开发。
第4章 类 与 对 象
4.1.7
创建对象
创建对象通常包括声明对象、建立对象和初始化对象三步。
1
.声明对象
声明对象就是确定对象的名称,并指明该对象所属的类。声
明对象的格式如下:
类名
对象名表;
第4章 类 与 对 象
其中:类名是指对象所属类的名字,它是在声明类时定义
的;对象名表是指一个或多个对象名,若为多个对象名时,用
逗号进行分隔。声明对象的作用是为将来的编译过程提供必要
的信息。例如:
class_name object_one,object_two;
这个语句声明了两个对象object_one,object_two,它们都
是class_name类的对象。
第4章 类 与 对 象
2
.建立对象
所谓建立对象,实际上就是用Java提供的new
关键字为对象
分配存储空间。在声明对象时,只确定了对象的名称和它所属
的类,并没有为对象分配存储空间,此时对象还不是类的实例。
只有通过建立对象这一步,才为对象分配内存,使该对象成为
类的实例。建立对象的格式如下:
对象名=new
构造方法( )
例如:object_one=new class_name( );
object_two=new class_name( );
第4章 类 与 对 象
也可以在声明对象的同时建立对象,这称为创建一个对象。
创建对象的格式如下:
类名
对象名=new
构造方法( )
例如:class_name object_one=new class_name( );
class_name object_two=new class_name( );
其中:new是Java的关键字,也可将其称为运算符,因为
new的作用是建立对象,为对象分配存储空间。执行new
class_name( )将产生一个class_name( )类的实例(对象)。
第4章 类 与 对 象
3.
初始化对象
初始化对象是指由一个类生成一个对象时,为这个对象确定
初始状态,即为它的数据成员赋初始值的过程,当然,它主要由
一些赋值语句组成。由于初始化操作是最常用的操作之一,为简
化这一过程,Java还提供了专用的方法来完成它,这个方法被称
为构造方法。关于构造方法的详细内容请参阅4.1.9节。
第4章 类 与 对 象
4.1.8
使用对象
一个对象可以有许多属性和多个方法。在面向对象的系统
中,一个对象的属性和方法被紧密地结合成一个整体,二者是
不可分割的,并且限定一个对象的属性值只能由这个对象或它
的方法来读取和修改。这便是封装和信息隐藏的一个方面。
当一个对象被创建后,这个对象就拥有了自己的数据成员
和成员方法,我们可以通过引用对象的成员来使用对象,对象
的数据成员的引用方式如下:
对象名.
数据成员名
对象的成员方法的引用方式如下:
对象名.
成员方法名(
参数表)
第4章 类 与 对 象
【示例程序c4_2.java】 定义一个dogs类,使其包括Name、
Weight和Height三个数据成员和一个名为ShowDog的成员方法。
为dogs类创建Dane和Setter两个对象,确定两个对象的属性后
引用ShowDog方法显示这两个对象。
import java.awt.*;
import java.applet. *;
class dogs //定义dogs类
{
//以下三行定义dogs类的数据成员
public String Name;
public int Weight;
public int Height;
第4章 类 与 对 象
//以下六行是dogs类的成员方法ShowDog( )的定义
public void ShowDog(Graphics g,int x,int y)
{
g.drawString("Name:"+Name,x,y);
g.drawString("Weight:"+Weight,x,y+20);
g.drawString("Height:"+Height,x,y+40);
} //成员方法ShowDog( )定义完成
}// dogs类定义毕
第4章 类 与 对 象
public class c4_2 extends Applet
{
public void paint(Graphics g)
{
//以下为创建对象
dogs Dane; //声明了一个名为Dane的对象,它属于dogs类
Dane=new dogs( ); //建立Dane对象,为它分配存储空间
dogs Setter=new dogs( );//声明Setter对象的同时建立该对象
//以下六行引用对象的数据成员,将一组值赋给对象的数据成员
Dane.Name="Gread Dane";
Dane.Weight=100;
第4章 类 与 对 象
Dane.Height=23;
Setter.Name="Irish Setter";
Setter.Weight=20;
Setter.Height=30;
//以下两行引用对象的成员方法
Dane.ShowDog(g,25,25);
Setter.ShowDog(g,25,120);
}
}
第4章 类 与 对 象
图4.4 c4_2的运行结果
第4章 类 与 对 象
4.1.9
对象的初始化与构造方法
创建对象时,通常首先要为对象的数据成员赋初始值(如上
例中的Dane.Name="Gread Dane";等6条语句),这被称为对象的初
始化。初始化是最常用的操作之一,为简化这一操作,Java系统
提供了专用的方法——构造方法来完成这一操作。
构造方法是一个类的方法中方法名与类名相同的类方法。每
当使用new关键字创建一个对象,为新建对象开辟了内存空间之
后,Java系统将自动调用构造方法初始化这个新建对象。构造方
法是类的一种特殊方法,它的特殊性主要体现在以下几个方面:
第4章 类 与 对 象
(1) 构造方法的方法名与类名相同。
(2) 构造方法是类的方法,它能够简化对象数据成员的初
始化操作。
(3) 不能对构造方法指定类型,它有隐含的返回值,该值
由系统内部使用。
(4) 构造方法一般不能由编程人员显式地直接调用,在创
建一个类的对象的同时,系统会自动调用该类的构造方法将新
对象初始化。
(5) 构造方法可以重载,即可定义多个具有不同参数的构
造方法。
第4章 类 与 对 象
(6) 构造方法可以继承,即子类可以继承父类的构造方法。
(7) 如果用户在一个自定义类中未定义该类的构造方法,
系统将为这个类定义一个缺省的空构造方法。这个空构造方法
没有形式参数,也没有任何具体语句,不能完成任何操作。但
在创建一个类的新对象时,系统要调用该类的构造方法将新对
象初始化。
第4章 类 与 对 象
【示例程序c4_3.java】 将示例程序c4_2改写为定义了构造方法的程序。
import java.awt.*;
import java.applet.*;
class dogs //定义 dogs类
{
public String Name;
public int Weight;
public int Height;
public dogs(String CName, int CWeight, int CHeight) //构造方法
第4章 类 与 对 象
{ Name=CName;
Weight=CWeight;
Height=CHeight;
}//构造方法定义毕
public void ShowDog(Graphics g,int x,int y)
{ g.drawString("Name:"+Name,x,y);
g.drawString("Weight:"+Weight,x,y+20);
g.drawString("Height:"+Height,x,y+40);
}
} // dogs类定义毕
第4章 类 与 对 象
public class c4_3 extends Applet
{
public void paint(Graphics g)
{ dogs Dane=new dogs("Gread Dane",100,23);
dogs Setter=new dogs("Irish Setter",20,30);
Dane.ShowDog(g,25,25);
Setter.ShowDog(g,25,120);
}
}
第4章 类 与 对 象
该程序的执行结果与示例程序c4_2.java相同。
特殊情况下,构造方法中的参数名可能与数据成员名相
同,此时,在构造方法中可用下面两种形式之一来区分数据成
员名与参数名。
(1)默认法。当构造方法的参数名与数据成员名相同时,
将赋值号左边的标识符默认为对象的数据成员名,则赋值号右
边的标识符为参数。
public dogs(String Name, int Weight, int Height)
{ Name=Name;// 左边的标识符为数据成员名,右边的标识符为参数。下同
Weight=Weight;
Height=Height;
}
第4章 类 与 对 象
(2) 使用代表本类对象的关键字this
指出数据成员名之所在。
关于this,将在5.4.4节讲述。
public dogs(String Name, int Weight, int Height)
{
this.Name=Name; //用this指出数据成员名。下同
this.Weight=Weight;
this.Height=Height;
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics