抽象类/接口 与异常处理机制 主讲:赖国荣 QQ:31343080 www.sms98.cn
目 标 关联关系 聚合关系 接口与抽象类 异常处理机制 垃圾回收
BookExtend : bookExtend 类的关联关系 关联关系:表示不同类的对象之间的结构关系,它在一段时间内将多个类的实例连接在一起。 通过关联关系可以表示对象之间的沟通。 多个对象处于同一个层次上 包括: 一对一关系 一对多关系 多对多关系 Book Int : id String name BookExtend : bookExtend BookExtend int : id String : name
聚合关系 聚合关系是关联关系的一种,是强的关联关系,表示整体与个体的关系。 聚合关系用于对模型元素之间的组装关系进行建模。 汽车由很多零部件组成; 计算机由很多设备组成 图书馆由很多书组成 公司由很多部门组成
抽象类 在java中用abstract关键字来修饰一个类时,这个类叫做抽象类。 抽象类的特点: abstract class className{ } 抽象类的特点: 抽象类不能直接运用new创建对象 抽象类的实体中可以有abstract方法,且abstract方法只允许声明,而不允许实现 abstract returnType method([paramList]); 抽象类中不一定要包含abstract方法,但一个类中包含了abstract方法,则这个类必须声明为abstract类。 抽象类的实现子类必须实现抽象类中所有的abstract方法
接 口 接口:是抽象类的一种,只包含常量和方法的定义,而没有变量和方法的实现,且其方法都是抽象方法。 接口的含义: 所有实现了该特定接口的类看起来都象它。
接口图形例子 Instrument接口 Void play(); String what(); Void adjust(); 乐器 Wind Percussion Stringed implements 风笛 打击乐器 管弦乐器 Woodwinds Void play(); String what(); Brass Void adjust(); extends 木制风笛 铜制风笛
接口的定义 -1 格式如下: 接口声明 [access] interface interfaceName [extends listOfSuperInterface] { type final-var-name1 = value; … type final-var-nameN = value; return-type method-name1 (para-list); return-type method-nameN (para-list); } 接口声明 接口体 1、常量定义 2、方法定义
接口的定义-2 1、 access为public 或没有(默认包访问修饰符)。 2、包括接口声明和接口体;接口体包括常量定义和方法定义。 3、常量被实现该接口的多个类共享; 具有public ,final, static的属性。 4、方法体具有 public和abstract属性。
接口定义例子 Interface Callback{ String name = "interface callback"; void callback(int param); } 错误: void callback(int param){ }
接口的实现-implements 关键字 实现格式: access class classname [ extends superclass ] [implements interface[ , interface…] ]{ //class-body } 1、access是public或没有(默认包访问修饰)。 2、一个类可以实现多个接口,在implements子句中用逗号分开。 3、实现类共享接口中定义的常量为,而且必须实现接口中定义的所有方法。 4、实现接口的方法必须声明成public,且必须严格与接口定义中制定的类型匹配。 5、若多个接口中有相同的方法,只现实一次。 6、可在实现类中定义自己的附加变量或方法。
接口实现的例子 public class Client implements Callback{ //实现接口中定义的方法 public void callback(int p){ System.out.println("callback called with "+p); } //自定义方法 public void nonIfaceMeth(){ System.out.println("define other method");
接口的局部实现--抽象类 如果一个类包含一个接口但是不完全实现接口中定义的方法,那么该类必须定义成abstract型。 例如: abstract class Incomplete implements Callback{ int a,b; void show(){ System.out.println(a + “ “+b); } 任何继承Incomplete的类都必须实现callback()方法,或是自己也定义成abstract类。
接口的应用 1、用接口实现多重继承 2、用接口来实现群组常量的定义 3、可以将接口当成接口类型来使用 4、接口可以扩展
用接口实现多重继承—接口的应用 Java只支持单继承,那么我们可以通过实现接口的方式,让一个类拥有多个类型的操作。 例如: 如果要表示一个X是一个A和一个B以及一个C; X 的抽象类或具体的基类 接口A 接口B 接口C extends implements X 实现类 接口A 接口B 接口C
例如: 实现群组定义—接口的应用 引用的方法:packageName.Months.JANUARY即可代表数字1。 缺点: 缺少安全性。 因为接口中定义的任何字段都是static和final的,可以将接口当成创建常量组的工具。 例如: public interface Months{ int JANUARY = 1, FEBRUARY = 2, MARCH = 3, APRIL = 4, MAY = 5, JUNE = 6, JULY = 7, AUGUST = 8, SEPTEMBER = 9, OCTOBER = 10, NOVERBER= 11, DECEMBER = 12; } 引用的方法:packageName.Months.JANUARY即可代表数字1。 缺点: 缺少安全性。
接口类型的使用—接口的应用 接口可作为一种引用类型来使用。 可创建一个接口类型的类实例对象。 一个接口引用变量仅知道被它的接口定义声明的方法。 Interface A A a = new B(); a.method1(); a.method2(); a.nameA; //B中定义的方法和变量无法调用 //出现编译错误 a.nameB; a.method3(); String nameA; Void method1( ) Void method2( ) implements Class B String nameB; Void method1( ) Void method2( ) Void method3( )
当接口B继承接口A后,将包含method1() 和 method2()两个方法,自己再增加method3() 接口扩展—接口的应用 通过继承可以在新接口中添加新的方法,还可以在新接口中组合数个接口。当一个类实现了该接口,它必须实现接口继承链表中定义的所有方法。 例如: Interface A 当接口B继承接口A后,将包含method1() 和 method2()两个方法,自己再增加method3() Void method1( ) Void method2( ) extends Interface A Interface B Implements Void method1( ) Void method2( ) Void method3( ) Void method3( )
异 常 在程序运行过程中所发生的破坏了正常的指令流程的事件称为例外。 软件和硬件错误都可能导致他们的产生。例如: 用户输入出错 异 常 在程序运行过程中所发生的破坏了正常的指令流程的事件称为例外。 软件和硬件错误都可能导致他们的产生。例如: 用户输入出错 所需文件找不到 运行时磁盘空间不够 内存不够 算术运算错误 (数的溢出,被零除…) 数组下标越界
异常:是在程序执行过程中出现的一个事件,它中断了正常指令的运行。 异 常 异常:是在程序执行过程中出现的一个事件,它中断了正常指令的运行。 错误:偏离了可接受的代码行为的一个动作或一个实例。
异常例子 public class ExceptionDemo{ public class HelloWorld { public static void main (String args[]) { int i = 0; String greetings [] = { "Hello world!", "No, I mean it!", "HELLO WORLD!!" }; while (i < 4) { System. out. println (greetings[ i]); i++; } public class ExceptionDemo{ public static void main(String[] args){ int i = 0; System.out.println(5/i); }
异常处理机制 可分为以下几个步骤: 1)抛出异常:在堆栈中创建一个异常对象。 当方法中有一个错误发生后,该方法创建一个异常对象并把它交给运行系统。异常对象中包含了有关异常的信息,如异常类型、发生错误时的程序状态等。 2)捕获异常:找到异常处理程序。 运行时系统在方法调用堆栈里为被抛出的异常查找处理代码。运行系统从发生错误的方法开始进行回朔,在方法调用堆栈里向后搜索,直到找到能处理当前发生的异常的处理程序的方法。 3)处理异常。 通过方法调用来处理异常。 4)终止或恢复运行。 如果运行时系统在方法调用栈查遍了所有的方法(主方法中)而未找到合适的异常处理程序,则运行时系统终止执行。
与传统的错误处理技术相比,java程序使用异常处理错误有以下优越性: 异常处理的优越性 与传统的错误处理技术相比,java程序使用异常处理错误有以下优越性: 可以把错误代码与常规代码分隔开 可以在调用栈中传播错误 可以对错误类型进行分组
用于显示与Java运行时系统本身有关的错误 捕获的异常,也是用来创建用户异常类型子类的基类。 异常类及其子类 所有异常类型都是 Throwable的子类 用于显示与Java运行时系统本身有关的错误 用户程序可能 捕获的异常,也是用来创建用户异常类型子类的基类。 Error类对象由Java虚拟机生成并抛出; Exception类对象由应用程序处理或抛出。
1、Throwable类是所有例外类型的父类,不能被直接使用,表示任何可以作为异常被抛出的类。 异常类及其子类-2 1、Throwable类是所有例外类型的父类,不能被直接使用,表示任何可以作为异常被抛出的类。 2、Error用来表示编译时和系统错误,表示恢复不是不可能但很困难情况下的一种严重问题。比如说内存溢出,它不可能执行程序处理这样的问题,一般是和VM有关的问题。
异常类及其子类-3 3、Exception是可以被抛出的基本异常类型,在JAVA类库、用户方法以及运行时故障中都可能抛出Exception型异常。 RuntimeException 运行时异常。它表示程序运行正常的话就不会发生这种问题,这种异常不用在程序中把他们列出来,运行时有问题,会自动被JVM抛出。比如空指针异常,数组超出异常。 除了运行时例外之外的其他由Exception 继承来的例外类都是非运行时的例外,例如FileNotFoundException(文件未找到例外)。Java编译器要求在程序中必须处理这种例外,捕获例外或者声明抛弃例外。
异常处理 由五个关键字 try、catch、throw、throws 和 finally 处理异常。 异常处理的两种方式: try-catch-finally语句捕获异常 try{ …… }catch( Exception e){ }finally { } 方法声明时用throws声明方法体内有异常
捕获异常 Try{ ….. }catch(ExceptionName1 e1 ){ } catch(ExceptionName2 e2 ){ } catch(ExceptionNameN eN ){ } finally{ }
捕获异常 try{ }选定捕获例外的范围,由try所限定的代码块中的语句在执行过程中可能会生成例外对象并抛弃。 catch( ){ } 放置异常处理程序。 1、catch必须紧跟在try之后 2、可有多个catch块,但异常类型必须是层层嵌套的,即先从子类异常,最后才到父类异常。 3、当抛出异常时,异常处理机制将负责搜索参数与异常类型相匹配的第一个处理程序。 4、只有匹配的catch子句能执行,和switch不同,不需要break. 5、可通过throwable类提供的方法getMessage(),printStackTrace( ) 来跟踪异常事件发生时执行堆栈的内容。 finally{ }为异常处理提供一个统一的出口或定义跳转流程;该语句永远会被执行。
例子 捕获异常 处理异常 public class CatchException{ public static void main (String args[]) { String greetings [] = { "Hello world!", "No, I mean it!", "HELLO WORLD!" }; for(int i=0;i<4;i++){ try{ System.out.println (greetings[i]); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("ArrayIndexOutOf Exception!"); }finally{ System.out.println("This is always printed!"); } }//end for } } 捕获异常 处理异常 清理或 状态恢复 例子:TryCatchFinallyDemo.java
Throwable类的常用方法 Throwable类的常用方法 getMessage() getStackTrace() 返回异常的原因 getStackTrace() 返回堆栈跟踪情况 printStackTrace() 打印堆栈的标准错误流 printStackTrace(PrintStream s) 打印堆栈的标准打印流 toString() 返回简单描述 ……. 例子:ExceptionMethodDemo.java
声明异常 Throws Exception 一般该方法用在调用第三方工具包的时候。 声明一个异常有两种方法: 如果在一个方法中生成了一个例外,但是这一方法并不确切地知道该如何对这一异常事件进行处理,这时,该方法就应该声明抛弃例外,使得例外对象可以从调用栈向后传播,直到有合适的方法捕获它为止。这是一种消极的异常处理机制。 一般该方法用在调用第三方工具包的时候。 声明一个异常有两种方法: throw throws
声明异常 --throw 可以通过throw关键字在可能出现异常的执行语句后面声明抛出一个异常。 格式: throw ThrowableObject; ThrowableObject必须为Throwable类或其子类的对象 例子:ThrowExceptionDemo.java
声明异常 --throws 在一个方法声明时通过throws关键字在声明异常。例如: public int read ( ) throws IOException{ ...... } throws子句中同时可以指明多个例外,之间由逗号隔开。例如: public static void main(String args[ ]) throws IOException,IndexOutOfBoundsException { … } 例子: ThrowsDemo.java
自定义异常类 声明一个新的异常类,该异常类必须从Java已有定义的异常类继承,如Exception、IOException等。 为新的异常类定义属性和方法,或重载父类的属性和方法,使这些属性和方法能够体现该类所对应的错误的信息。 例子:DefineExceptionDemo.java
自定义异常类例子 public class MyException extends Exception{ private int x; public MyException( ){ } public MyException( String msg){ super(msg); } public MyException( String msg , int x ){ super(msg); this.x = x; } public int val(){ return x ;} public String getMessage(){ return "Detail Message : "+x+" "+super.getMessage(); 例子:ExtraFeatures.java
垃圾处理器 1、java是通过finalize()方法进行垃圾处理的。 2、可通过System.gc()方法来强制启动垃圾回收器来处理垃圾。 finalize()方法不用在程序中启动,JVM会在需要的时候自己启动该方法进行垃圾处理。 有可能直到程序终止,该方法都不会执行。 2、可通过System.gc()方法来强制启动垃圾回收器来处理垃圾。
总 结 关联关系 聚合关系 接口与抽象类 异常处理机制 垃圾回收