第15次 第4章 抽象类、接口、包+第5章 异常处理_第1页
第15次 第4章 抽象类、接口、包+第5章 异常处理_第2页
第15次 第4章 抽象类、接口、包+第5章 异常处理_第3页
第15次 第4章 抽象类、接口、包+第5章 异常处理_第4页
第15次 第4章 抽象类、接口、包+第5章 异常处理_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

接口是特殊的抽象类,它侧重于描述概念的所具备的功能和具体属性(成员变量为常量),但不实现。接口的使用分为3个步骤:定义接口实现接口使用接口14.6接口定义接口的基本格式为:[public]interface

interfacename{

常量声明;

抽象方法声明;}接口的访问属性或者为”public”或者”缺省”;定义接口的关键字是interface而不是class;常量必须为publicstaticfinal,在接口中可以省略;成员方法必须是抽象方法,在接口中也可以省略publicabstract。接口具有继承性,可通过extends关键字声明父接口,但不能被实例化。24.6接口的定义3接口举例2:

Comparable接口publicinterfaceComparable

{//比较两个对象大小

intcompareTo(ObjectotherObject); }compareTo的含义:将调用这个方法的对象与参数带入的对象otherObject进行比较,如果前者小,返回-1;如果相等返回0;否则,返回1。4实现接口是指,构造一个类,并在该类中覆盖接口中的所有方法,。4.6.2接口的实现Comparable接口的实现5以职工类(Employee)实现Comparable接口为例EmployeeprivateStringname;privatedoublesalary;privateStringdepartment;//成员变量的更改器//成员变量的获取器publicStringtoString()publicintcompareTo(ObjectotherObject)Employee实现Comparable接口publicclassEmployeeimplements

Comparable{ privateStringname; //姓名

privatedoublesalary; //工资

privateStringdepartment; //部门

……

//构造方法

…… //其他成员方法

publicintcompareTo(ObjectotherObject)

{……}}6compareTo方法的实现publicintcompareTo(ObjectotherObject)

{ //定义3个可能的返回值的所满足的条件

Employeeother=(Employee)otherObject;if(salary<other.salary)return-1;//比较工资多少

if(salary==other.salary)return0;elsereturn1;}}78Comparable接口的使用Employeee1=newEmployee("Wang",4000.0,"Software");Employeee2=newEmployee("Sun",3000.0,"Math");switch(pareTo(e2)){case-1:System.out.println("<");break;case0:System.out.println("==");break;case1:System.out.println(">");break;}运行的结果是?练习下面的程序输出的结果是()interfaceB{intk=10;}publicclassAimplementsB{

publicstaticvoidmain(Stringargs[]){

inti;

Ac1=newA();

i=c1.k;

System.out.println("i="+i);}}A)i=0

B)i=10C)程序有编译错误D)i=true补充:

接口的继承关系

1.接口的单继承2.接口的多重继承1.接口的单继承。interfaceA{voidF1();}interfaceBextendsA{voidF2();}说明:接口B将继承接口A中的所有变量和方法,这种接口之间的继承称为单继承。接口之间的继承与类的继承一样使用关键字extends。2.接口的多重继承在Java语言中,不支持类的多重继承。但是支持接口的多重继承,其语法格式如下:

interface接口名extends接口名1,接口名2,…抽象类与接口的比较13抽象类接口共同点二者都可具有抽象方法,都不能实例化,但都可以有自己的声明,并能引用子类或实现类对象。不同点属性变量可以有变量不能有,只能是静态常量。成员方法可以有具体方法(而且具体方法可以调用抽象方法)。如果有方法,则全部是抽象方法。实现策略必须有子类继承必须有实现类实现扩展性弱强课堂练习1.关于接口的声明和实现,以下描述正确的是

。A.接口声明的方法只有声明没有实现

B.接口声明中的变量都必须写明final和staticC.如果一个接口由多个类来实现,则这些类在实现该接口中的方法时采用统一的代码D.如果一个类实现接口,则必须实现该接口中的所有方法,但方法未必申明为public14课堂练习2.下列有关抽象类与接口的叙述中正确的是哪一个

。A.抽象类中不可以有非抽象方法,接口中也必须有抽象方法B.抽象类中可以有非抽象方法,接口中也可以有非抽象方法C.接口中的方法必须是抽象方法D.抽象类中的变量定义时必须初始化,而接口中不是15课堂练习3.下面程序运行的结果是

