面向对象程序设计

上传人:re****.1 文档编号:578849104 上传时间:2024-08-25 格式:PPT 页数:71 大小:451KB
返回 下载 相关 举报
面向对象程序设计_第1页
第1页 / 共71页
面向对象程序设计_第2页
第2页 / 共71页
面向对象程序设计_第3页
第3页 / 共71页
面向对象程序设计_第4页
第4页 / 共71页
面向对象程序设计_第5页
第5页 / 共71页
点击查看更多>>
资源描述

《面向对象程序设计》由会员分享,可在线阅读,更多相关《面向对象程序设计(71页珍藏版)》请在金锄头文库上搜索。

1、AVCEITAVCEIT5.1 类(class)v类是是组成成Java程程序序的的基基本本元元素素,它它封封装装了了一一系系列列 的的 变 量量 ( 即即 数数 据据 成成 员 , 也也 称称 为 “域域(field)”)和和方方法法(即即成成员方方法法 method),是是一一类对象象的的原原型型。创建建一一个个新新的的类,就就是是创建建一一个个新新的的数数据据类型型。实例例化化一一个个类,就就得得到到一一个个对象象。因因此此,对象象就就是是一一组变量量和和相相关关方方法法的的集集合合,其其中中变量量表表明明对象象的的状状态、属属性性,方方法法表表明明对象所具有的行象所具有的行为。AVCEI

2、Tv5.1.1 类定定义v对一一个个用用户自自定定义的的类,要要为类取取一一个个名名字字,并并指指明明类中中包包含含哪哪些些变量量和和方方法法以以及及相相应的的类型型、实现等等,这称称为类的定的定义。类定定义语句的一般形式句的一般形式为: 修饰符class 类名 extends 父类名 implements 接口名表 成员变量声明 / 类体 方法成员声明 v其其中中class、extends和和implements都都是是Java的的 关关 键 字字 。 修修 饰 符符 、 extends(表表 示示 继 承承 )和和implements(表表示示接接口口)等等内内容容,以以后后逐逐渐介介绍。

3、类定定义中中必必须要要写写的的内内容容是是类名名,应该使使用用Java语言合法的言合法的标识符来符来对自定自定义的的类命名。命名。AVCEITv在在大大括括号号中中定定义类体体,指指明明该类中中包包含含的的数数据据成成员和和成成员方方法。在法。在JavaJava语言中也允言中也允许定定义没有任何成没有任何成员的空的空类。v【例例5.15.1】定定义一一个个名名为RectRect表表示示长方方形形的的类,它它仅包包含含doubledouble类型的型的长lengthlength和和宽widthwidth两个数据成两个数据成员。 class class RectRect double length

4、; double length; double width; double width; v在在类的定的定义中,可加入中,可加入对数据成数据成员进行操作的方法成行操作的方法成员。v【例例5.25.2】定定义一一个个名名为RectangleRectangle表表示示长方方形形的的类,它它包包含含doubledouble类型型的的长lengthlength和和宽widthwidth两两个个数数据据成成员和和设置置长方方形形长宽值的方法的方法setDimsetDim()()、计算算长方形面方形面积的方法的方法area()area()。 AVCEIT class Rectangle class Rec

5、tangle double length; double length; double width; double width; double area() double area() return length * width; return length * width; void void setDim(doublesetDim(double w, double l) w, double l) width = w; width = w; length = l; length = l; v在在一一个个程程序序中中,有有时需需要要定定义多多个个类。多多个个类的的定定义形形式式有有两种:并列和

6、嵌套。两种:并列和嵌套。v常常见的的多多个个类定定义形形式式为并并列列定定义,即即一一个个类接接着着一一个个类进行定行定义,它,它们之之间是并列的关系。是并列的关系。AVCEITv另另一一种种形形式式为嵌嵌套套定定义,即即在在一一个个类中中定定义另另外外的的类,它它们之之间是是包包含含和和被被包包含含的的关关系系,可可分分别称称为包包含含类和和内内部部类(或或嵌嵌套套类)。采采用用何何种种形形式式定定义多多个个类,由,由类之之间的的访问关系确定。关系确定。v类定定义了了一一个个类型型(type)。与与Java语言言提提供供的的几几种种基基本本类型型一一样,类型型用用来来声声明明、定定义该类型型

7、的的变量。例如,下面的量。例如,下面的语句:句: Rect rect1;声明变量rect1的类型为类Rect。v类型型为类的的变量量与与基基本本类型型变量量有有所所不不同同,类是是一一种种引引用用(reference)类型型。实际上上,rect1是是一一个个对类型型为类Rect的的对象象的的引引用用,rect1不不是是对象象本本身身,可可 理理 解解 为 一一 个个 指指 针 , 上上 述述 声声 明明 仅 生生 成成 一一 个个 空空(null)引用。引用。AVCEITv5.1.2 类对象象v一一旦旦定定义了了所所需需的的类,就就可可以以创建建该类的的变量量,创建建类的的变量称量称为类的的实

8、例化,例化,类的的变量也称量也称为类对象、象、类的的实例等。例等。v类的的对象象是是在在程程序序运运行行中中创建建生生成成的的,其其所所占占的的空空间在在程程序序运运行行中中动态分分配配。当当一一个个类的的对象象完完成成了了它它的的使使命命,为节省省资源源,Java的的垃垃圾圾收收集集程程序序就就会会自自动收收回回这个个对象象所所占占的的空空间。即。即类对象有自己的生命周期。象有自己的生命周期。v1.创建建对象象v创建建类的的对象需用象需用new运算符,一般形式运算符,一般形式为: 对象名 = new 类名()AVCEITvnewnew运运算算符符用用指指定定的的类在在内内存存中中分分配配空空

9、间,并并将将存存储空空间的的引引用存入用存入语句中的句中的对象象变量量。例如:例如:rect1 = new rect1 = new RectRect();();vnewnew运算符也可以与运算符也可以与类声明一起使用来声明一起使用来创建建类的的对象。象。例如:例如:RectRect rect1 = new rect1 = new RectRect();();v2.2.引用引用对象象v在在创建建了了类的的对象象后后,就就可可以以对对象象的的各各个个成成员进行行访问,进行各种行各种处理。理。访问对象成象成员的一般形式的一般形式为: 对象名象名. .数据成数据成员名名 对象名象名. .成成员方法名方

