Java面向对象程序设计第06章_内部类与异常类

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

信息工程学院本科课程第6章内部类与异常类主讲:赵建邦办公室:信息学院202E-mail:zhaojianbang@nwsuaf.edu.cn信息工程学院本科课程2本章主要内容6.1非静态内部类6.2静态内部类6.3异常类6.4断言6.5class类难点:异常类信息工程学院本科课程6.1内部类(InnerClass)内部类分为三种:普通内部类匿名内部类静态内部类3信息工程学院本科课程6.1内部类(InnerClass)内部类:在一个类的成员声明部分或者类的某个方法内定义的类内部类允许将一些逻辑相关的类组织在一起,并控制内部类的可见性包含内部类的类称为外部类(OuterClass)外部类的修饰符:publicabstractfinal内部类的修饰符:publicprotectedprivateabstractfinalstatic除了静态内部类,其他内部类的类体内不可以出现static成员4信息工程学院本科课程6.1.1普通内部类普通内部类可以上转型为基类或接口每个内部类都可以独立地继承(实现)基类(接口),无论外部类是否已经继承了该类(实现),对内部类都没有影响因此,内部类使得多重继承的解决方案变得完整,实现了“多重继承”信息工程学院本科课程6.1.1普通内部类信息工程学院本科课程6.1.2匿名类匿名类是一个子类,用于临时创建一个内部类对象,不必单独去定义该子类匿名类体内可以对父类、抽象类以及接口的方法进行重写由于匿名类没有类名,因此不能重用这个对象创建形式:newMyType(){匿名类类体};7信息工程学院本科课程6.1.2和类有关的匿名类匿名类在创建对象时,要直接使用父类的构造方法8完成三件事:1、创建一个Speak的子类,该子类为匿名类2、改写Speak中的方法speakHello()3、返回该子类的引用,赋给Speakspeak信息工程学院本科课程6.1.3和接口有关的匿名类9信息工程学院本科课程6.1.5内部类访问权限非静态成员必须在外部类对象存在的情况下使用非静态内部类可以访问外部类的所有成员,包括private成员外部类之外访问内部类时需要注意权限修饰符的限制,这点和类成员一样外部类访问内部类的成员需要创建内部类的对象,之后可以访问内部类的任何成员,包括private成员,需要注意的是普通内部类不可以有静态成员当外部类的成员和内部类的成员重名时,仅用this是区分不了的。在内部类中访问外部类的成员时可以用如下语法区分:外部类类名.this.外部类中需要被访问的成员名;内部类定义在方法中称为局部内部类,只在局部有效10信息工程学院本科课程6.2静态内部类用static声明的内部类为静态内部类静态内部类经常用于大型程序的调试静态与非静态内部类的区别:非静态可以随意访问外部类中的成员静态内部类只能访问外部类的静态成员静态内部类体内可以定义静态方法,非静态不可以使用静态内部类对象时,不需要和外部类实例绑定11信息工程学院本科课程6.3异常类异常(Exception)是正常程序流程所不能处理或没有处理的异常情况或异常事件12没有处理错误的程序:ReadFile{Openthefile;GotSizeOftheFile;AllocateMemory;ClosetheFile;}信息工程学院本科课程6.3.1常规出错处理的缺点程序员大部分精力放在出错处理只能处理容易想到的错误,其它错误无法处理程序可读性差,产生大量if-else语句出错返回信息量少13信息工程学院本科课程6.3.2用异常处理错误14信息工程学院本科课程6.3.3异常的分类异常是一个对象,继承自Java.lang.Throwable类,所有的Throwable类的子孙类所产生的对象都是意外Error:由JVM生成并抛出,java程序不做处理RuntimeException(被0除等系统错误,数组下标越界等):由系统检测,用户的Java程序可以不做处理,系统将它们交给缺省的异常处理程序Exception:Java编译器要求Java程序必须捕获或生命所有的非运行时异常throw:用户自己定义的异常类15信息工程学院本科课程6.3.3异常的分类1616ThrowableErrorExceptionVirtualMachineErrorAWTErrorRuntimeExceptionIOExceptionEOFExceptionFileNotFoundExceptionArithmeticExceptionNullPointerExceptionArrayIndexOutOfBoundsException信息工程学院本科课程6.3.4捕获异常捕获并处理异常Try{//接受监视的程序块,发生异常由catch中指//定的程序处理}catch(要处理的异常种类和标识符){//处理异常}catch(要处理的异常种类和标识符){//处理异常}17信息工程学院本科课程6.3.4finally关键字无论是否有异常被抛出,都会执行,finally程序块一般作为异常处理的统一出口try{//常规代码}catch(….){//异常处理}finally{//无论发生什么异常(或者不发生任何异常)//都要执行}18finally在处理文件时非常有用信息工程学院本科课程6.3.5输出相关异常publicclassExceptionMethods{publicstaticvoidmain(String[]args){try{thrownewException(Here'smyException);}catch(Exceptione){System.out.println(CaughtException);System.out.println(e.getMessage():+e.getMessage());System.out.println(e.toString():+e.toString());System.out.println(e.printStackTrace():);e.printStackTrace();}}}19信息工程学院本科课程6.3.6人为抛出异常用户定义的异常通常用try-catch捕获,但必须由用户自己抛出thrownewException异常是一个类,用户定义的异常必须继承自Throwable或者Exception,建议用Exception20信息工程学院本科课程21自定义异常类信息工程学院本科课程6.3.7throws和throwthrows关键字通常被应用在声明方法时,用来指定可能抛出的异常。多个异常可以使用逗号隔开。当在主函数中调用该方法时,如果发生异常,就会将异常抛给指定异常对象。throw关键字通常用在方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即停止,它后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中来捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法声明中指明要抛出的异常;如果要捕捉throw抛出的异常,则必须使用try—catch语句。22信息工程学院本科课程6.3.7throws23信息工程学院本科课程6.3.7throw24信息工程学院本科课程6.3异常类小结编写异常处理代码应遵循以下两个原则:尽可能在当前程序中解决问题,否则应将异常向更外层的程序抛出。简化编码。不要因加入异常处理而使程序变得复杂难懂。25信息工程学院本科课程练习:写出下面程序标记为1-6的执行顺序publicclassUsingExceptions{publicstaticvoidmain(Stringargs[]){try{method1();//1}catch(Exceptione){System.err.println(e.getMessage());//2}finally{System.out.println(Programisend!);//3}}publicstaticvoidmethod1()throwsException{method2();//4}publicstaticvoidmethod2()throwsException{method3();//5}publicstaticvoidmethod3()throwsException{thrownewException(Exceptionthrowninmethod3);//6}}信息工程学院本科课程6.4断言Java1.4以后引入断言机制主要用于监视代码的执行状态两种格式:assertbooleanExperession;如果booleanExperession为真,继续执行,否则在此处停止执行assertbooleanExperession:messageExpression如果booleanExperession为真,继续执行,否则在此处停止执行,并输出messageExpression例6.627信息工程学院本科课程6.5Class类Class类的实例用来封装对象的状态,随着对象被创建而自动创建Class类不提供构造方法,不能用new关键字创建对象主要方法:StringgetName();Constructor[]getDeclaredConstructors();Field[]getDeclaredFields();Method[]getDeclaredMethods();例6.728信息工程学院本科课程6.5使用Class类实例化一个对象不使用new运算符和类的构造方法,用Class也可以得到一个类的实例方法:用Class.forName(类名)得到Class对象用该对象调用newInstance()返回类的实例前提:类体内提供无参的构造方法例6.829信息工程学院本科课程4月10日上机问题有package和import语句源文件编译过程(包外)1、最方便的编译方式:如果用命令,建议不要自己根据package结构建文件夹,编译时用javac-d.*.java自动生成package目录2、使用javac*.java编译所有源文件,将所编译的字节码文件拷贝入和包名对应的文件夹3、对每个源文件逐个编译,编译一个放置一个字节码文件,注意无import语句的文件最先编译,因为有import语句的源文件编译时需要import其字节码文件。30

1 / 30
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功