《第5章 面向对象程序设计.ppt》由会员分享,可在线阅读,更多相关《第5章 面向对象程序设计.ppt(71页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、AVCEIT第5章 面向对象程序设计 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望AVCEIT5.1 类(class)v类是是组成成Java程程序序的的基基本本元元素素,它它封封装装了了一一系系列列 的的 变 量量(即即 数数 据据 成成 员,也也 称称 为“域域(field)”)和和方方法法(即即成成员方方法法 method),是是一一类对象象的的原原型型。创建建一一个个新新的的类,就就是是创建建一一个个新新的的数数据据类型型。实例例化化一一个个类,就就得得到
2、到一一个个对象象。因因此此,对象象就就是是一一组变量量和和相相关关方方法法的的集集合合,其其中中变量量表表明明对象象的的状状态、属属性性,方方法法表表明明对象所具有的行象所具有的行为。AVCEITv5.1.1 类定定义v对一一个个用用户自自定定义的的类,要要为类取取一一个个名名字字,并并指指明明类中中包包含含哪哪些些变量量和和方方法法以以及及相相应的的类型型、实现等等,这称称为类的定的定义。类定定义语句的一般形式句的一般形式为:修饰符class 类名 extends 父类名 implements 接口名表 成员变量声明 /类体 方法成员声明 v其其中中class、extends和和implem
3、ents都都是是Java的的 关关 键 字字。修修 饰 符符、extends(表表 示示 继 承承)和和implements(表表示示接接口口)等等内内容容,以以后后逐逐渐介介绍。类定定义中中必必须要要写写的的内内容容是是类名名,应该使使用用Java语言合法的言合法的标识符来符来对自定自定义的的类命名。命名。AVCEITv在在大大括括号号中中定定义类体体,指指明明该类中中包包含含的的数数据据成成员和和成成员方方法。在法。在JavaJava语言中也允言中也允许定定义没有任何成没有任何成员的空的空类。v【例例5.15.1】定定义一一个个名名为RectRect表表示示长方方形形的的类,它它仅包包含含
4、doubledouble类型的型的长lengthlength和和宽widthwidth两个数据成两个数据成员。class Rect class Rect double length;double length;double width;double width;v在在类的定的定义中,可加入中,可加入对数据成数据成员进行操作的方法成行操作的方法成员。v【例例5.25.2】定定义一一个个名名为RectangleRectangle表表示示长方方形形的的类,它它包包含含doubledouble类型型的的长lengthlength和和宽widthwidth两两个个数数据据成成员和和设置置长方方形形长宽值
5、的方法的方法setDim()setDim()、计算算长方形面方形面积的方法的方法area()area()。AVCEIT class Rectangle class Rectangle double length;double length;double width;double width;double area()double area()return length*width;return length*width;void setDim(double w,double l)void setDim(double w,double l)width=w;width=w;length=l;len
6、gth=l;v在在一一个个程程序序中中,有有时需需要要定定义多多个个类。多多个个类的的定定义形形式式有有两种:并列和嵌套。两种:并列和嵌套。v常常见的的多多个个类定定义形形式式为并并列列定定义,即即一一个个类接接着着一一个个类进行定行定义,它,它们之之间是并列的关系。是并列的关系。AVCEITv另另一一种种形形式式为嵌嵌套套定定义,即即在在一一个个类中中定定义另另外外的的类,它它们之之间是是包包含含和和被被包包含含的的关关系系,可可分分别称称为包包含含类和和内内部部类(或或嵌嵌套套类)。采采用用何何种种形形式式定定义多多个个类,由,由类之之间的的访问关系确定。关系确定。v类定定义了了一一个个类
7、型型(type)。与与Java语言言提提供供的的几几种种基基本本类型型一一样,类型型用用来来声声明明、定定义该类型型的的变量。例如,下面的量。例如,下面的语句:句:Rect rect1;声明变量rect1的类型为类Rect。v类型型为类的的变量量与与基基本本类型型变量量有有所所不不同同,类是是一一种种引引用用(reference)类型型。实际上上,rect1是是一一个个对类型型为类Rect的的对象象的的引引用用,rect1不不是是对象象本本身身,可可 理理 解解 为 一一 个个 指指 针,上上 述述 声声 明明 仅 生生 成成 一一 个个 空空(null)引用。引用。AVCEITv5.1.2
8、类对象象v一一旦旦定定义了了所所需需的的类,就就可可以以创建建该类的的变量量,创建建类的的变量称量称为类的的实例化,例化,类的的变量也称量也称为类对象、象、类的的实例等。例等。v类的的对象象是是在在程程序序运运行行中中创建建生生成成的的,其其所所占占的的空空间在在程程序序运运行行中中动态分分配配。当当一一个个类的的对象象完完成成了了它它的的使使命命,为节省省资源源,Java的的垃垃圾圾收收集集程程序序就就会会自自动收收回回这个个对象象所所占占的的空空间。即。即类对象有自己的生命周期。象有自己的生命周期。v1.创建建对象象v创建建类的的对象需用象需用new运算符,一般形式运算符,一般形式为:对象
9、名=new 类名()AVCEITvnewnew运运算算符符用用指指定定的的类在在内内存存中中分分配配空空间,并并将将存存储空空间的的引引用存入用存入语句中的句中的对象象变量量。例如:例如:rect1=new Rect();rect1=new Rect();vnewnew运算符也可以与运算符也可以与类声明一起使用来声明一起使用来创建建类的的对象。象。例如:例如:Rect rect1=new Rect();Rect rect1=new Rect();v2.2.引用引用对象象v在在创建建了了类的的对象象后后,就就可可以以对对象象的的各各个个成成员进行行访问,进行各种行各种处理。理。访问对象成象成员的
10、一般形式的一般形式为:对象名象名.数据成数据成员名名 对象名象名.成成员方法名方法名()/()/方法名方法名带圆括号括号AVCEITv运运算算符符“.”“.”在在这里里称称为成成员运运算算符符,在在对象象名名和和成成员名名)之之间起起到到连接接的的作作用用,指指明明是是哪哪个个对象象的的哪哪个个成成员。v例例如如:设已已经定定义了了例例5.25.2中中的的RectangleRectangle类,可可以以用用如下的方法来引用如下的方法来引用对象的成象的成员:Rectangle r=new Rectangle();/定义类的对象 r.length,r.width /引用对象的数据成员 r.area
11、()/引用对象的成员方法v【例例5.35.3】利利用用例例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
12、);v本本程程序序由由两两个个类构构成成,设已已经编译类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;rec
13、t1.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 RectConstructor double length;doubl
15、e 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;ar=rect1.area();System.out.println(第一个长方形的面
16、积是:+ar);ar=rect2.area();System.out.println(第二个长方形的面积是:+ar);v程序运行程序运行结果如下:果如下:第一个长方形的面积是:200.0 第二个长方形的面积是:18.0 AVCEITv5.1.4 5.1.4 类和成和成员的修的修饰符符v在在类和和类的的成成员定定义时可可以以使使用用一一些些修修饰符符(modifiermodifier)来来对类和和成成员的的使使用用作作某某些些限限定定。一一般般将将修修饰符符分分为两两类:访问控控制制符符和和非非访问控控制制 符符。访 问 控控 制制 符符 有有 publicpublic、protectedpro
17、tected、privateprivate等等,它它们的的作作用用是是给予予对象象一一定定的的访问权限限,实现类和和类中中成成员的的信信息息隐藏藏。非非访问控控制制符符作作用用各各不不相相同同,有有staticstatic、finalfinal、nativenative、volatilevolatile、abstractabstract等等。某某些些修修饰符符只只能能应用用于于类的的成成员,某某些些修修饰符符既既可可应用用于于类也也可可应用用于于类的成的成员。AVCEITv1.1.staticstatic修修饰符符v使使用用staticstatic修修饰符符来来修修饰类的的成成员变量量和和方方
18、法法成成员,使使它它们成成为静静态成成员,也也称称为类成成员。静静态成成员存存储于于类的的存存储区区,属属于于整整个个类,而而不不属属于于一一个个具具体体的的类对象象。因因为静静态成成员属属于于整整个个类,所所以以它它被被所所有有该类对象象共共享享。在在不不同同的的类对象象中中访问静静态成成员,访问的是同一个。的是同一个。v对静静态成成员的使用要注意两点:的使用要注意两点:v(1)(1)静静态方方法法不不能能访问属属于于某某个个对象象的的成成员变量量,而而只只能能处理理属属于于整整个个类的的成成员变量量。即即静静态方方法法只只能能处理静理静态变量。量。v(2)(2)可以用两种方式可以用两种方式
19、调用静用静态成成员,它,它们的作用相同。的作用相同。变量:类名.变量、类对象.变量。方法:类名.方法名()、类对象.方法名()。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 void main(String args)StaticDemo.callme();System.out.println(b=+StaticDemo.b
20、);AVCEITv程序运行程序运行结果如下:果如下:a=42 b=99v2.final2.final修修饰符符vfinalfinal修修饰符符可可应用用于于类、方方法法和和变量量。finalfinal的的意意义为终极极或或最最终。finalfinal类不不能能被被继承承,即即finalfinal类无无子子类。finalfinal方方法法不不能能被被覆覆盖盖,即即子子类的的方方法法名名不不能能与与父父类的的finalfinal方方法法名名相相同同。finalfinal变量量实际上上是是JavaJava语言言的的符符号号常常量量,可可在在定定义时赋初初值或或在在定定义后后的的其其他他地地方方赋初初
21、值,但但不不能能再再次次赋值,习惯上上使使用大写的用大写的标识符表示符表示finalfinal变量。例如:量。例如:final double PI=3.1416;final double G=9.18;v因因为finalfinal变量量不不能能改改变,没没有有必必要要在在每每个个对象象中中进行行存存储,可以将可以将finalfinal变量声明量声明为静静态的,以的,以节省存省存储空空间。AVCEIT例如:static final double PI=3.1416;v3.abstract修修饰符符vabstract修修饰符符可可应用用于于类和和方方法法,称称为抽抽象象类和和抽抽象象方方法法。抽抽
22、象象类需需要要继承承、抽抽象象方方法法需需要要在在子子类中中实现才才有有意意义。进一步的一步的讨论见5.2.2抽象抽象类和抽象方法。和抽象方法。v4.native修修饰符符vnative修修饰符符一一般般用用来来声声明明用用其其他他语言言如如C、C+、FORTRAN、汇编等等书写写方方法法体体并并具具体体实现方方法法功功能能的的特特殊殊方方法法。由由于于native方方法法的的方方法法体体使使用用其其他他语言言编写写。所所以以所所有有的的native方方法法都都没没有有方方法法体体。native方方法法可可应用用于于实时性性强、执行效率高,运行速度要求行效率高,运行速度要求较高的高的场合。合。
23、v5.synchronized修修饰符符vsynchronized修修饰符可符可应用于方法或用于方法或块,在多,在多线程程AVCEITv程程序序中中,对用用于于共共享享的的方方法法和和块加加互互斥斥锁,使使得得任任一一时刻刻,synchronized方方法法或或块只只能能由由一一个个线程程执行或操作。行或操作。v5.1.5 类的使用的使用v1.私有成私有成员的的访问v为 了了 降降 低低 类 间 的的 耦耦 合合 性性,可可 以以 为 类 成成 员 指指 定定private修修饰符符,表表示示该成成员只只能能在在该类内内部部访问。若若需需要要在在其其他他类中中访问私私有有成成员,只只能能通通过
24、取取数数和和送送数数的的方方法法来来访问。这样的的方方法法常常命命名名为getXxx()和和setXxx()等。等。v【例【例5.9】私有成】私有成员的的访问。class RectangleRC private double length;private double width;AVCEIT double getLength()/定义取长方形边长的方法 return length;double getWidth()return width;RectangleRC(double l,double w)length=l;width=w;class RectDemo5 public static
25、void main(String args)RectangleRC rect1=new RectangleRC(8,7);double ar=rect1.getLength()*rect1.getWidth();System.out.println(长方形的面积是:+ar);AVCEITv程序运行程序运行结果如下:果如下:长方形的面积是:56.0v2.方法参数是方法参数是类的的对象象v在在Java语言言中中,方方法法的的参参数数类型型除除了了可可以以是是基基本本类型型外外,还可可以以是是引引用用类型型类。因因为在在类的的对象象中中实际存存储为对象象的的引引用用,因因此此在在调用用类参参数数时方
26、方法法间传送送的的是是引引用用。尽尽管管Java采采用用值传送送,引引用用从从调用用方方法法单向向传送送到到被被调方方法法,但但由由于于调用用方方法法与与被被调方方法法对应类参参数数的的引引用用相相同同,它它们引引用用同同一一对象象,所所以以,若若在在被被调方方法法中中修修改改了了引引用用类型型形形式式参参数数的的取取值,则调用用方方法法对应的的实际参参数数也也将将发生生相相应的的变化化。即即调用用方方法法与与被被调方方法法之之间是是“引引用用单向向传送送,数据双向数据双向传送送”。v应用引用用引用类型的方法参数,可在方法型的方法参数,可在方法间传送数据。送数据。AVCEITv【例【例5.10
27、】引用】引用类型的方法参数是方法型的方法参数是方法间传送数据的送数据的桥梁。梁。class RefParameter double width,length,area;RefParameter(double w,double l)width=w;length=l;void calArea(RefParameter r)r.area=r.width*r.length;class PassObject public static void main(String args)RefParameter rr=new RefParameter(10,20);rr.calArea(rr);System.o
28、ut.println(长方形面积为:+rr.area);AVCEITv程序运行程序运行结果如下:果如下:长方形面积为:200.0v3.方法返回方法返回值为类的的对象象v在在Java语言言中中,方方法法的的返返回回值类型型也也可可以以为引用引用类型,例如:型,例如:类。v【例【例5.11】方法的返回】方法的返回值类型型为引用引用类型。型。class RetClass double width,length,area;RetClass(double w,double l)width=w;length=l;RetClass calArea(RetClass r)r.area=r.width*r.le
29、ngth;AVCEIT return r;class ReturnObject public static void main(String args)RetClass rr=new RetClass(10,20);rr=rr.calArea(rr);System.out.println(长方形面积为:+rr.area);v程序运行程序运行结果如下:果如下:长方形面积为:200.0AVCEITv4.类对象作象作为类的成的成员v类的的数数据据成成员也也可可以以是是引引用用类型型的的数数据据,如如数数组、字字符符串串和和类等等。若若一一个个类的的对象象是是一一个个类的的成成员时,要要用用new运运
30、算算符符为这个个对象象分分配配存存储空空间。在在包包含含类数数据据成成员的的类及及类的的实例例中可以中可以访问类数据成数据成员的成的成员。v【例【例5.12】类对象作象作为类的成的成员。class RectC double width,length;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(Str
31、ing args)RectangleC rr=new RectangleC();rr.area=rr.r.width*rr.r.length;System.out.println(长方形面积为:+rr.area);v程序运行程序运行结果如下:果如下:长方形面积为:200.0AVCEITv5.内部内部类(Inner class)v内内部部类,也也称称为嵌嵌套套类,被被附附加加到到JDK1.1及及更更高高版版本本中中。内内部部类允允许一一个个类定定义被被放放到到另另一一个个类定定义里里、一一个个语句句块里里或或一一个个表表达达式式内内部部。内内部部类是是一一个个有有用用的的特特征征,因因为它它们允
32、允许将将逻辑上上同同属属性性的的类组合合到到一一起起,并并在在另另一一个个类中中控控制制一个一个类的可的可视性。性。v【例【例5.13】在一个】在一个类中定中定义类(内部(内部类)。)。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;Rectangl
33、eR rect1=new RectangleR();RectangleR rect2=new RectangleR();rect1.setDim(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因因为内内部部类定定义在在一一个个类中中,因因此此内内部部类的的名名称称不不
34、能能与与所所嵌嵌套套的的类相相同同,而而且且只只能能在在定定义的的范范围中中使使用用。内内部部类具具有有下下面一些特性:面一些特性:(1)内部类可以被定义在方法中。它可以访问嵌套类的方法的final变量。(2)内部类可以使用所嵌套类的类变量和实例变量以及所嵌套的块中的本地变量。(3)内部类可以被定义为abstract抽象类。AVCEIT(4)内部类可以被声明为private或protected,以便防护它们不受来自外部类的访问。访问保护不阻止内部类使用其他类的任何成员。(5)一个内部类可以作为一个接口,由另一个内部类实现。(6)声明为static的内部类成为顶层类。这些内部类失去了在本地范围和
35、其他内部类中使用数据或变量的能力。(7)内部类不能声明任何static成员,只有顶层类可以声明static成员。因此,一个需求static成员的内部类必须使用来自顶层类的成员。AVCEIT5.2 类的的继承承(inheritance)v继承承是是面面向向对象象程程序序设计的的另另一一个个重重要要特特色色,类继承承也也称称为类派派生生,是是指指一一个个类可可以以继承承其其他他类的的非非私私有有成成员,实现代代码复复用用。被被继承承的的类称称为父父类或或超超类,父父类包包括括所所有有直直接接或或间接接被被继承承的的类;继承承父父类或或超超类后后产生的生的类称称为派生派生类或子或子类。vJava语言
36、言以以Object类作作为所所有有类的的父父类,所所有有的的类都都是是直直接接或或间接接地地继承承Object类得得到到的的。Java还提提供供不不同同层次次的的标准准类,使使用用户可可根根据据需需要要派派生生自自己己的的类。AVCEITv在在Java语言言中中,只只允允许单继承承。所所谓单继承承是是指指每每个个类只只有有一一个个父父类,不不允允许有有多多个个父父类。但但一一个个类允允许同同时拥有有多多个个子子类,这时这个个父父类实际上上是是所所有有子子类的的公公共共成成员变量量和和公公共共方方法法成成员的的集集合合,而而每每一一个个子子类则是是父父类的的特特殊殊化化,是是对公公共共成成员变量
37、量和和方方法法成成员的的功功能能、内内涵涵方方面面的的扩展展和和延延伸伸。Java语言的多言的多继承可通承可通过接口来接口来实现。v类继承承不不改改变成成员的的访问权限限,父父类中中的的成成员为公公有有的的或或被被保保护的的,则其其子子类的的成成员访问权限限也也继承承为公有的或被保公有的或被保护的。的。AVCEITv5.2.1 类继承的承的实现vJava中中的的继承承是是通通过extends关关键字字来来实现的的,在在定定义新新类时使使用用extends关关键字字指指明明新新类的的父父类,就就在在两两个个类之之间建立了建立了继承关系。承关系。v1.定定义子子类v通通过继承承系系统类定定义子子类
38、的的例例子子已已经见过的的有有例例1.2的的小小程程序序和例和例3.32的自定的自定义异常异常处理程序,其理程序,其类头分分别为:public class HelloApplet extends Applet.class MyException extends Exception.v一一般般地地,在在类声声明明中中,加加入入extends子子句句来来创建建一一个个类的的子子类。extends后后即即为父父类名名,若若父父类名名又又是是某某个个类的的子子类,则定定义的的类也也是是该类的的(间接接)子子类。若若无无extends子子句句,则该类为java.lang.Object的子的子类。AVCE
39、ITv2.类继承的承的传递性性v类继承承具具有有传递性性,即即子子类继承承父父类的的所所有有非非私私有有成成员,也也继承父承父类的父的父类直至祖先所有的所有非私有成直至祖先所有的所有非私有成员。v3.类的成的成员覆盖覆盖v在在类的的继承承中中,若若子子类(派派生生类)新新增增的的成成员名名称称与与父父类(超(超类)成)成员相同,相同,则称称为成成员覆盖(覆盖(overriding)。)。v在在子子类中中定定义与与父父类同同名名成成员的的目目的的是是修修改改父父类的的属属性性和和行行为。AVCEITv(1)成成员变量的覆盖量的覆盖v若若子子类声声明明了了与与父父类同同名名的的变量量,则父父类的的
40、变量量被被隐藏藏起起来来,直直接接使使用用的的是是子子类的的变量量,但但父父类的的变量量仍仍占占据据空空间,可可通通过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);publi
41、c static void main(String args)(new B().print();v程序运行程序运行结果如下:果如下:Subclass:200Superclass:100AVCEITv(2)成成员方法覆盖方法覆盖v与与子子类可可以以定定义与与父父类同同名名的的成成员变量量,实现对父父类成成员变量量的的隐藏藏的的情情况况一一样,子子类也也可可以以定定义与与父父类同同名名的的方方法法,实现对父父类方方法法的的覆覆盖盖。方方法法成成员的的覆覆盖盖与与成成员变量量的的隐藏藏的的不不同同之之处在在于于:子子类隐藏藏父父类的的成成员变量量只只是是使使得得它它不不可可见,父父类的的同同名名成成
42、员变量量在在子子类对象象中中仍仍然然占占据据自自己己的的存存储空空间;v而而子子类成成员方方法法对父父类同同名名方方法法的的覆覆盖盖将将清清除除父父类方方法法占占用用的内存空的内存空间,从而使得父,从而使得父类的方法在子的方法在子类对象中不复存在。象中不复存在。AVCEITv方方法法的的覆覆盖盖中中需需注注意意的的是是:子子类在在重重新新定定义父父类已已有有的的方方法法时,应保保持持与与父父类完完全全相相同同的的方方法法头声声明明,即即应与与父父类有有完完全全相相同同的的方方法法名名、返返回回值和和参参数数列列表表。否否则就就不不是是方方法法的的覆覆盖盖。而而是是在在子子类定定义自自己己的的与
43、与父父类无无关关的的成成员方方法法,父父类的的方法未被覆盖,所以仍然存在。方法未被覆盖,所以仍然存在。v下述下述规则适用于覆盖方法:适用于覆盖方法:覆盖方法的返回类型必须与它所覆盖的方法相同。覆盖方法不能比它所覆盖的方法访问性差。覆盖方法不能比它所覆盖的方法抛出更多的异常。AVCEITv4.派生派生类的初始化的初始化v在在创建建派派生生类的的对象象时,使使用用派派生生类的的构构造造方方法法对其其初初始始化化,不不但但要要对自自身身的的成成员变量量赋初初值,还要要对父父类的的的的成成员变量量赋初初值。因因为成成员变量量赋初初值通通常常在在构构造造方方法法中中完完成成,因因此此在在Java语言言中
44、中,允允许派派生生类继承承父父类的的构构造造方方法法。构构造造方方法法的的继承承遵遵循循如如下的原下的原则:(1)若父类是无参数的构造方法,则子类无条件的继承该构造方法。(2)若子类无自己的构造方法,则它将继承父类的无参构造方法作为自己的构造方法;若子类有自己的构造方法,则在创建子类对象时,它将先执行继承自父类的无参构造方法,然后再执行自己的构造方法。AVCEIT(3)若父类是有参数的构造方法,子类可以通过在自己的构造方法中使用super关键字来调用它,但这个调用语句必须是子类构造方法的第一个可执行语句。v【例例5.15】继承承例例5.6中中的的类RectConstructor时对父父类的成的
45、成员变量量赋初初值。class Cube 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
46、抽象抽象类和抽象方法和抽象方法vabstract修修饰的的抽抽象象类需需要要子子类继承承,在在派派生生类中中实现抽抽象象类中中的的抽抽象象方方法法。抽抽象象类被被派派生生、抽抽象象方方法法被被子子类实现后后,才才有有实际意意义。抽抽象象方方法法是是只只有有返返回回值类型型、方方法法名名、方方法法参参数数而而不不定定义方方法法体体的的一一种种方方法法。抽抽象象方方法法的的方方法法体体在在子子类中中才才编写写实现。注注意意不不能能用用abstract修修饰构构造造方方法法、静静态方方法和私有法和私有(private)方法,也不能覆盖父方法,也不能覆盖父类中的抽象方法。中的抽象方法。v抽抽象象方方法
47、法必必须定定义在在抽抽象象类中中。抽抽象象类是是一一种种未未实现的的类,抽象抽象类不能用不能用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(double l,dou
48、ble 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()return(length*width*height);AVCEI
49、Tclass 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.3 类对象之象之间的的类型型转换v与与基基本本数数据据类型型之之间的的强制制类型型转换类似似,在在Java语言言中中,
50、有有继承承关关系系的的父父类对象象和和子子类对象象之之间也也可可以以在在一一定定条条件件下下相相互互转换。父父类对象象和和子子类对象象的的转换需要注意以下原需要注意以下原则:v(1)子子类对象象可可以以被被视为是是其其父父类的的一一个个对象象,反反之之则不可。不可。v(2)若若一一个个方方法法的的形形式式参参数数定定义的的是是父父类的的对象象,则调用用该方法的方法的实际参数可以使用子参数可以使用子类对象。象。v(3)若若父父类对象象引引用用指指向向的的实际是是一一个个子子类对象象(在在以以前前的的某某个个时候候根根据据(1)将将子子类对象象的的引引用用赋值给这个个父父类对象象的的引引用用),则