Java面向对象程序设计第8讲.ppt

上传人:牧羊曲112 文档编号:6510313 上传时间:2023-11-07 格式:PPT 页数:41 大小:338.99KB
返回 下载 相关 举报
Java面向对象程序设计第8讲.ppt_第1页
第1页 / 共41页
Java面向对象程序设计第8讲.ppt_第2页
第2页 / 共41页
Java面向对象程序设计第8讲.ppt_第3页
第3页 / 共41页
Java面向对象程序设计第8讲.ppt_第4页
第4页 / 共41页
Java面向对象程序设计第8讲.ppt_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《Java面向对象程序设计第8讲.ppt》由会员分享,可在线阅读,更多相关《Java面向对象程序设计第8讲.ppt(41页珍藏版)》请在三一办公上搜索。

1、第5章 面向对象程序设计,5.2 类的继承(inheritance),类继承也称类派生,是指一个类可以继承其他类的非私有成员,实现代码复用。被继承的类称为父类或超类,父类包括所有直接或间接被继承的类;继承父类或超类后产生的类称为派生类或子类。以Object类作为所有类的父类,所有的类都是直接或间接地继承Object类得到的。,在Java,只允许单继承。所谓单继承是指每个类只有一个父类,不允许有多个父类。一个类允许同时拥有多个子类,这时这个父类实际上是所有子类的公共成员变量和公共方法成员的集合,而每一个子类则是父类的特殊化,是对公共成员变量和方法成员的功能、内涵方面的扩展和延伸。Java的多继承

2、可通过接口来实现。类继承不改变成员的访问权限,父类中的成员为公有的或被保护的,则其子类的成员访问权限也继承为公有的或被保护的。,5.2.1 类继承的实现继承是通过extends关键字来实现的,在定义新类时使用extends关键字指明新类的父类,就在两个类之间建立了继承关系。1.定义子类前面其类头分别为:public class HelloApplet extends Applet.class MyException extends Exception.一般地,在类声明中,加入extends子句来创建一个类的子类。extends后即为父类名,若父类名又是某个类的子类,则定义的类也是该类的(间接)

3、子类。若无extends子句,则该类为的子类。,2.类继承的传递性类继承具有传递性,即子类继承父类的所有非私有成员,也继承父类的父类直至祖先所有的所有非私有成员。3.类的成员覆盖在类的继承中,若子类(派生类)新增的成员名称与父类(超类)成员相同,则称为成员覆盖(overriding)。在子类中定义与父类同名成员的目的是修改父类的属性和行为。,(1)成员变量的覆盖若子类声明了与父类同名的变量,则父类的变量被隐藏起来,直接使用的是子类的变量,但父类的变量仍占据空间,可通过super或父类名来访问。【例5.14】在子类中定义了与父类同名的变量,从而隐藏了父类成员变量,这种隐藏变量可加super前缀来

4、访问。class A int x=100;,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 args)(new B().print();程序运行结果如下:Subclass:200Superclass:100,(2)成员方法覆盖方法成员的覆盖与成员变量的隐藏的不同之处在于:子类隐藏父类的成员变量只是使得它不可见,父类的同名成员变量在子类对象中仍然占据自己的存储空

5、间;而子类成员方法对父类同名方法的覆盖将清除父类方法占用的内存空间,从而使得父类的方法在子类对象中不复存在。,方法的覆盖中需注意的是:子类在重新定义父类已有的方法时,应保持与父类完全相同的方法头声明,即应与父类有完全相同的方法名、返回值和参数列表。否则就不是方法的覆盖。而是在子类定义自己的与父类无关的成员方法,父类的方法未被覆盖,所以仍然存在。下述规则适用于覆盖方法:覆盖方法的返回类型必须与它所覆盖的方法相同。覆盖方法不能比它所覆盖的方法访问性差。覆盖方法不能比它所覆盖的方法抛出更多的异常。,4.派生类的初始化在创建派生类的对象时,使用派生类的构造方法对其初始化,不但要对自身的成员变量赋初值,

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

7、tor时对父类的成员变量赋初值。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);,public class CubeDemo public static void main(String args)Cube c=new Cube(7,6,5);c.vol();程序运行结果如下:长方体体积=210.0,5.2.2 抽象类和抽象方法abstrac

8、t修饰的抽象类需要子类继承,在派生类中实现抽象类中的抽象方法。抽象类被派生、抽象方法被子类实现后,才有实际意义。抽象方法是只有返回值类型、方法名、方法参数而不定义方法体的一种方法。抽象方法的方法体在子类中才编写实现。注意不能用abstract修饰构造方法、静态方法和私有(private)方法,也不能覆盖父类中的抽象方法。抽象方法必须定义在抽象类中。抽象类是一种未实现的类,抽象类不能用new实例化一个对象。【例5.16】计算底面半径为2高为3的圆柱体体积和长、宽、高分别为3、2、4的长方形体积。abstract class Shape/定义抽象类Shape double radius,lengt

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

