版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第5章 Java面向对象程序设计 1 Java教材课件05Java面向对象程序 设计 2 教学目的要求 n理解理解java语言的面向对象技术,包括面向对象语言的面向对象技术,包括面向对象 的基本概念、面向对象的程序设计方法;的基本概念、面向对象的程序设计方法; n理解理解java中的类、包、对象、抽象类、接口和中的类、包、对象、抽象类、接口和 面向对象的特性;面向对象的特性; n掌握掌握Java语言中类、方法和接口的基本定义及语言中类、方法和接口的基本定义及 使用方法;使用方法; n了解包的概念及打包和引入方法;了解包的概念及打包和引入方法; n通过技能实训通过技能实训,掌握一般掌握一般Jav
2、a程序的面向对象编程序的面向对象编 程方法程方法,达到熟练开发达到熟练开发Java一般程序的目的。一般程序的目的。 3 本章内容本章内容 n5.1 类类 n5.2 访问控制符与封装访问控制符与封装 n5.3 继承继承 n5.4 非访问控制符接口非访问控制符接口 n5.5 Java的名字空间和包的名字空间和包 n5.6 接口接口 4 5.1 类 n面向对象回顾面向对象回顾 n类的定义类的定义 n方法重载方法重载 n内部类内部类 5 面向对象回顾(面向对象回顾(1)-基本思想基本思想 n面向对象的基本思想面向对象的基本思想 面向对象是一种新兴的程序设计方法面向对象是一种新兴的程序设计方法,或者是一
3、种或者是一种 新的程序设计规范新的程序设计规范(paradigm),其基本思想是使用对其基本思想是使用对 象、类、继承、封装、消息等基本概念来进行程序设象、类、继承、封装、消息等基本概念来进行程序设 计。从现实世界中客观存在的事物(即对象)出发来计。从现实世界中客观存在的事物(即对象)出发来 构造软件系统,并且在系统构造中尽可能运用人类的构造软件系统,并且在系统构造中尽可能运用人类的 自然思维方式。开发一个软件是为了解决某些问题,自然思维方式。开发一个软件是为了解决某些问题, 这些问题所涉及的业务范围称作该软件的问题域。其这些问题所涉及的业务范围称作该软件的问题域。其 应用领域不仅仅是软件,还
4、有计算机体系结构和人工应用领域不仅仅是软件,还有计算机体系结构和人工 智能等。智能等。 6 面向对象回顾(面向对象回顾(1)-基本思想基本思想 n1 对象的基本概念对象的基本概念 对象是系统中用来描述客观事物的一个实体,它是构成系统的对象是系统中用来描述客观事物的一个实体,它是构成系统的 一个基本单位。一个对象由一组属性和对这组属性进行操作的一组一个基本单位。一个对象由一组属性和对这组属性进行操作的一组 服务组成。服务组成。 主动对象是一组属性和一组服务的封装体,其中至少有主动对象是一组属性和一组服务的封装体,其中至少有 一个服务不需要接收消息就能主动执行(称作主动服务)。一个服务不需要接收消
5、息就能主动执行(称作主动服务)。 n2 类的基本概念类的基本概念 类是具有相同属性和服务的一组对象的集合,它为属于该类的所类是具有相同属性和服务的一组对象的集合,它为属于该类的所 有对象提供了统一的抽象描述,其内部包括属性和服务两个主要部有对象提供了统一的抽象描述,其内部包括属性和服务两个主要部 分。在面向对象的编程语言中,类是一个独立的程序单位,它应该分。在面向对象的编程语言中,类是一个独立的程序单位,它应该 有一个类名并包括属性说明和服务说明两个主要部分。有一个类名并包括属性说明和服务说明两个主要部分。 n3 消息消息 消息就是向对象发出的服务请求,它应该包含下述信息:提供服务消息就是向对
6、象发出的服务请求,它应该包含下述信息:提供服务 的对象标识、服务标识、输入信息和回答信息。服务通常被称为方的对象标识、服务标识、输入信息和回答信息。服务通常被称为方 法或函数。法或函数。 7 面向对象回顾(面向对象回顾(2)-基本特性基本特性 n1封装性封装性 封装性就是把对象的属性和服务结合成一个独立的相同单位,封装性就是把对象的属性和服务结合成一个独立的相同单位, 并尽可能隐蔽对象的内部细节,包含两个含义:并尽可能隐蔽对象的内部细节,包含两个含义: 把对象的全部属性和全部服务结合在一起,形成一个不可把对象的全部属性和全部服务结合在一起,形成一个不可 分割的独立单位(即对象)。分割的独立单位
7、(即对象)。 信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个 边界或者说形成一道屏障,只保留有限的对外接口使之与外边界或者说形成一道屏障,只保留有限的对外接口使之与外 部发生联系。部发生联系。 封装的原则在软件上的反映是:要求使对象以外的部分不能封装的原则在软件上的反映是:要求使对象以外的部分不能 随意存取对象的内部数据(属性),从而有效的避免了外部错误随意存取对象的内部数据(属性),从而有效的避免了外部错误 对它的对它的交叉感染交叉感染,使软件错误能够局部化,大大减少查错和排,使软件错误能够局部化,大大减少查错和排 错的难度。错的难度。
8、8 面向对象回顾(面向对象回顾(2)-基本特性基本特性 n2继承性继承性 特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对 一般类的继承。一般类的继承。 一个类可以是多个一般类的特殊类,它从多个一般类中继承了一个类可以是多个一般类的特殊类,它从多个一般类中继承了 属性与服务,这称为多继承。属性与服务,这称为多继承。 在在java语言中,通常我们称一般类为父类(语言中,通常我们称一般类为父类(superclass,超超 类),特殊类为子类类),特殊类为子类(subclass)。 n3多态性多态性 对象的多态性是指在一般类中定义的属性或服
9、务被特殊类继承对象的多态性是指在一般类中定义的属性或服务被特殊类继承 之后,可以具有不同的数据类型或表现出不同的行为。这使得同一之后,可以具有不同的数据类型或表现出不同的行为。这使得同一 个属性或服务在一般类及其各个特殊类中具有不同的语义。例如:个属性或服务在一般类及其各个特殊类中具有不同的语义。例如: 几何图形几何图形的的绘图绘图方法,方法,椭圆椭圆和和多边形多边形都是都是几何图几何图的子类,的子类, 其其绘图绘图方法功能不同。方法功能不同。 9 面向对象回顾(面向对象回顾(3)-面向对象方法学面向对象方法学 nOOAObject Oriented Analysis 面向对象的分析面向对象的
10、分析 nOODObject Oriented Design 面向对象的设计面向对象的设计 nOOIObject Oriented Implementation 面向对象的实现面向对象的实现 10 n类是类是java中的一种重要的复合数据类型,是中的一种重要的复合数据类型,是 组成组成java程序的基本要素。它封装了一类对程序的基本要素。它封装了一类对 象的状态和方法,是这一类对象的原形。一象的状态和方法,是这一类对象的原形。一 个类的实现包括两个部分:类声明和类体个类的实现包括两个部分:类声明和类体 n1类声明:类声明: 类声明中包括关键字类声明中包括关键字Class,类名及类的属类名及类的属
11、 性。类声明的格式如下:性。类声明的格式如下: nclassextendsimplements 11 n同时,在类声明中还可以包含类的父类(超类),类所实现的接口以及同时,在类声明中还可以包含类的父类(超类),类所实现的接口以及 修饰符修饰符public、abstract或或final,这些内容将在后面的几节中分别介,这些内容将在后面的几节中分别介 绍。绍。 n由类定义可知,类定义包括关键词由类定义可知,类定义包括关键词class、类名和类的属性。类名是、类名和类的属性。类名是 Java语言合法的标识符,类名一般具有一定的含义。语言合法的标识符,类名一般具有一定的含义。 n(1)类定义修饰符类
12、定义修饰符 n类的说明性修饰符说明类的性质和访问权限,包括类的说明性修饰符说明类的性质和访问权限,包括public、缺省修饰符、缺省修饰符、 abstract、final。关于修饰符具体含义后面详细介绍。关于修饰符具体含义后面详细介绍。 n(2)extends nextends说明类的父类说明类的父类,一般形式为一般形式为extends父类名父类名Java语言中,语言中, 如果在类说明中无如果在类说明中无extends,则隐含地假设其父类为类。,则隐含地假设其父类为类。 12 n2类类主主体体 类主体是是类主体是是JavaJava类的主体部分,完成变量的说明以及方法的定义及类的主体部分,完成变
13、量的说明以及方法的定义及 实现。在类中,用变量来说明类的状态,而用方法来实现类的行为。包实现。在类中,用变量来说明类的状态,而用方法来实现类的行为。包 含类主体的类结构如下:含类主体的类结构如下: n n n n n通常变量在方法前定义通常变量在方法前定义( (并不一定要求并不一定要求) ),JavaJava语言中没有独立的函数和语言中没有独立的函数和 过程,所有的子程序都是作为类方法定义的。如下所示过程,所有的子程序都是作为类方法定义的。如下所示: : nclassclassName nmemberVariableDeclarations nmethodDeclarations 13 n3成
14、员变量成员变量 成员变量的声明方式如下:成员变量的声明方式如下: public | protected | private static final transient volatile type variableName; /成员变量成员变量 其中,其中, static: 静态变量(类变量);相对于实例变量静态变量(类变量);相对于实例变量 final: 常量常量 transient: 暂时性变量,用于对象存档,用于对象的串行化,见对暂时性变量,用于对象存档,用于对象的串行化,见对 象的串行化一节象的串行化一节 volatile: 贡献变量,用于并发线程的共享贡献变量,用于并发线程的共享 1
15、4 n4成员方法成员方法 说明成员方法定义的一般形式为:说明成员方法定义的一般形式为: n 方法修饰符方法修饰符 ( ()方法体方法体 n方法说明是指出方法返回类型、方法名、访问权限和入口参数。方法说明是指出方法返回类型、方法名、访问权限和入口参数。 n 方法修饰符方法修饰符 n成员方法修饰符主要有成员方法修饰符主要有public、private、protected、final、static、 abstract和和synchronized共共7种,前种,前3种的访问权限、说明形式和含义种的访问权限、说明形式和含义 与成员变量一致。修饰符说明详见与成员变量一致。修饰符说明详见5.2、5.4节。节
16、。 n 方法的返回值类型方法的返回值类型 nJava语言要求在成员方法说明中必须指明方法返回值的类型,返回值的语言要求在成员方法说明中必须指明方法返回值的类型,返回值的 类型为类型为Java语言的任何数据类型。如果一个成员方法不需要返回值,则语言的任何数据类型。如果一个成员方法不需要返回值,则 其返回值的类型被说明为其返回值的类型被说明为void。方法返回值用。方法返回值用return语句来实现,如果语句来实现,如果 有返回值,那么有返回值,那么return语句要带参数,并且语句要带参数,并且return语句中返回的数据类语句中返回的数据类 型必须与方法说明中的方法返回值的类型一致。型必须与方
17、法说明中的方法返回值的类型一致。 15 n方法名方法名 n成员方法名是成员方法名是JavaJava语言合法的标识符,为了提高程序的可读语言合法的标识符,为了提高程序的可读 性,成员方法名一般具有一定的含义。性,成员方法名一般具有一定的含义。 n参数列表参数列表 n成员方法的参数列表是由逗号分隔的类型及参数名组成,是成员方法的参数列表是由逗号分隔的类型及参数名组成,是 可选项。类型可以是可选项。类型可以是JavaJava语言的任何数据类型。语言的任何数据类型。 n方法体方法体 n方法体是一个方法定义的主要部分,包含了所有实现方法功方法体是一个方法定义的主要部分,包含了所有实现方法功 能的能的Ja
18、va语言程序代码。在方法体中可以定义局部变量,它语言程序代码。在方法体中可以定义局部变量,它 的作用域仅在方法体内,当方法被执行结束之后,该方法内的作用域仅在方法体内,当方法被执行结束之后,该方法内 部的所有局部变量也就失效了,局部变量不能与参数列表中部的所有局部变量也就失效了,局部变量不能与参数列表中 参数名同名。方法体用参数名同名。方法体用“”括起来。括起来。 16 【例【例5-2】定义一个方法,方法功能为根据参数定义一个方法,方法功能为根据参数r r的大小,返回的大小,返回 圆的面积。在类中赋参数圆的面积。在类中赋参数r r,并且输出面积值。,并且输出面积值。 public class
19、Li5_02public class Li5_02 public static void main(String args)public static void main(String args) double k;double k; Li5_02 mj=new Li5_02();Li5_02 mj=new Li5_02(); k=mj.area(5);k=mj.area(5); public double area(int r)public double area(int r)/定义定义areaarea方法,带有一方法,带有一 个参数个参数 final double PI=3.14;fina
20、l double PI=3.14;/定义常量定义常量PIPI,并赋初值,并赋初值3.143.14 return PIreturn PI* *r r* *r;r;/根据根据r r的值,计算面积后,返回面积值的值,计算面积后,返回面积值 运行结果为运行结果为: : 78.578.5 17 n5.构造方法构造方法 构造方法是一种特殊的方法,主要用于为类的方法中变量构造方法是一种特殊的方法,主要用于为类的方法中变量 赋初始值的功能。当用赋初始值的功能。当用newnew创建一个类的新的对象时,构造方法创建一个类的新的对象时,构造方法 就立即执行。构造方法名字必须与类名相同。除了构造方法,在就立即执行。构
21、造方法名字必须与类名相同。除了构造方法,在 类中不能出现与类名相同的方法。构造方法的语法为:类中不能出现与类名相同的方法。构造方法的语法为: npublic public 类名(类名( 参数列表参数列表 ) n 语句序列;语句序列; n nJava语言中每个类都有构造方法,如果一个类中没有说明该类的语言中每个类都有构造方法,如果一个类中没有说明该类的 构造方法,则系统将提供隐含的不带任何参数的构造方法,这个构造方法,则系统将提供隐含的不带任何参数的构造方法,这个 空的构造方法其实什么也不做。一旦我们定义了自己的构造方法,空的构造方法其实什么也不做。一旦我们定义了自己的构造方法, Java编译器
22、就不再添加这种缺省的构造方法。编译器就不再添加这种缺省的构造方法。 18 n 构造方法的特点构造方法的特点: n构造方法没有返回值类型,甚至没有构造方法没有返回值类型,甚至没有voidvoid。其修饰符只能是访问控制。其修饰符只能是访问控制 修饰符,即修饰符,即publicpublic、privateprivate、protectedprotected中的任一个。中的任一个。 n构造方法不能从父类中继承。构造方法不能从父类中继承。 n构造方法可以重载,一个类可以有任意多个构造方法。不同的构造方构造方法可以重载,一个类可以有任意多个构造方法。不同的构造方 法根据参数的不同状态来选择合适的构造方法
23、。法根据参数的不同状态来选择合适的构造方法。 n构造方法不能直接通过方法名引用,必须通过构造方法不能直接通过方法名引用,必须通过newnew运算符。运算符。 n在构造方法中可以调用当前类和其父类的另一个构造方法,但必须是在构造方法中可以调用当前类和其父类的另一个构造方法,但必须是 方法体的第一条语句。使用当前类的构造方法用方法体的第一条语句。使用当前类的构造方法用this来引用,使用其父来引用,使用其父 类的构造方法用类的构造方法用super来引用。来引用。 19 n在在JavaJava语言中,一个语言中,一个JavaJava对象是类的一个实例,创建一个对象对象是类的一个实例,创建一个对象 就
24、是创建类的一个实例,对象即类的实例化。就是创建类的一个实例,对象即类的实例化。newnew运算符用于创建运算符用于创建 一个类的实例并返回对象的引用。对象创建包括对象声明,实例化一个类的实例并返回对象的引用。对象创建包括对象声明,实例化 和初始化三方面的内容。一般格式为:和初始化三方面的内容。一般格式为: ntype type 对象名对象名=new type(=new type(参数列表参数列表); n其中其中typetype为引用组合类型(包括类和接口)。该格式声明了一个类为引用组合类型(包括类和接口)。该格式声明了一个类 型为型为typetype的对象。对象的声明并不为对象分配内存空间。用
25、运算符的对象。对象的声明并不为对象分配内存空间。用运算符 newnew为对象分配内存空间,实例化一个对象。比如:为对象分配内存空间,实例化一个对象。比如: nString UserName=new String(“zhangsan”);String UserName=new String(“zhangsan”); 20 对象的使用包括引用对象的成员变量和方法,通过运算符对象的使用包括引用对象的成员变量和方法,通过运算符“”可可 以实现对实例变量的访问和实例方法的调用,变量和方法还可以设以实现对实例变量的访问和实例方法的调用,变量和方法还可以设 定一定的访问权限来允许或禁止其他对象对它的访问。通
26、常有两种定一定的访问权限来允许或禁止其他对象对它的访问。通常有两种 途径来使用对象:途径来使用对象: 1.1.引用对象中的变量引用对象中的变量 引用对象的变量的一般形式为引用对象的变量的一般形式为: : . 2.2.引用对象中的方法引用对象中的方法 引用对象中的方法的一般形式为:引用对象中的方法的一般形式为: .() 其中,参数列表是可选项。在进行对象方法的引用时,方法中参数其中,参数列表是可选项。在进行对象方法的引用时,方法中参数 的个数、参数的数据类型与原方法中定义的要一致,否则编译时会的个数、参数的数据类型与原方法中定义的要一致,否则编译时会 出错。出错。 21 n前面已经讲过,数组的元
27、素不仅可以是基本数据类型,也前面已经讲过,数组的元素不仅可以是基本数据类型,也 可以是对象。在实际应用中,更普遍的可能是数组元素是可以是对象。在实际应用中,更普遍的可能是数组元素是 对象的对象数组了。下面用对象的对象数组了。下面用CCircleCCircle类作为例子介绍对象数类作为例子介绍对象数 组的创建和使用。如果定义组的创建和使用。如果定义CCircleCCircle类(见例类(见例5.45.4源程序),源程序), 那么,如何来创建和操纵那么,如何来创建和操纵CCircleCCircle类的对象的一个数组呢?类的对象的一个数组呢? 实际上,对象数组的创建与基本数据类型的数组是一样的,实际
28、上,对象数组的创建与基本数据类型的数组是一样的, 分两步进行:分两步进行: n1.1.声明类类型的数组变量,并用声明类类型的数组变量,并用newnew分配内存空间给数组;分配内存空间给数组; n2.2.用用newnew产生新的对象,并分配内存空间给它。产生新的对象,并分配内存空间给它。 22 n如前所述,用如前所述,用newnew来创建新的对象,此时来创建新的对象,此时JavaJava便会分配内存空间给它。如便会分配内存空间给它。如 果此对象不在使用了,果此对象不在使用了,JavaJava一样可回收它所占的内存空间。其作法是,一样可回收它所占的内存空间。其作法是, 把指向该对象的值设置为把指向
29、该对象的值设置为nullnull。该对象便成了无用对象,。该对象便成了无用对象,JavaJava系统通过系统通过 垃圾回收器垃圾回收器GCGC(Garbage CollectorGarbage Collector)周期性地释放无用对象所使用的内)周期性地释放无用对象所使用的内 存,完成对象的清除工作。同样当对象数组中的对象不在使用时,可以存,完成对象的清除工作。同样当对象数组中的对象不在使用时,可以 先把对象数组中的元素置上先把对象数组中的元素置上nullnull,然后让,然后让JavaJava内存垃圾回收器自动回收。内存垃圾回收器自动回收。 n当不存在着对一个对象的引用时,该对象就成为一个无
30、用对象。当不存在着对一个对象的引用时,该对象就成为一个无用对象。GCGC自动自动 扫描对象的动态内存区,对被引用的对象添加标记,然后把没有引用的扫描对象的动态内存区,对被引用的对象添加标记,然后把没有引用的 对象作为垃圾收集起来并加以释放。对象作为垃圾收集起来并加以释放。 nGCGC在在JavaJava中作为一个线程来运行的,即调用中作为一个线程来运行的,即调用System.gc()System.gc(),当要求垃圾收,当要求垃圾收 集时,该线程与系统同步运行;否则在系统空闲之时异步地运行。集时,该线程与系统同步运行;否则在系统空闲之时异步地运行。 n此外,在此外,在Java系统开始运行时,会
31、自动调用一个名为系统开始运行时,会自动调用一个名为finalize()方法,使方法,使 它清除对象所占的内存。比它清除对象所占的内存。比C+中用中用delete和和C中用中用free来释放内存的来释放内存的 措施好得多。措施好得多。 23 方法重载 在在JavaJava类中可以创建名字相同,但是参数不同和返回值不同的几类中可以创建名字相同,但是参数不同和返回值不同的几 个方法,这就是方法重载(个方法,这就是方法重载(overloadingoverloading),),JavaJava系统通过参数和返回系统通过参数和返回 值来分辨具体是哪一个方法。通过方法重载,一个类中可以有多个具有值来分辨具体
32、是哪一个方法。通过方法重载,一个类中可以有多个具有 相同名字的方法,传递给它们的不同个数和类型的参数来决定使用那种相同名字的方法,传递给它们的不同个数和类型的参数来决定使用那种 方法,这就是多态。方法,这就是多态。 构造方法是一种特殊的方法。构造方法是一种特殊的方法。JavaJava中的每个类都有构造方法,用中的每个类都有构造方法,用 来初始化该类的一个新的对象。在构造方法的实现中,为了实现不同对来初始化该类的一个新的对象。在构造方法的实现中,为了实现不同对 象的不同初始化值,也可以进行方法重载,所以类可以有多个构造方法,象的不同初始化值,也可以进行方法重载,所以类可以有多个构造方法, 并且它
33、们共享同一个名字,构造方法可以通过参数的类型和数目区分。并且它们共享同一个名字,构造方法可以通过参数的类型和数目区分。 构造方法使用它的参数初始化新对象的状态,当创建对象时,应该选择构造方法使用它的参数初始化新对象的状态,当创建对象时,应该选择 其参数最能反映所初始化的新对象的构造方法,根据传给构造方法的参其参数最能反映所初始化的新对象的构造方法,根据传给构造方法的参 数数目和类型的不同,数数目和类型的不同,JavaJava编译器可以决定使用那个构造方法。编译器可以决定使用那个构造方法。 24 n内部类内部类 n 在类内部可定义成员变量和方法,其实,在类内部可定义成员变量和方法,其实, 在类内
34、部也可以定义另一个类。如果在类在类内部也可以定义另一个类。如果在类 A A的内部再定义一个类的内部再定义一个类B B,此时类,此时类B B称为内称为内 部类,而类部类,而类A A则称为外部类。则称为外部类。 n 内部类可声明为内部类可声明为public或或private。当。当 内部类声明成内部类声明成public或或private时,其访时,其访 问限制与成员变量或方法完全相同。关于问限制与成员变量或方法完全相同。关于 内部类的用法详见第内部类的用法详见第8章章8.3节。节。 25 5.2 访问控制符和封装访问控制符和封装 n前已述及,前已述及,Java的类成员主要有访问修饰符的类成员主要有
35、访问修饰符:private、protected、 public和和default,具体存取权限见表,具体存取权限见表5-1。 n 表表5-1 不同访问修饰符的具体存取权限不同访问修饰符的具体存取权限 publicdefaultprotectedprivate 可被相同包的非子类访问YesYesYesNo 可被相同包的子类访问YesYesYesNo 可被不同包的非子类访问YesNoNoNo 可被不同包的子类访问YesNoNoNo 可被相同包的子类继承YesYesYesNo 可被不同包的子类继承YesNoYesNo 26 5.3 继承 子类和简单继承举例子类和简单继承举例 按定义为类的格式,如果有
36、如下类按定义为类的格式,如果有如下类A A声明:声明: class class 类名类名A extends A extends 父类父类BimplementsBimplements 则说明新定义的类则说明新定义的类A A是父类是父类B B的子类。如果缺省的子类。如果缺省extendsextends子句,则该子句,则该 类为的子类。子类可以继承父类中访问权限为类为的子类。子类可以继承父类中访问权限为publicpublic、protectedprotected等的成等的成 员变量和方法,但不能继承访问权限为员变量和方法,但不能继承访问权限为privateprivate的成员和方法。有了继承的成员
37、和方法。有了继承 机制,在编写程序时,就可以先定义一个包含公共变量和公用方法的类机制,在编写程序时,就可以先定义一个包含公共变量和公用方法的类 作为父类,再在此基础上创建具有专用变量和专用方法的子类。子类一作为父类,再在此基础上创建具有专用变量和专用方法的子类。子类一 方面继承父类中已有的变量和方法(普遍性原则),另一方面子类还可方面继承父类中已有的变量和方法(普遍性原则),另一方面子类还可 以增加父类中所没有的变量和方法(特殊性原则)。以增加父类中所没有的变量和方法(特殊性原则)。 27 5.3 继承 变量隐藏和方法覆盖变量隐藏和方法覆盖 子类继承父类后,如果出现子类的成员变量和父类的成员变
38、量同名,那子类继承父类后,如果出现子类的成员变量和父类的成员变量同名,那 么子类将把父类的成员变量隐藏起来。在这种情况下,子类使用的变量是它么子类将把父类的成员变量隐藏起来。在这种情况下,子类使用的变量是它 自己的变量,而不是父类的成员变量,那么子类如果要调用父类的变量,则自己的变量,而不是父类的成员变量,那么子类如果要调用父类的变量,则 必须借用下一小节要阐述的关键字必须借用下一小节要阐述的关键字super。另外一种情况是子类的方法名与。另外一种情况是子类的方法名与 父类的方法名相同(返回值的类型和入口参数的数目、类型均相同),那么父类的方法名相同(返回值的类型和入口参数的数目、类型均相同)
39、,那么 在子类中重新改写了父类的同名方法,即子类方法覆盖(在子类中重新改写了父类的同名方法,即子类方法覆盖(overriding)了父)了父 类的方法。通过方法重写,子类可以重新实现父类的某些方法,使其具有自类的方法。通过方法重写,子类可以重新实现父类的某些方法,使其具有自 己的特征。己的特征。 方法覆盖与重载均是方法覆盖与重载均是JavaJava多态的技巧之一,但两者之间也有不同之处:多态的技巧之一,但两者之间也有不同之处: 重载:英文名称为重载:英文名称为overloadingoverloading,意指在同一个类中,定义多个名称相同,意指在同一个类中,定义多个名称相同, 但参数个数或类型
40、不同的方法,但参数个数或类型不同的方法,JavaJava根据参数的个数或类型,调用相对应的根据参数的个数或类型,调用相对应的 方法。方法。 覆盖:英文名称为覆盖:英文名称为overriding,是指在子类中,定义名称、参数个数与类,是指在子类中,定义名称、参数个数与类 型均与父类相同的方法,用以改写父类中的方法的功能。型均与父类相同的方法,用以改写父类中的方法的功能。 28 和和this 在在JavaJava中,执行子类的构造方法之前或子类没有明确地指定中,执行子类的构造方法之前或子类没有明确地指定 构造方法,会自动调用父类中没有参数的构造方法,其目的构造方法,会自动调用父类中没有参数的构造方
41、法,其目的 是为了帮助继承自父类的成员变量做初始化操作。问题是,是为了帮助继承自父类的成员变量做初始化操作。问题是, 如果父类有多个构造方法,如何才能调用父类中特定的构造如果父类有多个构造方法,如何才能调用父类中特定的构造 方法呢?如果在子类中还需要用到父类中被隐藏的变量或者方法呢?如果在子类中还需要用到父类中被隐藏的变量或者 被覆盖了的方法,该怎么办呢?被覆盖了的方法,该怎么办呢?JavaJava提供了关键字提供了关键字supersuper来来 实现对父类的成员和方法的访问。实现对父类的成员和方法的访问。SuperSuper有三种情况可以使有三种情况可以使 用:用: 用来访问父类中被覆盖的方
42、法;用来访问父类中被覆盖的方法; 用来调用父类中的构造方法;用来调用父类中的构造方法; 用来访问父类中被隐藏的成员变量。用来访问父类中被隐藏的成员变量。 5.3 继承 29 5.3 继承 n调用构造方法遵循以下的几条规则:调用构造方法遵循以下的几条规则: n当一个类创建对象时,可以调用该类的父类的构造方法。调用父类当一个类创建对象时,可以调用该类的父类的构造方法。调用父类 的构造方法很简单,只要在类的构造方法的方法体中,第一条为的构造方法很简单,只要在类的构造方法的方法体中,第一条为supersuper 语句就可以了。语句就可以了。supersuper可以调用父类的任何一个带入口参数或不带入口
43、可以调用父类的任何一个带入口参数或不带入口 参数的构造方法。参数的构造方法。 n如果一个类的构造方法中第一条语句没有用如果一个类的构造方法中第一条语句没有用supersuper来调用父类的构造来调用父类的构造 方法,则编译器也会默认在构造方法中用方法,则编译器也会默认在构造方法中用supersuper()语句调用父类的无()语句调用父类的无 参构造方法。参构造方法。 n如果某个类的构造方法的第一条语句是用如果某个类的构造方法的第一条语句是用thisthis来调用本类的另外一来调用本类的另外一 个构造方法,那么个构造方法,那么JavaJava系统就不会默认这个构造方法调用父类的构造系统就不会默认
44、这个构造方法调用父类的构造 方法。方法。 n一个构造方法是用一个构造方法是用this语句调用本类的另一个构造方法时,如果被语句调用本类的另一个构造方法时,如果被 调用的构造方法又是调用父类的构造方法而又没有用调用的构造方法又是调用父类的构造方法而又没有用super语句,那语句,那 么编译器会默认它含有么编译器会默认它含有super()语句。此时,父类中若不存在无参()语句。此时,父类中若不存在无参 的构造方法,也将会导致编译出错。的构造方法,也将会导致编译出错。 30 5.3 继承 n运行时多态与多重继承运行时多态与多重继承 nJava中每一种操作,操作数据的类型必须合法。中每一种操作,操作数
45、据的类型必须合法。 父类有的方法子类都有,凡是能够使父类生成对父类有的方法子类都有,凡是能够使父类生成对 象的地方,都可以使用子类生成对象。象的地方,都可以使用子类生成对象。 n运行时多态有以下两条规则:运行时多态有以下两条规则: n对子类的一个实例,如果子类重写(覆盖)了对子类的一个实例,如果子类重写(覆盖)了 父类的方法,则运行时系统就调用子类的方法。父类的方法,则运行时系统就调用子类的方法。 n如果子类继承了父类的方法,则运行时系统就如果子类继承了父类的方法,则运行时系统就 仍调用父类的方法。仍调用父类的方法。 31 n对象类型转换 n前面已经讲过基本数据类型的转换,实际上Java中两个
46、不同类型 对象之间也可以转换,不过有个限制:两个转换的对象之间应该 具有继承关系,也就是说只是在子类和父类的对象之间进行转换, 而不是任意两个类。 n一个子类对象的类型可以向上转换成它的父类类型,这个转换过 程是安全的。因为父类所具有的信息,子类一般全有。当然,转 换过程中会丢失属于子类而不属于父类的信息。其中大学生和研 究生是学生的子类。 n按照前面所说的原则,以下转换过程是安全的: nUndergraduateStudent anUGS=new UndergraduateStudent(); nStudent aStudent=(Student)anUGS; n但是反过来,一个父类对象的类
47、型未必可以向下转换成子类的对 象的类型,因为子类具有的信息,父类未必包含。所以只有当父 类对象实际上是子类的一个实例的时候,才可以转换,否则不能 进行这种转换。 Student UndergraduateStudentGraduateStudent 大学生 学生 研究生 32 5.3 继承 n抽象类抽象类 nJavaJava也可以创建专门的类用来当作父类,这种类称为抽象类(也可以创建专门的类用来当作父类,这种类称为抽象类(abstract abstract classclass)。抽象类有点类似)。抽象类有点类似“模板模板”的作用,其目的是要你根据它的格式来的作用,其目的是要你根据它的格式来
48、修改并创建新的类。不能够通过抽象类直接创建对象,只能通过抽象类派生修改并创建新的类。不能够通过抽象类直接创建对象,只能通过抽象类派生 的新的类,再由新类创建对象。定义一个抽象类的格式为:的新的类,再由新类创建对象。定义一个抽象类的格式为: nabstract class abstract class 类名称类名称 n声明数据成员;声明数据成员; n返回值的数据类型返回值的数据类型 方法名称(参数列表)方法名称(参数列表) n 定义普通的方法定义普通的方法 n nabstractabstract返回值的数据类型返回值的数据类型 方法名称(参数列表)方法名称(参数列表);/;/定义抽象的方法定义抽
49、象的方法 n n注意:在抽象类中,方法的定义可分为两种:一种是普通方法;另一种是抽注意:在抽象类中,方法的定义可分为两种:一种是普通方法;另一种是抽 象方法,此方法以象方法,此方法以abstract开头,且只声明了返回值的数据类型、方法名称、开头,且只声明了返回值的数据类型、方法名称、 所需参数,但没有方法体。这样,抽象方法中的处理方式必须在子类中完全所需参数,但没有方法体。这样,抽象方法中的处理方式必须在子类中完全 实现。实现。 33 5.4 非访问控制符 n在类中声明一个变量或方法时,还可以指定它为实例在类中声明一个变量或方法时,还可以指定它为实例 成员或类成员。其格式为:成员或类成员。其
50、格式为: nstatic static 类型类型 变量名;变量名; nstatic static 返回值类型返回值类型 方法名(方法名( 参数列表参数列表 ) n n n上述用上述用static修饰的变量和方法分别称为类变量和类修饰的变量和方法分别称为类变量和类 方法,也称静态变量和静态方法。如果没有方法,也称静态变量和静态方法。如果没有static修修 饰,则分别称为实例变量和实例方法。饰,则分别称为实例变量和实例方法。 34 5.4 非访问控制符 n从安全性和面向对象程序设计上考虑,一些类不希望被继承,可以用从安全性和面向对象程序设计上考虑,一些类不希望被继承,可以用finalfinal
51、关键字来修饰。下列情况通常某些类被定义为关键字来修饰。下列情况通常某些类被定义为finalfinal类:类: n定义为定义为finalfinal类通常是一些有固定作用,用来完成某种标准功能的类。例类通常是一些有固定作用,用来完成某种标准功能的类。例 如,如,JavaJava中的中的StringString类,它对编译器与解释器的正常运行有很重要的作用,类,它对编译器与解释器的正常运行有很重要的作用, 所以被修饰为所以被修饰为finalfinal类。类。 n如果认为一个类的定义已经很完美,不需要再生成它的子类时,就说明如果认为一个类的定义已经很完美,不需要再生成它的子类时,就说明 为为final
52、final类。有些方法不能被重写(覆盖),也把它限定为类。有些方法不能被重写(覆盖),也把它限定为finalfinal方法。格方法。格 式为:式为: final final 返回值类型返回值类型 方法名(方法名( 参数列表参数列表 ) n注意:注意:abstractabstract和和finalfinal不能同时修饰一个类。可用不能同时修饰一个类。可用final来作为常量的修饰来作为常量的修饰 符。一个类的成员变量也可以被修饰成符。一个类的成员变量也可以被修饰成final,一旦定义为,一旦定义为final,则它的值,则它的值 在整个程序执行过程中都不会改变。在整个程序执行过程中都不会改变。 3
53、5 5.4 非访问控制符 volatile、native、synchronized n用用volatilevolatile修饰的成员变量称为易失变量,通常这个变量同时被修饰的成员变量称为易失变量,通常这个变量同时被 几个线程控制和修改,也就是说,这个成员变量不仅被当前程序几个线程控制和修改,也就是说,这个成员变量不仅被当前程序 所掌握,在运行过程可能存在其他未知的程序操作来影响和改变所掌握,在运行过程可能存在其他未知的程序操作来影响和改变 该变量的取值。该变量的取值。 n用用native修饰的是一种特殊方法,一般用来声明用其他语言编写修饰的是一种特殊方法,一般用来声明用其他语言编写 的方法体并
54、具体实现方法功能。由于的方法体并具体实现方法功能。由于nativenative的方法是用其他语言的方法是用其他语言 在外部编写,所以,所有的在外部编写,所以,所有的nativenative方法都没有方法体,而使用一方法都没有方法体,而使用一 个个“;”代替。代替。 n如果用如果用synchronizedsynchronized修饰一个类方法,那么在调用执行前,将把修饰一个类方法,那么在调用执行前,将把 系统类中对应的当前类的对象加锁。如果用系统类中对应的当前类的对象加锁。如果用synchronizedsynchronized修饰一修饰一 个对象方法,那么在调用执行前,将把当前对象加锁。个对象方
55、法,那么在调用执行前,将把当前对象加锁。 nsynchronizedsynchronized主要用于多线程共存的程序中的协调与同步,详见主要用于多线程共存的程序中的协调与同步,详见 多线程一章部分。多线程一章部分。 36 5.5 Java的名字空间和包 的名字空间的名字空间 nJavaJava注意解决名字空间的冲突问题,全局变量不再是语言的组成注意解决名字空间的冲突问题,全局变量不再是语言的组成 部分,即没有全局的方法,也没有全局的变量。所有的变量和方部分,即没有全局的方法,也没有全局的变量。所有的变量和方 法都是在类中定义,并且是类的重要组成部分,而每个类又是包法都是在类中定义,并且是类的重
56、要组成部分,而每个类又是包 的一部分,因此每个的一部分,因此每个JavaJava变量或方法都可以用全限定的名字表示。变量或方法都可以用全限定的名字表示。 包括包名、类名、域名三部分,之间用包括包名、类名、域名三部分,之间用“.”.”分隔。分隔。 nJavaJava编译器将编译器将JavaJava程序的每个类的编译代码,即字节码放在不同程序的每个类的编译代码,即字节码放在不同 的文件中,这些编译代码文件名与类同名,但加上扩展名的文件中,这些编译代码文件名与类同名,但加上扩展名 (.class.class),因此一个包含有多个类定义的源文件编译后有多),因此一个包含有多个类定义的源文件编译后有多
57、个个.class.class文件。文件。 nJavaJava源代码的扩展名一般为源代码的扩展名一般为.java.java,其中包括一个或多个类定义,其中包括一个或多个类定义, 如果在如果在JavaJava文件中有多个类定义,则只能有一个类可以定义为文件中有多个类定义,则只能有一个类可以定义为 publicpublic,并且这个类的名字必须与程序的源代码名(去掉扩展名),并且这个类的名字必须与程序的源代码名(去掉扩展名) 一致。一致。 37 5.5 Java的名字空间和包 提供的包提供的包 JDKJDK提供了提供了100100多个公共包,常用的有以下多个公共包,常用的有以下JavaJava包:包
58、: 提供利用提供利用JavaJava编程语言进行程序设计的基础类,比如编程语言进行程序设计的基础类,比如ObjectObject类、类、StringString类、类、 StringBufferStringBuffer类、类、SystemSystem类、类、ReaderReader类、类、WriterWriter类等等。类等等。 通过数据流、序列化和文件系统提供系统输入和输出。通过数据流、序列化和文件系统提供系统输入和输出。 包含集合框架、事件模型、日期和时间设施、国际化和各种实用工具类。如包含集合框架、事件模型、日期和时间设施、国际化和各种实用工具类。如 CalendarCalendar(日
59、历)类、(日历)类、VectorVector(向量)类等等。(向量)类等等。 包含了一些用来建立图形界面的类。比如包含了一些用来建立图形界面的类。比如WindowWindow类、类、ButtonButton类、类、MenuMenu类、类、ColorColor类、类、 GraphicsGraphics类等等。类等等。 提供创建和修改图像的各种类。如提供创建和修改图像的各种类。如BufferedImageBufferedImage类、类、ColorModelColorModel类等等。类等等。 包含用于执行小程序的类,比如包含用于执行小程序的类,比如AppletApplet类。类。 包含一些网络访
60、问功能的类,例如包含一些网络访问功能的类,例如ServerSocketServerSocket类、类、SocketSocket类、类、URLURL类等等。类等等。 包含访问数据库资源的类,如包含访问数据库资源的类,如SQLPermission SQLPermission 类、类、DriverManagerDriverManager类等等。类等等。 该软件包是该软件包是SUN公司提供给公司提供给Java用户的调试工具包,它包含各种用于调试类和接口用户的调试工具包,它包含各种用于调试类和接口 的工具。的工具。 38 5.5 Java的名字空间和包 自定义包自定义包 除了使用除了使用JavaJava
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年演出经纪人员资格证历年真题库附答案(培优a卷)
- 小学生实验报告格式与撰写规范试题
- 2025年网络管理员职业资格鉴定试题及真题
- 工程造价测量与计量练习试题冲刺卷
- 元曲情节发展逻辑评估试题
- 2026 年中职淡水养殖(鲤鱼养殖)试题及答案
- 2026 年中职船舶驾驶(船舶操控基础)试题及答案
- 2025年发育生物学实验操作考核试题冲刺卷
- 打桩工安全技术交底
- (市政工程)监理质量评估报告
- GB/T 45465.1-2025热回收新风机组季节性能系数测试和计算方法第1部分:供热显热回收季节性能系数
- 职业技术学院《智能制造系统》课程标准
- 项目经理廉洁警示教育
- 《浆体管道输送系统的过程监控与故障诊断》
- 高危儿规范化健康管理专家共识解读
- 农业物资:2024年化肥农药销售合同模板
- 2024年03月深圳市深汕特别合作区机关事业单位2024年公开招考46名事务员笔试历年典型考题及考点研判与答案解析
- 2024北京背户车协议书范本
- 巨量引擎推广引流方案
- 中国美食菜谱大全
- 盘扣架安全施工方案审核要点
评论
0/150
提交评论