。interfaceInterfaceA{ Strings="good"; voidf(); }classClassAimplementsInterfaceA{ publicvoidf(){ System.out.print(s); }}

classClassB{ voidg(InterfaceAa){ a.f(); } }publicclassE{ publicstaticvoidmain(String[]args){ ClassBb=newClassB(); b.g(newClassA()); }}A.good B.编译正确,但无运行结果C.编译错误:b.g(newClassA()) D.以上都不对1617接口是一种特殊形式的抽象类,它主要用来组织公用的常量,并统一操作行为的格式,通常它被应用在三个主要方面:用接口包装常量。可以将各式各样的常量放在接口中,让每个使用这些常量的类对象实现这个接口,从而达到享有这些常量的目的为操作同类事物提供统一接口。接口是为了解决Java语言中不支持类的多重继承的问题。接口的主要应用184.7包包是类和接口的集合。从资源管理的角度,可以将“包”理解为文件夹(目录)。将所有的类和接口按功能分别放置在不同的包中主要有两点好处:一是便于将若干个已存在的类或接口整体地添加到程序代码中;二是避免出现类名冲突的现象。19创建一个包就是用包的名称在文件系统下创建一个目录。在创建的目录下,既可以存放类文件或接口文件,也可以包含子目录,这些子目录是该包中的子包。创建一个包且将类文件放入其中的语法格式为:

packagepackageName;//

packageName是包名在NetBeans中,如果将类文件放入默认包,则没有包语句;如果将类文件放入指定的包中,类文件中会自动生成包语句。4.7.1创建包20对于在包中具有public访问属性的类或接口,可以通过导入语句(import)将其添加到程序代码中。导入语句的基本格式为import后跟包名序列及类名。

importuserPackage.*;userPackage是包名,.*代表将包中的所有类和接口都加载进来。

importuserPackage1.userPackage2.userPackage3.*;这条语句表示将userPackage1包中的子包userPackage2的子包userPackage3中的所有类和接口加载进来。4.7.2加载包引用不同包中的类21课堂测试编写一个学生类,其中包含:姓名、年龄和学位,构造方法及其输出学生信息抽象的方法;编写一个本科生类,在学生类的基础上增加“专业”,另编写构造方法、输出本科生信息的方法;编写一个研究生类,在学生类的基础上增加“研究方向”,另编写构造方法、输出研究生信息的方法。编写测试类,分别创建一个本科生和研究生对象,然后调用相关方法输出所有信息。224.8应用举例设计二人游戏二人游戏:由两名选手参与的游戏。比如:象棋、跳棋和五子棋等分析:两人游戏中有哪些共同的数据和操作。数据:应包含标识两名选手的常量;记录下一步应该是哪位选手操作的成员变量。23游戏中的操作1.指定从哪位选手开始2.返回当前操作的选手3.改变当前操作的选手4.返回游戏规则;5.判断游戏是否结束;6.返回获胜选手;7.返回游戏的提示信息8.返回游戏当前状态;9.游戏操作;10.接受用户输入;11.报告游戏当前状态;12.游戏信息提示;24TwoPlayerGame(抽象类)25publicstaticfinalintPLAYER_ONE=1;publicstaticfinalintPLAYER_TWO=2;protectedbooleanonePlaysNext=true;publicvoidsetPlayer(intstarter)//指定从哪位选手开始publicintgetPlayer()//返回当前操作的选手publicvoidchangePlayer()//改变当前操作的选手publicabstractStringgetRules();//返回游戏规则publicabstractbooleangameOver();//返回游戏是否结束publicabstractStringgetWinner();

//返回获胜者

TwoPlayerGamesetPlayerpublicvoidsetPlayer(intstarter)//指定从哪位选手开始

{if(starter==PLAYER_TWO){onePlaysNext=false;}else{onePlaysNext=true;}}26getPlayerpublicintgetPlayer()//返回当前操作的选手

{if(onePlaysNext==true){returnPLAYER_ONE;}else{returnPLAYER_TWO;}}27changePlayer()publicvoidchangePlayer()//改变当前操作的选手