10、xtends Shape Rectangle(double l,double w,double h)super(l,w,h);double vol()return(length*width*height);,class 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();程序的运行结果如下:

11、圆柱体体积=37.6992长方体体积=24.0,5.2.3 类对象之间的类型转换父类对象和子类对象的转换需要注意以下原则:(1)子类对象可以被视为是其父类的一个对象,反之则不可。(2)若一个方法的形式参数定义的是父类的对象,则调用该方法的实际参数可以使用子类对象。(3)若父类对象引用指向的实际是一个子类对象(在以前的某个时候根据(1)将子类对象的引用赋值给这个父类对象的引用),则这个父类对象的引用可以用强制类型转换转化成子类对象的引用。,5.3 接口(interface),接口是若干完成某一特定功能的没有方法体的方法(抽象方法)和常量的集合。接口仅提供了方法协议的封装。为了获取接口功能和真正实

12、现接口功能需要使用类来继承该接口。在继承接口的类中,通过定义接口中抽象方法的方法体(即抽象方法的覆盖)来实现接口功能。Java语言使用接口来实现类间多重继承的功能,从而弥补了Java语言只支持类间单重继承,描述复杂实际问题处理不方便的不足。,5.3.1 接口的定义和实现1.接口的定义在Java语言中,用关键字interface来定义接口。接口有类似类的结构,其定义格式如下:修饰符 interface 接口名 extends 父接口名表/接口体接口定义包括定义接口名和接口体。接口体为变量和抽象方法的集合,但没有构造方法和静态初始化代码。接口体中定义的变量均为终极(final)的、静态(stati

13、c)的和公共(public)的。接口体中定义的方法均为抽象的和公共的。由于接口所有成员均具有这些特性,相关的修饰符可以省略。,2.接口的实现在某个继承接口的派生类中为接口中的抽象方法书写语句并定义实在的方法体称为实现这个接口。派生类实现哪个或哪些接口用implements说明,不能用extends说明。派生类在实现接口时,还要注意:若实现接口的类不是抽象类,则在该类的定义部分必须实现指定接口的所有抽象方法。方法体可以由java语言书写,也可以由其他语言书写。因为是覆盖方式,所以方法头部分应该与接口中的定义完全一致,即有完全相同的参数表和返回值。,【例5.17】接口的实现。interface I

14、rect 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=new Crect();pute();,程序运行结果如下:边长分别为3和4的长方形面积为:12.05.3.2 接口的继承和组合接口也可以通过关键字extends继承其他接口。子接口将继承父接口中所有的常量和

15、抽象方法。此时,子接口的非抽象派生类不仅需实现子接口的抽象方法,而且需实现继承来的抽象方法。不允许存在未被实现的接口方法。【例5.18】接口的继承。interface A String a=在接口A中;void showA();,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

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

17、程序设计方法中多态特性的体现。【例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;,class Pro implements OneToN/继承接口 public int disp(int n)/实现接口中的disp方法 int m=1,i;for(i=1;i=n;i+)m*=i;return m;public class UseInterface pub

18、lic 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);,程序的运行结果如下:1至n的和=551至n的积=36288005.3.4 接口类型的使用接口可以作为一种引用类型来使用。任何实现接口的类的实例都可以存储在该接口类型的变量中。通过这些变量可以访问类所实现的接口中的方法。Java运行时系统动态地确定应该使用哪个类中的方法。,【例5.20】接口类型的使用(结果

19、同例5.12)。public class UseInterface1 public static void main(String args)int n=10;OneToN otn;Sum s=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);,5.4 包(package),一组相关的类和接口集合称为包。包体现了Java语言面向对象特性中的封装机制,包将java语言的类和接口有机地组织成层次结构,这个层次结构与具体的文

20、件系统的目录树结构层次一致。因此,Java包就是具有一定相关性在文件系统中可准确定位的Java文件的集合。,5.4.1 创建包包由包语句package创建,其语法格式如下:package 包名1.包名2.关键字package后是不同层次的包名,在包名1下允许有次一级的子包包名2,包名2下可以有更次一级的子包包名3等等。各级包名之间用“.”号分隔。通常情况下,包名称的元素被整个地小写。在Java程序中,package语句必须是程序的第一条非空格、非注释语句。通过package语句,可将Java程序分层次地存放在不同的目录下,目录名称与包的名称相同。【例5.21】在例5.1的类定义前加语句pack

21、age创建包(例5.1的程序代码保持不变)。package ch05;,编译程序完成生成Rect.class文件后,可将当前目录的Rect.class文件复制或移动到创建的ch05子目录中。若在编译上述程序时,带d编译参数来进行编译,即使用编译命令:javac-d 目录名 Rect.java来进行编译,java系统自动在命令行中d参数指定的目录(该目录已经存在)中创建ch05(与程序中的包名相同)子目录,然后自动将生成的类文件Rect.class存放其中。,5.4.2 使用包将类组织为包的目的是为了更好地利用包中的类。一般情况下,一个类只能引用与它在同一个包中的类。在Java程序中,若要用到某