10、法名() / () / 方法名方法名带圆括号括号AVCEITv运运算算符符“. .”在在这里里称称为成成员运运算算符符,在在对象象名名和和成成员名名) )之之间起起到到连接接的的作作用用,指指明明是是哪哪个个对象象的的哪哪个个成成员。v例例如如:设已已经定定义了了例例5.25.2中中的的RectangleRectangle类,可可以以用用如下的方法来引用如下的方法来引用对象的成象的成员: Rectangle r = new Rectangle(); / 定义类的对象 r.length,r.width / 引用对象的数据成员 r.area() / 引用对象的成员方法v【例例5.35.3】利利用用

11、例例5.15.1定定义的的类RectRect,计算算长和和宽分分别为2020和和1010的的长方形面方形面积。class RectDemo public static void main(String args) Rect rect1 = new Rect(); / 为对象rect1分配存储空间 double area;AVCEIT rect1.width = 20; / 向数据成员赋值 rect1.length = 10; area = rect1.width * rect1.length; /对数据成员运算 System.out.println(长方形面积是: + area); v本本程程

12、序序由由两两个个类构构成成,设已已经编译类Rect文文件件Rect.class和和RectDemo.class,程序的运行程序的运行结果如下:果如下:长方形面积是:200.0v【例例5.5】用用例例5.2中中定定义的的类Rectangle分分别计算算长、宽分分别为20 、10和和6 、3的两个的两个长方形面方形面积。 class RectDemo2 public static void main(String args) Rectangle rect1 = new Rectangle(); Rectangle rect2 = new Rectangle(); AVCEIT double ar;

13、 rect1.setDim(20, 10); / 初始化每个长方形 rect2.setDim(6, 3); ar = rect1.area(); System.out.println(第一个长方形的面积是: + ar); ar = rect2.area(); System.out.println(第二个长方形的面积是: + ar); v程序运行程序运行结果如下:果如下:第一个长方形的面积是: 200.0第二个长方形的面积是: 18.0 AVCEITv5.1.3 构造方法构造方法v在在Java中中,任任何何变量量在在被被使使用用前前都都必必须先先设置置初初值。Java提提供供了了为类的的成成员变

14、量量赋初初值的的专门功功能能:构构造造方方法法(constructor)。构构造造方方法法是是一一种种特特殊殊的的成成员方法,它的特殊性反映在如下几个方面:方法,它的特殊性反映在如下几个方面:(1)构造方法名与类名相同。(2)构造方法不返回任何值,也没有返回类型。(3)每一个类可以有零个或多个构造方法。(4)构造方法在创建对象时自动执行,一般不能显式地直接调用。AVCEITv【例例5.65.6】分分别计算算长、宽分分别为2020、1010和和6 6、 3 3的的两两个个长方方形形面面积。本本程程序序用用构构造造方方法法来来初初始始化化长方方形形的大小。的大小。 class RectConstr

15、uctor double length; double width; double area() return length * width; RectConstructor(double l, double w) length = l; width = w; AVCEIT class RectDemo3 public static void main(String args) RectConstructor rect1=new RectConstructor (20,10); RectConstructor rect2=new RectConstructor (6,3); double ar

16、; ar = rect1.area(); System.out.println(第一个长方形的面积是: + ar); ar = rect2.area(); System.out.println(第二个长方形的面积是: + ar); v程序运行程序运行结果如下:果如下: 第一个长方形的面积是: 200.0 第二个长方形的面积是: 18.0 AVCEITv5.1.4 5.1.4 类和成和成员的修的修饰符符v在在类和和类的的成成员定定义时可可以以使使用用一一些些修修饰符符(modifiermodifier)来来对类和和成成员的的使使用用作作某某些些限限定定。一一般般将将修修饰符符分分为两两类:访问控

17、控制制符符和和非非访问控控制制 符符 。 访 问 控控 制制 符符 有有 publicpublic、 protectedprotected、privateprivate等等,它它们的的作作用用是是给予予对象象一一定定的的访问权限限,实现类和和类中中成成员的的信信息息隐藏藏。非非访问控控制制符符作作用用各各不不相相同同,有有staticstatic、finalfinal、nativenative、volatilevolatile、abstractabstract等等。某某些些修修饰符符只只能能应用用于于类的的成成员,某某些些修修饰符符既既可可应用用于于类也也可可应用用于于类的成的成员。AVCEI

18、Tv1.1.staticstatic修修饰符符v使使用用staticstatic修修饰符符来来修修饰类的的成成员变量量和和方方法法成成员,使使它它们成成为静静态成成员,也也称称为类成成员。静静态成成员存存储于于类的的存存储区区,属属于于整整个个类,而而不不属属于于一一个个具具体体的的类对象象。因因为静静态成成员属属于于整整个个类,所所以以它它被被所所有有该类对象象共共享享。在在不不同同的的类对象象中中访问静静态成成员,访问的是同一个。的是同一个。v对静静态成成员的使用要注意两点:的使用要注意两点:v(1)(1)静静态方方法法不不能能访问属属于于某某个个对象象的的成成员变量量,而而只只能能处理理

19、属属于于整整个个类的的成成员变量量。即即静静态方方法法只只能能处理静理静态变量。量。v(2)(2)可以用两种方式可以用两种方式调用静用静态成成员,它,它们的作用相同。的作用相同。 变量:类名.变量、类对象.变量。 方法:类名.方法名()、类对象.方法名()。AVCEITv【例【例5.85.8】静】静态成成员的使用。的使用。 class StaticDemo static int a = 42; static int b = 99; static void callme() System.out.println(a = + a); class StaticByName public static

20、 void main(String args) StaticDemo.callme(); System.out.println(b = + StaticDemo.b); AVCEITv程序运行程序运行结果如下:果如下: a = 42 b = 99v2.final2.final修修饰符符vfinalfinal修修饰符符可可应用用于于类、方方法法和和变量量。finalfinal的的意意义为终极极或或最最终。finalfinal类不不能能被被继承承,即即finalfinal类无无子子类。finalfinal方方法法不不能能被被覆覆盖盖,即即子子类的的方方法法名名不不能能与与父父类的的finalfin