{onePlaysNext=!onePlaysNext;}28Game接口publicinterfaceGame{publicStringgetGamePrompt(); //返回游戏提示

publicStringreportGameState(); //返回游戏当前状态}29UIPlay接口publicinterfaceUIPlayextendsGame{voidplay(UserInterfaceui);

//控制游戏循环过程}30UserInterface接口publicinterfaceUserInterface{StringgetUserInput(); //接收用户输入

voidreport(Strings);//报告游戏当前状态

voidprompt(Strings); //游戏信息提示}31为什么要设置接口?Game接口返回游戏提示返回游戏当前状态UIPlay接口控制游戏循环过程UserInterface接口接收用户输入报告游戏当前状态游戏信息提示32接口中的抽象方法的实现都与用户界面相关(用户的不同输入将导致不同的操作结果)为了将核心操作与用户界面的实现分开,设置这些接口。一个具体的二人游戏:拿小棍游戏规则:游戏中有MAX_STICKS根小棍排成一排。游戏中的两名选手轮流拿棍,每人一次最多拿MAX_PICKUP根。拿走最后一根者为输。33OneRowNim类publicclassOneRowNimextendsTwoPlayerGameimplementsUIPlay{publicstaticfinalintMAX_PICKUP=3;//最多拿小棍的根数

publicstaticfinalintMAX_STICKS=21;//小棍数

privateintnSticks=MAX_STICKS;//当前剩余的棍数

……34ConsoleInterface类publicclassConsoleInterfaceimplementsUserInterface{publicStringgetUserInput(){…….}publicvoidreport(Strings){……}publicvoidprompt(Strings){……}publicstaticvoidmain(String[]args){ConsoleInterfaceUser=newConsoleInterface();OneRowNimgame=newOneRowNim(21);game.play(User);}}35类、接口之间的关系36TwoPlayerGame<Interface>Game<Interface>UIPlayOneRowNim<Interface>UserInterfaceConsoleInterface37第5章异常处理38异常:程序运行中出现的不正常的现象,使得程序无法继续执行,如果不加以处理可能会造成不必要的损失。影响程序正常运行的主要原因来自三个方面:(1)用户输入错误。例如:输入数据类型错误。(2)运行程序的系统出现了异常。例如,发出打印命令,但打印机处于关闭状态;磁盘已满等;(3)程序本身存在的问题。例如,整数被0整除;数组下标越界等。5.1.1异常的概念5.2异常处理机制Java语言将处理异常的代码从程序中抽取出来,封装成类,完成以下任务:保存当前已完成的结果。允许用户安全地退出应用程序。通知用户异常出现的原因,指出发生哪类异常。追踪异常出现的位置。3940在Java语言中,对各种可能出现的异常进行了标准化,将它们封装成了类,我们将统称为异常类。一旦在程序运行过程中发生异常,Java虚拟机就会自动地创建一个相应的异常类对象,并将该对象作为参数抛给处理异常的方法。在这些异常类中,主要包含了有关异常的属性信息,跟踪信息等。5.1.2Java语言中的异常类41Java异常类结构Throwable类是所有异常类的父类。Error类用来描述Java运行系统的内部错误和资源耗尽等致命性错误。程序代码错误导致的异常。有关输入输出的异常。42java.lang的RuntimeException类的异常子类(P159)类名描述ArithmeticExecption如果进行非法的算术运算就会产生这类异常。IndexutOfBoundsException在访问String或Vector对象的内容时,如果出现了下标越界将会产生这类异常。NegativeArraySizeException如果在创建数组时,将数组的维数指定为负值就会产生这类异常。NullPointerException试图访问null对象或成员方法时将产生这类异常。ArrayStroeException如果试图在数组中存入一个数组元素类型不允许的对象就会产生这类异常。435.2异常处理机制Java程序中,处理异常要经历三个主要阶段:抛出异常;捕获异常;处理异常。44所谓抛出异常是指在程序的运行过程中,一旦发生了异常,就立即创建一个与该异常相对应的异常类对象,将其作为参数抛给处理该异常的代码块。抛出异常分为两种:隐式声明抛出(异常)显式声明抛出(异常)5.2.1抛出异常参考:袁绍欣等编著的《Java面向对象程序设计(第2版)》隐式声明抛出异常没有进行任何声明和处理,而直接交给Java虚拟机去处理的异常。45显式声明抛出异常举例46显式声明抛出异常说明throw关键字用来告知编译器此处要发生一个异常(抛出一个异常对象)。格式:thrownewExceptionClassName(parameterList)

thrownewException("第"+i+"个元素不存在");throws关键字用来声明一个方法中可能抛出的异常,但不处理。格式:throwsExceptionClassName在成员方法参数后。

voidf(inti)throwsException说明:1.throws可以抛出多个异常,两个间用逗号隔开;2.throws所声明的异常类型应与成员方法中抛出的类型一致。47Throws练习4849在Java程序中,捕获异常用try-catch-finally语句实现,该语句可以被用来捕获一个或多个异常,基本语法格式为:try{Javastatements}catch

(ExceptionType1ExceptionObject){

handlerforthisexceptiontype}catch(ExceptionType2ExceptionObject){

handlerforthisexceptiontype}.......5.2.2捕获并处理异常try-catch-finally语句说明try{}中Javastatements是可能产生异常的程序代码(被监视的代码段)。catch()中ExceptionObject是可能抛出的异常对象,而后面{}中是对异常进行的处理代码。50try{}中被监视的代码的操作,在花括号以外无法检测。捕获并处理异常练习publicclassTestTryCatch{//测试异常捕获类publicstaticvoidmain(String[]args){inti=1;intj=0;

try

{//捕获异常语句System.out.println("Tryblockentered"+"i="+i+"j="+j);System.out.println(i/j);//产生ArithmeticException异常

System.out.println("Endingtryblock");}catch(ArithmeticExceptione){System.out.println("Arithmeticexceptioncaught");}System.out.println("Aftertryblock");}}51