22、些包中的类或接口,一种方法是在程序的开始部分写出相应的引入(import)语句,指出要引入哪些包的哪些类。另一种方法不用引入语句,直接在要引入的类和接口前给出其所在包名。无论采用哪种方法,使用系统类的前提是这个系统类应该是用户程序可见的类。,1.使用import语句import语句用于灵活地实现在编译单元中使用外部类和接口的引入机制,引入语句不必考虑类和接口的引入顺序和是否被多次引入。import语句的格式如下:import 包名;import 包名.标识符;import 包名.*;2.直接使用包这种方法一般用在程序中引用类和接口次数较少的时候,在要引入的类和接口前直接给出其所在包名。例如:j

23、ava.applet.Applet ap=new java.applet.Applet();,在一些Java程序中,还使用全局唯一包名(Globally Unique Package Name)的引用形式。全局是相对于Internet和Intranet而言的。全局唯一包名通常以一个Internet域名经过将域名前后颠倒的简单变换来命名。例如:com.sun.java.io.*;3.使用CLASSPATH环境变量CLASSPATH环境变量的作用与DOS的PATH和APPEND命令作用类似,当一个程序找不到它所需要的其他类的.class文件时,系统会自动到CLASSPATH环境变量所指明的路径中去

24、查找。通过SET命令设置CLASSPATH,可设置程序对类的搜索路径。若设置错误,Java程序将不能正常执行。下面是一个设置CLASSPATH的SET命令:SET CLASSPATH=.;c:jdk1.5lib;c:jdk1.5libclasses.zip,它将Java类搜索路径设置为当前目录、c:jdk1.5lib目录和c:jdk1.5libclasses.zip。对Java应用程序,还可以通过设置Java解释器开关参数来指定类文件的搜索路径。例如,对于Sun公司的Jave SDK解释器java.exe,有开关参数-classpath。例如,若需要解释执行的Hello.class文件不在当前

25、目录,而在D盘根目录下jfile目录中,则可以使用如下的命令行语句来执行SDK解释器:java Hello-classpath d:jfile【例5.22】对例5.3中类RectDemo引用例5.21中的ch05包中的类Rect的使用。可在例5.3的类定义前添加语句:,package ch05;import ch05.*;编译完成产生class文件后将其从当前目录复制或移动到ch05子目录下,可在当前目录下用如下的命令来执行:java ch05.RectDemo程序运行结果同例5.3一样。5.4.3 类及类成员的访问权限Java程序将数据和对数据的处理代码封装为类,并以类为程序的基本单位,但类

26、又被封装在包中。要访问类或封装在类中的数据和代码,必须清楚在什么情况下,它们是可访问的。,一个类总可以访问和调用自己的变量和方法,但这个类之外的程序其他部分是否能访问这些变量和方法,则由该变量和方法以及它们所属类的访问控制符决定。1.类成员的访问权限Java将类的成员可见性(可访问性)划分为五种情况,按照可见性的范围大小从小到大列出如下:(1)仅在本类内可见。(2)在本类及其子类可见。(3)在同一包内可见。(4)在同一包内及其子类(不同包)可见。(5)在所有包内可见。,类成员的可访问性与定义时所用的修饰符private(私有)、protected(保护)、private protected(私

27、有保护)和public(公共)有关。声明为private的类成员仅能在本类内被访问;声明为protected的类成员可以在本类、本包、本类的子类被访问;声明为private protected的类成员可以在本类、本类的子类被访问;声明为public的类成员可以在所有包内被访问;未用修饰符声明的类成员,则隐含为在本包内可被访问。2.类的访问权限类通常只用两种访问权限:缺省和public。类声明为public时,可以被任何包的代码访问;缺省时,可被本包的代码访问。因为类封装了类成员,因此,类成员的访问权限也与类的访问权限有关。,5.4.4 Java的应用程序接口(API)Java的应用程序接口AP

28、I是以包的形式提供的,每个包内包含大量相关的类、接口和异常。(1)java.langJava语言的核心包,有Java程序所需要的最基本的类和接口,包括Object类、基本数据类型包装类、数学类、异常处理类、线程类、字符串处理类、系统与运行类和类操作类等。这个包由编译器自动引入。(2)java.applet用来实现运行于Internet浏览器中的Java Applet的工具类库,它包含少量的几个接口和一个非常有用的类java.applet.Applet。,(3)java.awt是Java抽象窗口工具箱包,包含许多字体和颜色设置、几何绘图、图像显示、图形用户接口操作的类和接口。(4)java.io

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号