21、al方方法法名名相相同同。finalfinal变量量实际上上是是JavaJava语言言的的符符号号常常量量,可可在在定定义时赋初初值或或在在定定义后后的的其其他他地地方方赋初初值,但但不不能能再再次次赋值,习惯上上使使用大写的用大写的标识符表示符表示finalfinal变量。例如:量。例如: final double PI = 3.1416; final double G = 9.18;v因因为finalfinal变量量不不能能改改变,没没有有必必要要在在每每个个对象象中中进行行存存储,可以将可以将finalfinal变量声明量声明为静静态的,以的,以节省存省存储空空间。AVCEIT例如: s

22、tatic final double PI = 3.1416;v3.abstract修修饰符符vabstract修修饰符符可可应用用于于类和和方方法法,称称为抽抽象象类和和抽抽象象方方法法。抽抽象象类需需要要继承承、抽抽象象方方法法需需要要在在子子类中中实现才才有有意意义。进一步的一步的讨论见5.2.2抽象抽象类和抽象方法。和抽象方法。v4.native修修饰符符vnative修修饰符符一一般般用用来来声声明明用用其其他他语言言如如C、C+、FORTRAN、汇编等等书写写方方法法体体并并具具体体实现方方法法功功能能的的特特殊殊方方法法。由由于于native方方法法的的方方法法体体使使用用其其他

23、他语言言编写写。所所以以所所有有的的native方方法法都都没没有有方方法法体体。native方方法法可可应用用于于实时性性强、执行效率高,运行速度要求行效率高,运行速度要求较高的高的场合。合。v5.synchronized修修饰符符vsynchronized修修饰符可符可应用于方法或用于方法或块,在多,在多线程程AVCEITv程程序序中中,对用用于于共共享享的的方方法法和和块加加互互斥斥锁,使使得得任任一一时刻刻,synchronized方方法法或或块只只能能由由一一个个线程程执行或操作。行或操作。v5.1.5 类的使用的使用v1.私有成私有成员的的访问v为 了了 降降 低低 类 间 的的

24、耦耦 合合 性性 , 可可 以以 为 类 成成 员 指指 定定private修修饰符符,表表示示该成成员只只能能在在该类内内部部访问。若若需需要要在在其其他他类中中访问私私有有成成员,只只能能通通过取取数数和和送送数数的的方方法法来来访问。这样的的方方法法常常命命名名为getXxx()和和setXxx()等。等。v【例【例5.9】私有成】私有成员的的访问。 class RectangleRC private double length; private double width; AVCEIT double getLength() / 定义取长方形边长的方法 return length; do

25、uble getWidth() return width; RectangleRC(double l, double w) length = l; width = w; class RectDemo5 public static void main(String args) RectangleRC rect1 = new RectangleRC(8,7); double ar = rect1.getLength()*rect1.getWidth(); System.out.println(长方形的面积是: + ar); AVCEITv程序运行程序运行结果如下:果如下:长方形的面积是: 56.0

26、v2.方法参数是方法参数是类的的对象象v在在Java语言言中中,方方法法的的参参数数类型型除除了了可可以以是是基基本本类型型外外,还可可以以是是引引用用类型型类。因因为在在类的的对象象中中实际存存储为对象象的的引引用用,因因此此在在调用用类参参数数时方方法法间传送送的的是是引引用用。尽尽管管Java采采用用值传送送,引引用用从从调用用方方法法单向向传送送到到被被调方方法法,但但由由于于调用用方方法法与与被被调方方法法对应类参参数数的的引引用用相相同同,它它们引引用用同同一一对象象,所所以以,若若在在被被调方方法法中中修修改改了了引引用用类型型形形式式参参数数的的取取值,则调用用方方法法对应的的

27、实际参参数数也也将将发生生相相应的的变化化。即即调用用方方法法与与被被调方方法法之之间是是“引引用用单向向传送送,数据双向数据双向传送送”。v应用引用用引用类型的方法参数,可在方法型的方法参数,可在方法间传送数据。送数据。AVCEITv【例【例5.10】引用】引用类型的方法参数是方法型的方法参数是方法间传送数据的送数据的桥梁。梁。 class RefParameter double width,length,area; RefParameter(double w,double l) width = w; length = l; void calArea(RefParameter r) r.ar

28、ea = r.width * r.length; class PassObject public static void main(String args) RefParameter rr = new RefParameter(10,20); rr.calArea(rr); System.out.println(长方形面积为 : + rr.area); AVCEITv程序运行程序运行结果如下:果如下:长方形面积为 :200.0v3.方法返回方法返回值为类的的对象象v在在Java语言言中中,方方法法的的返返回回值类型型也也可可以以为引用引用类型,例如:型,例如:类。v【例【例5.11】方法的返回

29、】方法的返回值类型型为引用引用类型。型。 class RetClass double width,length,area; RetClass(double w,double l) width = w; length = l; RetClass calArea(RetClass r) r.area = r.width * r.length;AVCEIT return r; class ReturnObject public static void main(String args) RetClass rr = new RetClass(10,20); rr = rr.calArea(rr); S

30、ystem.out.println(长方形面积为 : + rr.area); v程序运行程序运行结果如下:果如下:长方形面积为 :200.0AVCEITv4.类对象作象作为类的成的成员v类的的数数据据成成员也也可可以以是是引引用用类型型的的数数据据,如如数数组、字字符符串串和和类等等。若若一一个个类的的对象象是是一一个个类的的成成员时,要要用用new运运算算符符为这个个对象象分分配配存存储空空间。在在包包含含类数数据据成成员的的类及及类的的实例例中可以中可以访问类数据成数据成员的成的成员。v【例【例5.12】类对象作象作为类的成的成员。 class RectC double width,len