try{Javastatements}catch(ExceptionType1ExceptionObject){handlerforthisexceptiontype}catch(ExceptionType2ExceptionObject){handlerforthisexceptiontype}.......finally{handlerforfinally}52为了更好地控制程序的执行过程,使程序能够在任何情况下都具有统一的结束方式,可以在try语句块的最后一个catch子句之后增加一个finally子句。5.2.2捕获异常53try{System.out.println("\nFirsttryblockindivide()entered"); array[index+2]=array[index]/array[index+1]; System.out.println("Codeatendoffirsttryblockindivide()");}catch(ArithmeticExceptione){ System.out.println("Arithmeticexceptioncaughtindivide()");}catch(ArrayIndexOutOfBoundsExceptione){ System.out.println("Index-out-of-boundsexceptioncaught“}finally{ System.out.println("finallyblockindivide()");}如果在一个try语句块中有可能发生多种不同类型的异常,就需要在try之后放置多个catch子句。54在Java语言中,处理异常主要有两种方式:在产生异常的方法中处理异常

try-catch-finally语句将异常抛给调用该方法的代码段,

Throws语句但如果由程序处理,最终都是由try-catch-finally语句实现,否则交由系统处理5.2.3处理异常处理异常练习publicclassThrowsException{

publicstaticvoidmain(String[]args){try{Method(0);Method(1); }catch(NumberFormatExceptione){System.out.println("\t捕获异常:"+e);}catch(ArrayIndexOutOfBoundsExceptione){System.out.println("\t捕获异常:"+e);}

finally{System.out.println(“在任何状态下,finally语句块都将被执行。”);}}5556staticvoidMethod(inti)

throwsArithmeticException,NumberFormatException{ System.out.println("调用方法Method("+i+")"); if(i==0){ thrownewArithmeticException("i=0");}elseif(i==1){thrownewNumberFormatException("i=1");}}57为了更加方便应用程序捕获和处理异常,Java语言将很多异常进行了标准化,并组成了类层次结构。不仅如此,它还为用户提供了自定义异常类的能力,使得用户可以根据自己的需求,定义符合自己需求的异常类。5.2.4用户自定义异常类58Java语言要求,任何异常类都必须是Throwable类的子类,Throwable是所有异常类的公共父类。Throwable类中主要包含了由构造方法初始化的异常描述性信息和创建异常对象时堆栈的记录情况,它记载了调用每个成员方法的全部过程。如果希望访问这些内容,可以通过Throwable类中的public成员方法实现。Throwable类59Throwable类的public成员方法成员方法描述getMessage()返回当前异常的描述性信息,其中主要包括异常类的名称及有关异常的简短描述。printStackTrace()将堆栈的跟踪信息输出到标准的输出流中。在控制台方式下,标准输出流指屏幕。printStackTrack(PrintStreams)将堆栈的跟踪信息通过参数s返回。fillInstackTrack()填写跟踪信息。60除了异常类必须是Throwable类的子类之外,建议最好将定义的异常类作为Exception的子类,这样Java编译器才能跟踪程序中抛出的异常位置。定义异常类的基本格式:classTestExceptionextendsException{TestException(){super();}TestException(Strings){super

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论