31、gth; RectC(double w,double l) width = w; length = l; AVCEIT class RectangleC / 具有两个成员的类 RectC r = new RectC(10,20); / 类成员要分配空间 double area; / 基本类型成员 class ClassMember public static void main(String args) RectangleC rr = new RectangleC(); rr.area = rr.r.width * rr.r.length; System.out.println(长方形面积为

32、: + rr.area); v程序运行程序运行结果如下:果如下:长方形面积为 :200.0AVCEITv5.内部内部类(Inner class)v内内部部类,也也称称为嵌嵌套套类,被被附附加加到到JDK1.1及及更更高高版版本本中中。内内部部类允允许一一个个类定定义被被放放到到另另一一个个类定定义里里、一一个个语句句块里里或或一一个个表表达达式式内内部部。内内部部类是是一一个个有有用用的的特特征征,因因为它它们允允许将将逻辑上上同同属属性性的的类组合合到到一一起起,并并在在另另一一个个类中中控控制制一个一个类的可的可视性。性。v【例【例5.13】在一个】在一个类中定中定义类(内部(内部类)。)

33、。 class RectDemo6 public static void main(String args) double ar; class RectangleR double length; double width; double area() return length * width; / 返回面积 AVCEIT void setDim(double w, double l) width = w; length = l; RectangleR rect1 = new RectangleR(); RectangleR rect2 = new RectangleR(); rect1.se

34、tDim(10, 20); / 初始化每个长方形 rect2.setDim(3, 6); ar = rect1.area(); System.out.println(第一个长方形面积是: + ar); ar = rect2.area(); System.out.println(第二个长方形面积是: + ar); AVCEITv程序运行程序运行结果如下:果如下:第一个长方形面积是: 200.0第二个长方形面积是: 18.0v因因为内内部部类定定义在在一一个个类中中,因因此此内内部部类的的名名称称不不能能与与所所嵌嵌套套的的类相相同同,而而且且只只能能在在定定义的的范范围中中使使用用。内内部部类具

35、具有有下下面一些特性:面一些特性:(1)内部类可以被定义在方法中。它可以访问嵌套类的方法的final变量。(2)内部类可以使用所嵌套类的类变量和实例变量以及所嵌套的块中的本地变量。(3)内部类可以被定义为abstract抽象类。AVCEIT(4)内部类可以被声明为private或protected,以便防护它们不受来自外部类的访问。访问保护不阻止内部类使用其他类的任何成员。 (5)一个内部类可以作为一个接口,由另一个内部类实现。(6)声明为static的内部类成为顶层类。这些内部类失去了在本地范围和其他内部类中使用数据或变量的能力。(7)内部类不能声明任何static成员,只有顶层类可以声明s

36、tatic成员。因此,一个需求static成员的内部类必须使用来自顶层类的成员。AVCEIT5.2 类的的继承承(inheritance)v继承承是是面面向向对象象程程序序设计的的另另一一个个重重要要特特色色,类继承承也也称称为类派派生生,是是指指一一个个类可可以以继承承其其他他类的的非非私私有有成成员,实现代代码复复用用。被被继承承的的类称称为父父类或或超超类,父父类包包括括所所有有直直接接或或间接接被被继承承的的类;继承承父父类或或超超类后后产生的生的类称称为派生派生类或子或子类。vJava语言言以以Object类作作为所所有有类的的父父类,所所有有的的类都都是是直直接接或或间接接地地继承

37、承Object类得得到到的的。Java还提提供供不不同同层次次的的标准准类,使使用用户可可根根据据需需要要派派生生自自己己的的类。AVCEITv在在Java语言言中中,只只允允许单继承承。所所谓单继承承是是指指每每个个类只只有有一一个个父父类,不不允允许有有多多个个父父类。但但一一个个类允允许同同时拥有有多多个个子子类,这时这个个父父类实际上上是是所所有有子子类的的公公共共成成员变量量和和公公共共方方法法成成员的的集集合合,而而每每一一个个子子类则是是父父类的的特特殊殊化化,是是对公公共共成成员变量量和和方方法法成成员的的功功能能、内内涵涵方方面面的的扩展展和和延延伸伸。Java语言的多言的多

38、继承可通承可通过接口来接口来实现。v类继承承不不改改变成成员的的访问权限限,父父类中中的的成成员为公公有有的的或或被被保保护的的,则其其子子类的的成成员访问权限限也也继承承为公有的或被保公有的或被保护的。的。AVCEITv5.2.1 类继承的承的实现vJava中中的的继承承是是通通过extends关关键字字来来实现的的,在在定定义新新类时使使用用extends关关键字字指指明明新新类的的父父类,就就在在两两个个类之之间建立了建立了继承关系。承关系。v1.定定义子子类v通通过继承承系系统类定定义子子类的的例例子子已已经见过的的有有例例1.2的的小小程程序序和例和例3.32的自定的自定义异常异常处

39、理程序,其理程序,其类头分分别为: public class HelloApplet extends Applet. class MyException extends Exception .v一一般般地地,在在类声声明明中中,加加入入extends子子句句来来创建建一一个个类的的子子类。extends后后即即为父父类名名,若若父父类名名又又是是某某个个类的的子子类,则定定义的的类也也是是该类的的(间接接)子子类。若若无无extends子子句句,则该类为java.lang.Object的子的子类。AVCEITv2.类继承的承的传递性性v类继承承具具有有传递性性,即即子子类继承承父父类的的所所有

40、有非非私私有有成成员,也也继承父承父类的父的父类直至祖先所有的所有非私有成直至祖先所有的所有非私有成员。v3.类的成的成员覆盖覆盖v在在类的的继承承中中,若若子子类(派派生生类)新新增增的的成成员名名称称与与父父类(超(超类)成)成员相同,相同,则称称为成成员覆盖(覆盖(overriding)。)。v在在子子类中中定定义与与父父类同同名名成成员的的目目的的是是修修改改父父类的的属属性性和和行行为。 AVCEITv(1)成成员变量的覆盖量的覆盖v若若子子类声声明明了了与与父父类同同名名的的变量量,则父父类的的变量量被被隐藏藏起起来来,直直接接使使用用的的是是子子类的的变量量,但但父父类的的变量量

41、仍仍占占据据空空间,可可通通过super或父或父类名来名来访问。v【例例5.14】在在子子类中中定定义了了与与父父类同同名名的的变量量,从从而而隐藏藏了父了父类成成员变量,量,这种种隐藏藏变量可加量可加super前前缀来来访问。 class A int x = 100; AVCEIT class B extends A int x = 200; void print() System.out.println(Subclass : + x); System.out.println(Superclass : + super.x); public static void main(String ar

42、gs) (new B().print(); v程序运行程序运行结果如下:果如下:Subclass : 200Superclass : 100AVCEITv(2)成成员方法覆盖方法覆盖v与与子子类可可以以定定义与与父父类同同名名的的成成员变量量,实现对父父类成成员变量量的的隐藏藏的的情情况况一一样,子子类也也可可以以定定义与与父父类同同名名的的方方法法,实现对父父类方方法法的的覆覆盖盖。方方法法成成员的的覆覆盖盖与与成成员变量量的的隐藏藏的的不不同同之之处在在于于:子子类隐藏藏父父类的的成成员变量量只只是是使使得得它它不不可可见,父父类的的同同名名成成员变量量在在子子类对象象中中仍仍然然占占据据

43、自自己己的的存存储空空间;v而而子子类成成员方方法法对父父类同同名名方方法法的的覆覆盖盖将将清清除除父父类方方法法占占用用的内存空的内存空间,从而使得父,从而使得父类的方法在子的方法在子类对象中不复存在。象中不复存在。AVCEITv方方法法的的覆覆盖盖中中需需注注意意的的是是:子子类在在重重新新定定义父父类已已有有的的方方法法时,应保保持持与与父父类完完全全相相同同的的方方法法头声声明明,即即应与与父父类有有完完全全相相同同的的方方法法名名、返返回回值和和参参数数列列表表。否否则就就不不是是方方法法的的覆覆盖盖。而而是是在在子子类定定义自自己己的的与与父父类无无关关的的成成员方方法法,父父类的

44、的方法未被覆盖,所以仍然存在。方法未被覆盖,所以仍然存在。v下述下述规则适用于覆盖方法:适用于覆盖方法:覆盖方法的返回类型必须与它所覆盖的方法相同。覆盖方法不能比它所覆盖的方法访问性差。覆盖方法不能比它所覆盖的方法抛出更多的异常。AVCEITv4.派生派生类的初始化的初始化v在在创建建派派生生类的的对象象时,使使用用派派生生类的的构构造造方方法法对其其初初始始化化,不不但但要要对自自身身的的成成员变量量赋初初值,还要要对父父类的的的的成成员变量量赋初初值。因因为成成员变量量赋初初值通通常常在在构构造造方方法法中中完完成成,因因此此在在Java语言言中中,允允许派派生生类继承承父父类的的构构造造

45、方方法法。构构造造方方法法的的继承承遵遵循循如如下的原下的原则:(1)若父类是无参数的构造方法,则子类无条件的继承该构造方法。(2)若子类无自己的构造方法,则它将继承父类的无参构造方法作为自己的构造方法;若子类有自己的构造方法,则在创建子类对象时,它将先执行继承自父类的无参构造方法,然后再执行自己的构造方法。AVCEIT(3)若父类是有参数的构造方法,子类可以通过在自己的构造方法中使用super关键字来调用它,但这个调用语句必须是子类构造方法的第一个可执行语句。v【例例5.15】继承承例例5.6中中的的类RectConstructor时对父父类的成的成员变量量赋初初值。 class Cube

46、extends RectConstructor double height; Cube(double l,double w,double h) super(l,w); height = h; void vol() System.out.println(长方体体积 = + area() * height); AVCEIT public class CubeDemo public static void main(String args) Cube c = new Cube(7,6,5); c.vol(); v程序运行程序运行结果如下:果如下:长方体体积 = 210.0AVCEITv5.2.2 抽

47、象抽象类和抽象方法和抽象方法vabstract修修饰的的抽抽象象类需需要要子子类继承承,在在派派生生类中中实现抽抽象象类中中的的抽抽象象方方法法。抽抽象象类被被派派生生、抽抽象象方方法法被被子子类实现后后,才才有有实际意意义。抽抽象象方方法法是是只只有有返返回回值类型型、方方法法名名、方方法法参参数数而而不不定定义方方法法体体的的一一种种方方法法。抽抽象象方方法法的的方方法法体体在在子子类中中才才编写写实现。注注意意不不能能用用abstract修修饰构构造造方方法法、静静态方方法和私有法和私有(private)方法,也不能覆盖父方法,也不能覆盖父类中的抽象方法。中的抽象方法。v抽抽象象方方法法

48、必必须定定义在在抽抽象象类中中。抽抽象象类是是一一种种未未实现的的类,抽象抽象类不能用不能用new实例化一个例化一个对象。象。v【例例5.16】计算算底底面面半半径径为2高高为3的的圆柱柱体体体体积和和长、宽、高分高分别为3、2、4的的长方形体方形体积。 abstract class Shape / 定义抽象类Shape double radius,length,width,height; abstract double vol(); / 抽象方法volAVCEIT Shape(double r,double h) / 定义构造方法 radius = r; height = h; Shape(

49、double l,double w,double h) length = l; width = w; height = h; class Circle extends Shape Circle(double r,double h) super(r,h); AVCEIT double vol() /在抽象类的子类中实现抽象方法 return(3.1416 * radius * radius * height); class Rectangle extends Shape Rectangle(double l,double w,double h) super(l,w,h); double vol(

50、) return(length * width * height); AVCEITclass AbstractClassDemo public static void main(String args) Circle c = new Circle(2,3); Rectangle r = new Rectangle(3,2,4); System.out.println(圆柱体体积 = + c.vol(); System.out.println(长方体体积 = + r.vol(); v程序的运行程序的运行结果如下:果如下:圆柱体体积 = 37.6992长方体体积 = 24.0AVCEITv5.2.

51、3 类对象之象之间的的类型型转换v与与基基本本数数据据类型型之之间的的强制制类型型转换类似似,在在Java语言言中中,有有继承承关关系系的的父父类对象象和和子子类对象象之之间也也可可以以在在一一定定条条件件下下相相互互转换。父父类对象象和和子子类对象象的的转换需要注意以下原需要注意以下原则:v(1)子子类对象象可可以以被被视为是是其其父父类的的一一个个对象象,反反之之则不可。不可。v(2)若若一一个个方方法法的的形形式式参参数数定定义的的是是父父类的的对象象,则调用用该方法的方法的实际参数可以使用子参数可以使用子类对象。象。v(3)若若父父类对象象引引用用指指向向的的实际是是一一个个子子类对象

52、象(在在以以前前的的某某个个时候候根根据据(1)将将子子类对象象的的引引用用赋值给这个个父父类对象象的的引引用用),则这个个父父类对象象的的引引用用可可以用以用强制制类型型转换转化成子化成子类对象的引用。象的引用。AVCEIT5.3 接口(接口(interface)v接接口口是是若若干干完完成成某某一一特特定定功功能能的的没没有有方方法法体体的的方方法法(抽抽象象方方法法)和和常常量量的的集集合合。接接口口仅提提供供了了方方法法协议的的封封装装。为了了获取取接接口口功功能能和和真真正正实现接接口口功功能能需需要要使使用用类来来继承承该接接口口。在在继承承接接口口的的类中中,通通过定定义接接口口

53、中中抽抽象象方方法法的的方方法体(即抽象方法的覆盖)来法体(即抽象方法的覆盖)来实现接口功能。接口功能。vJava语言言使使用用接接口口来来实现类间多多重重继承承的的功功能能,从从而而弥弥补了了Java语言言只只支支持持类间单重重继承承,描描述述复复杂实际问题处理不方便的不足。理不方便的不足。AVCEITv5.3.1 5.3.1 接口的定接口的定义和和实现v1.1.接口的定接口的定义v在在JavaJava语言言中中,用用关关键字字interfaceinterface来来定定义接接口口。接接口有口有类似似类的的结构,其定构,其定义格式如下:格式如下: 修饰符 interface 接口名 exte

54、nds 父接口名表 / 接口体 v接接口口定定义包包括括定定义接接口口名名和和接接口口体体。接接口口名名是是一一合合法法的的标识符符。接接口口体体同同抽抽象象类相相似似,为变量量和和抽抽象象方方法法的的集集合合,但但没没有有构构造造方方法法和和静静态初初始始化化代代码。接接口口体体中中定定义的的变量量均均为终极极(finalfinal)的的、静静态(staticstatic)的的和和公公共共(publicpublic)的的。接接口口体体中中定定义的的方方法法均均为抽抽象象的的和和公公共共的的。由由于于接接口口所所有有成成员均均具有具有这些特性,相关的修些特性,相关的修饰符可以省略。符可以省略。

55、AVCEITv2.接口的接口的实现v在在某某个个继承承接接口口的的派派生生类中中为接接口口中中的的抽抽象象方方法法书写写语句句并并定定义实在在的的方方法法体体称称为实现这个个接接口口。派派生生类实现哪哪个个或或哪哪些些接接口口用用implements说明明,不不能能用用extends说明。明。v派派生生类在在实现接接口口时,还要要注注意意:若若实现接接口口的的类不不是是抽抽象象类,则在在该类的的定定义部部分分必必须实现指指定定接接口口的的所所有有抽抽象象方方法法。方方法法体体可可以以由由java语言言书写写,也也可可以以由由其其他他语言言书写写。因因为是是覆覆盖盖方方式式,所所以以方方法法头部

56、部分分应该与与接接口口中中的的定定义完完全全一一致致,即即有有完完全全相相同的参数表和返回同的参数表和返回值。AVCEITv【例【例5.17】接口的】接口的实现。 interface Irect double w=3,l=4; void compute(); class Crect implements Irect public void compute() System.out.println( 边长分别为3和4的长方形面积为:+w*l); public class InterfaceDemo public static void main(String args) Crect r = ne

57、w Crect(); pute(); AVCEITv程序运行程序运行结果如下:果如下:边长分别为3和4的长方形面积为:12.0v5.3.2 接口的接口的继承和承和组合合v接接口口也也可可以以通通过关关键字字extends继承承其其他他接接口口。子子接接口口将将继承承父父接接口口中中所所有有的的常常量量和和抽抽象象方方法法。此此时,子子接接口口的的非非抽抽象象派派生生类不不仅需需实现子子接接口口的的抽抽象象方方法法,而而且且需需实现继承承来来的的抽象方法。不允抽象方法。不允许存在未被存在未被实现的接口方法。的接口方法。v【例【例5.18】接口的】接口的继承。承。 interface A Stri

58、ng a = 在接口A中; void showA(); AVCEIT interface B extends A String b = 在接口B中; void showB(); interface C extends B String c = 在接口C中; void showC(); class InterfaceABC implements C public void showA() System.out.println(a); public void showB() System.out.println(b); AVCEIT public void showC() System.out.p

59、rintln(c); public class UseInterface2 public static void main(String args) InterfaceABC i = new InterfaceABC(); i.showA();i.showB();i.showC(); v程序运行程序运行结果如下:果如下:在接口A中在接口B中在接口C中AVCEITv5.3.3 接口的多接口的多态v接接口口的的使使用用使使得得方方法法的的描描述述说明明和和方方法法功功能能的的实现分分开开考考虑,这有有助助于于降降低低程程序序的的复复杂性性,使使程程序序设计灵灵活活,便便于于扩充充修修改。改。这也是

60、也是Java面向面向对象程序象程序设计方法中多方法中多态特性的体特性的体现。v【例【例5.19】定】定义接口并接口并实现接口,接口,说明接口的多明接口的多态。 interface OneToN int disp(int n); class Sum implements OneToN public int disp(int n) int s = 0,i; for(i = 1;i = n;i +)s += i; return s; AVCEITclass Pro implements OneToN / 继承接口 public int disp(int n) / 实现接口中的disp方法 int m

61、 = 1,i; for(i = 1;i = n;i +)m *= i; return m; public class UseInterface public static void main(String args) int n = 10; Sum s = new Sum(); Pro p = new Pro(); System.out.println(1至n的和 = + s.disp(n); System.out.println(1至n的积 = + p.disp(n); AVCEITv程序的运行程序的运行结果如下:果如下:1至n的和 = 551至n的积 = 3628800v5.3.4 接口接

62、口类型的使用型的使用v接接口口可可以以作作为一一种种引引用用类型型来来使使用用。任任何何实现接接口口的的类的的实例例都都可可以以存存储在在该接接口口类型型的的变量量中中。通通过这些些变量量可可以以访问类所所实现的的接接口口中中的的方方法法。Java运运行行时系系统动态地地确定确定应该使用哪个使用哪个类中的方法。中的方法。AVCEITv【例【例5.20】接口】接口类型的使用(型的使用(结果同例果同例5.12)。 public class UseInterface1 public static void main(String args) int n = 10; OneToN otn; Sum s

63、 = new Sum(); otn = s; System.out.println(1至n的和 = + otn.disp(n); Pro p = new Pro(); otn = p; System.out.println(1至n的积 = + otn.disp(n); AVCEIT5.4 包(包(package)v一一组相相关关的的类和和接接口口集集合合称称为包包。包包体体现了了Java语言言面面向向对象象特特性性中中的的封封装装机机制制,包包将将java语言言的的类和和接接口口有有机机地地组织成成层次次结构构,这个个层次次结构构与与具具体体的的文文件件系系统的的目目录树结构构层次次一一致致。

64、因因此此,Java包包就就是是具具有有一一定定相相关关性性在在文文件件系系统中中可可准准确确定定位位的的Java文件的集合。文件的集合。AVCEITv5.4.1 创建包创建包v包由包包由包语句句package创建,其建,其语法格式如下:法格式如下: package 包名1.包名2.v关关键字字package后后是是不不同同层次次的的包包名名,在在包包名名1下下允允许有有次次一一级的的子子包包包包名名2,包包名名2下下可可以以有有更更次次一一级的的子子包包包包名名3等等等等。各各级包包名名之之间用用“.”号号分分隔隔。通常情况下,包名称的元素被整个地小写。通常情况下,包名称的元素被整个地小写。v

65、在在Java程程序序中中,package语句句必必须是是程程序序的的第第一一条条非非空空格格、非非注注释语句句。通通过package语句句,可可将将Java程程序序分分层次次地地存存放放在在不不同同的的目目录下下,目目录名名称称与包的名称相同。与包的名称相同。v【例例5.21】在在例例5.1的的类定定义前前加加语句句package创建包建包(例例5.1的程序代的程序代码保持不保持不变)。 package ch05; AVCEITv编译程程序序完完成成生生成成Rect.class文文件件后后,可可将将当当前前目目录的的Rect.class文件复制或移文件复制或移动到到创建的建的ch05子目子目录

66、中。中。v若若在在编译上上述述程程序序时,带d编译参参数数来来进行行编译,即即使使用用编译命令:命令: javac -d 目录名 Rect.javav来来进行行编译,java系系统自自动在在命命令令行行中中d参参数数指指定定的的目目录(该目目录已已经存存在在)中中创建建ch05(与与程程序序中中的的包包名名相相同同)子子目目录,然后自然后自动将生成的将生成的类文件文件Rect.class存放其中。存放其中。AVCEITv5.4.2 使用包使用包v将将类组织为包包的的目目的的是是为了了更更好好地地利利用用包包中中的的类。一一般般情情况况下下,一一个个类只只能能引引用用与与它它在在同同一一个个包包

67、中中的的类。v在在Java程程序序中中,若若要要用用到到某某些些包包中中的的类或或接接口口,一一种种方方法法是是在在程程序序的的开开始始部部分分写写出出相相应的的引引入入(import)语句句,指指出出要要引引入入哪哪些些包包的的哪哪些些类。另另一一种种方方法法不不用用引引入入语句句,直直接接在在要要引引入入的的类和和接接口口前前给出出其其所所在在包包名名。无无论采采用用哪哪种种方方法法,使使用用系系统类的前提是的前提是这个系个系统类应该是用是用户程序可程序可见的的类。AVCEITv1.使用使用import语句句vimport语句句用用于于灵灵活活地地实现在在编译单元元中中使使用用外外部部类和

68、和接接口口的的引引入入机机制制,引引入入语句句不不必必考考虑类和和接接口口的的引引入入顺序序和和是是否否被多次引入。被多次引入。vimport语句的格式如下:句的格式如下: import 包名; import 包名.标识符; import 包名.*; v2.直接使用包直接使用包v这种种方方法法一一般般用用在在程程序序中中引引用用类和和接接口口次次数数较少少的的时候候,在在要引入的要引入的类和接口前直接和接口前直接给出其所在包名。出其所在包名。例如:java.applet.Applet ap = new java.applet.Applet(); AVCEITv在在一一些些JavaJava程程序

69、序中中,还使使用用全全局局唯唯一一包包名名(Globally Globally Unique Unique Package Package NameName)的的引引用用形形式式。全全局局是是相相对于于InternetInternet和和IntranetIntranet而而言言的的。全全局局唯唯一一包包名名通通常常以以一一个个InternetInternet域域名名经过将域名前后将域名前后颠倒的倒的简单变换来命名。来命名。例如: com.sun.java.io.*;v3.3.使用使用CLASSPATHCLASSPATH环境境变量量vCLASSPATHCLASSPATH环境境变量量的的作作用用与

70、与DOSDOS的的PATHPATH和和APPENDAPPEND命命令令作作用用类似似,当当一一个个程程序序找找不不到到它它所所需需要要的的其其他他类的的. .classclass文文件件时,系系统会自会自动到到CLASSPATHCLASSPATH环境境变量所指明的路径中去量所指明的路径中去查找。找。v通通过SETSET命命令令设置置CLASSPATHCLASSPATH,可可设置置程程序序对类的的搜搜索索路路径径。若若设置置错误,JavaJava程程序序将将不不能能正正常常执行行。下下面面是是一一个个设置置CLASSPATHCLASSPATH的的SETSET命令:命令: SET CLASSPAT

71、H = .;c:jdk1.5lib;c:jdk1.5libclasses.zipAVCEITv它它将将JavaJava类搜搜索索路路径径设置置为当当前前目目录、c:jdk1.5libc:jdk1.5lib目目录和和c:jdk1.5libclasses.zipc:jdk1.5libclasses.zip。v对JavaJava应用用程程序序,还可可以以通通过设置置JavaJava解解释器器开开关关参参数数来来指指定定类文文件件的的搜搜索索路路径径。例例如如,对于于SunSun公公司司的的JaveJave SDKSDK解解释器器java.exejava.exe,有开关参数有开关参数- -classp

72、athclasspath。v例例如如,若若需需要要解解释执行行的的Hello.classHello.class文文件件不不在在当当前前目目录,而而在在D D盘根根目目录下下jfilejfile目目录中中,则可可以以使使用用如如下下的的命命令令行行语句句来来执行行SDKSDK解解释器:器: java Hello -classpath d:jfilev【例例5.225.22】对例例5.35.3中中类RectDemoRectDemo引引用用例例5.215.21中中的的ch05ch05包包中中的的类RectRect的使用。可在例的使用。可在例5.35.3的的类定定义前添加前添加语句:句:AVCEIT

73、package ch05; import ch05.*;v编译完完成成产生生classclass文文件件后后将将其其从从当当前前目目录复复制制或或移移动到到ch05ch05子目子目录下,可在当前目下,可在当前目录下用如下的命令来下用如下的命令来执行:行: java ch05.RectDemov程序运行程序运行结果同例果同例5.35.3一一样。v5.4.3 5.4.3 类及及类成成员的的访问权限限vJavaJava程程序序将将数数据据和和对数数据据的的处理理代代码封封装装为类,并并以以类为程程序序的的基基本本单位位,但但类又又被被封封装装在在包包中中。要要访问类或或封封装装在在类中的数据和代中的

74、数据和代码,必,必须清楚在什么情况下,它清楚在什么情况下,它们是可是可访问的。的。AVCEITv一一个个类总可可以以访问和和调用用自自己己的的变量量和和方方法法,但但这个个类之之外外的的程程序序其其他他部部分分是是否否能能访问这些些变量量和和方方法法,则由由该变量量和和方法以及它方法以及它们所属所属类的的访问控制符决定。控制符决定。v1.1.类成成员的的访问权限限vJavaJava将将类的的成成员可可见性性(可可访问性性)划划分分为五五种种情情况况,按按照照可可见性的范性的范围大小从小到大列出如下:大小从小到大列出如下:(1)(1)仅在本在本类内可内可见。(2)(2)在本在本类及其子及其子类可

75、可见。(3)(3)在同一包内可在同一包内可见。(4)(4)在同一包内及其子在同一包内及其子类(不同包)可(不同包)可见。(5)(5)在所有包内可在所有包内可见。AVCEITv类成成员的的可可访问性性与与定定义时所所用用的的修修饰符符privateprivate( 私私 有有 ) 、 protectedprotected( 保保 护 ) 、 private private protectedprotected(私私有有保保护)和和publicpublic(公公共共)有有关关。声声明明为privateprivate的的类成成员仅能能在在本本类内内被被访问;声声明明为protectedprotect

76、ed的的类成成员可可以以在在本本类、本本包包、本本类的的子子类被被访问;声声明明为private private protectedprotected的的类成成员可可以以在在本本类、本本类的的子子类被被访问;声声明明为publicpublic的的类成成员可可以以在在所所有有包包内内被被访问;未未用用修修饰符符声声明明的的类成成员,则隐含含为在本包内可被在本包内可被访问。v2.2.类的的访问权限限v类通通常常只只用用两两种种访问权限限:缺缺省省和和publicpublic。类声声明明为publicpublic时,可可以以被被任任何何包包的的代代码访问;缺缺省省时,可可被被本本包包的的代代码访问。

77、因因为类封封装装了了类成成员,因因此此,类成成员的的访问权限也与限也与类的的访问权限有关。限有关。AVCEITv5.4.4 Java的的应用程序接口(用程序接口(API)vJava的的应用用程程序序接接口口API是是以以包包的的形形式式提提供供的的,每每个个包内包含大量相关的包内包含大量相关的类、接口和异常。、接口和异常。v(1)java.langvJava语言言的的核核心心包包,有有Java程程序序所所需需要要的的最最基基本本的的类和和接接口口,包包括括Object类、基基本本数数据据类型型包包装装类、数数学学类、异异常常处理理类、线程程类、字字符符串串处理理类、系系统与运行与运行类和和类操

78、作操作类等。等。这个包由个包由编译器自器自动引入。引入。v(2)java.appletv用用来来实现运运行行于于Internet浏览器器中中的的Java Applet的的工工具具类库,它它包包含含少少量量的的几几个个接接口口和和一一个个非非常常有有用用的的类java.applet.Applet。 AVCEITv(3)java.awtv是是Java抽抽象象窗窗口口工工具具箱箱包包,包包含含许多多字字体体和和颜色色设置置、几几何何绘图、图像像显示示、图形形用用户接接口口操操作作的的类和接口。和接口。v(4)java.iov是是Java语言言的的标准准输入入/输出出类库,包包含含实现Java程程序序

79、与与操操作作系系统、外外部部设备以以及及其其他他Java程程序序做做数数据据交交换所所使使用用的的类,例例如如基基本本输入入/输出出流流、文文件件输入入/输出出流流、过滤输入入/输出出流流、管管道道输入入/输出出流流、随随机机输入入/输出流等。出流等。还包含了目包含了目录和文件管理和文件管理类等。等。v(5)v是是Java网网络包,包,实现网网络功能。功能。 AVCEITv(6)java.utilv包包含含了了Java语言言中中的的一一些些低低级的的实用用工工具具,如如处理理时间的的Date类,处理理变长数数组的的Vector类,实现栈和和杂凑表的凑表的Stack类和和HashTable类等。等。v使使用用包包中中系系统类的的方方法法有有三三种种:一一种种是是继承承系系统类,在在用用户程程序序中中创建建系系统类的的子子类,例例如如Java Applet程程序序的的主主类作作为java.applet包包中中Applet类的的子子类;第第二二种种方方法法是是创建建系系统类的的对象象,例例如如创建建包包装装类的的对象象;最最后后一一种种方方法法是是直直接接使使用用系系统类,例例如如程程序序中中常常用用的的System.out.println()方方法,就是系法,就是系统类System的静的静态属性属性out的方法。的方法。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号