Chapter 3_-OOP Primary

Download Report

Transcript Chapter 3_-OOP Primary

《Java面向对象程序设计》
淮海工学院 计算机工程学院
第四章--抽象类
接口
异常处理
本章内容
 4.1 抽象类与抽象方法
 4.2 接口
 4.3 异常处理
 4.4 断言
2
计算机工程学院
4.1 抽象类与抽象方法
(1)抽象类
没有具体实例对象的类。使用抽象类的优点是可以充
分利用公共属性来提高开发和维护程序的效率。
例:”交通工具”,代表了所有具体交通工具的共同
属性,如速度、加速、减速等。所以可将“交通工具”类
定义为抽象类。
交通工具
陆地交通工具
汽车
3
海上交通工具
空中交通工具
自行车
计算机工程学院
abstract class 交通工具
{
float speed; //速度
abstract void start() ; //启动
abstract void stop(); //停止
abstract float speedUp(float deltaSpeed);
}
class 陆地交通工具 extends 交通工具 { }
class 水上交通工具 extends 交通工具 { }
class 空中交通工具 extends 交通工具 { }
class 飞机 extends 空中交通工具 { }
class 轮船 extends 水上交通工具 { }
class 汽车 extends 陆地交通工具 { }
4
计算机工程学院
注意事项:
 抽象类没有实例(不能new抽象类)
 抽象类必然有子类
 抽象类中多数情况下包含抽象方法
(并不总是必须要包含!)
abstract class superClass { abstract void method1(); }
class subClass1 extends superClass{ void method1(){… }
}
class subClass2 extends superClass{ void method1(){ … }
}
superClass sup=new superClass();
X
superClass sup1=new subClass1();
sup1.method1();
√
superClass sup2=new subClass2();
sup2.method1();
√
5
计算机工程学院
(2) 抽象方法
用abstract声明的方法仅有方法头,而没有
方法体
方法体的具体实现由当前类的不同子类在各自
的类定义中完成
所有的抽象方法必须存在于抽象类中。即非抽
象类中不能包含抽象方法。
6
计算机工程学院
 4.1 抽象类与抽象方法
 4.2 接口
 4.3 异常处理
 4.4 断言
7
计算机工程学院
4.2 接口
接口的概念:
 接口又称界面,是由抽象方法和常量组成的特殊
类,代表了某一组功能的实现,是用来实现多重
继承功能的结构。
Java中一个类只能有一个父类,但可以同时实现
若干个接口,故可以实现类似于类的多重继承的
功能。
接口中的方法都是抽象方法,没有具体实现;其
功能需要在实现这个接口的类中完成
接口也具有继承性,用extends来声明,一个接口
可以有一个以上的父接口,之间用逗号分隔。
8
计算机工程学院
接口的声明
接口用关键字interface来声明。
语法:
[public] interface 接口名 [extends 父接口名列表]
{
//常量域说明;
[public] [static] [final] 域类型 域名=常量值;
//抽象方法声明
[public] [abstract] [native] 返回值 方法名
(参数列表)
[throws 异常列表];
}
9
计算机工程学院
说明:
 接口中的所有属性都必须是public static final,接口中
的所有方法都必须是默认的public abstract,这都是系统
默认的,无论是否有修饰符显式地限定它们,效果都一样。
例: public interface java.io.DataInput
{
public abstract boolean readBoolean( );
public abstract byte readByte( );
public abstract char readChar( );
public abstract double readDouble( );
public abstract float readFloat( );
public abstract String readLine( );
}
10
计算机工程学院
分析以下程序片段,有错误吗?
interface shape {
void draw();
void erase(); }
class square implements shape {
void draw() { …} X
void erase(){ …} X
}
class circle implements shape {
void draw() { …} X
void erase(){ …} X
}
11
计算机工程学院
接口示例:
interface myInterface1
{
public void method1();
}
class myClass implements
interface myInterface2
{
public void method2();
}
myInterface1,myInterface2
{
public void method1() { System.out.println(“实现了方法1”); }
public void method2() { System.out.println(“实现了方法2”); }
}
12
计算机工程学院
实现接口的注意事项:
(1)如果实现某接口的类不是abstract类,则在类的定
义部分必须实现指定接口的所有抽象方法,即为所有抽
象方法定义方法体,而且方法头部分应该与接口中的定
义完全一致,即有完全相同的返回值和参数列表。
(2)如果实现某接口的类是abstract类,则它可以不实
现该接口中所有的方法。但是对于这个抽象类任何一个
非抽象的子类而言,它们父类所实现的接口中的所有抽
象方法都必须有实在的方法体,即不允许存在未被实现
的接口方法。
这主要体现了非抽象类中不能存在抽象方法的原则。
13
计算机工程学院
(3)一个类在实现某接口的抽象方法时,必须
使用完全相同的方法头。
(4)接口的抽象方法的访问限制符都已指定为
public,所以类在实现方法时,必须显式地使
用public修饰符,否则将被系统警告为缩小了
接口中定义的方法的访问控制范围。
14
计算机工程学院
 4.1 抽象类与抽象方法
 4.2 接口
 4.3 异常处理
 4.4 断言
15
计算机工程学院
异常与异常类
(1) Java 的异常处理机制
 异常是特殊的错误运行对象,又称例外,对应着
Java语言特定的运行错误处理机制。
 为了能够及时有效地处理程序中的运行错误,
Java引入了异常和异常类。异常是异常类的对象。
 一旦一个异常对象产生了,系统中就一定有相应
的机制来处理它,确保不会产生死机、死循环或
其它对操作系统的损害,保证整个程序运行的安
全性。
16
计算机工程学院
(2)异常类结构与组成
每一种类对应一种特定的错误;异常类都是系统
Exception类的子类.
Throwable类
Error类
Exception类
RuntimeException
…
…
IOException
…
…
AWTException
IllegalAccessException
17
InterruptedException
ClassNotFoundException
计算机工程学院
Throwable类是类库java.lang包中的一个类,派生
两个子类:Exception和Error
Exception类有两个构造函数:
public Exception();
public Exception(String s);
其中s是对该异常所对应的错误的描述。
从父类Throwable继承的常用方法:
1) public String toString();
该方法返回描述当前Exception类信息的字符串。
2) public void printStackTrace();
该方法的功能是完成一个打印操作,在屏幕上输出当前
异常对象的堆栈使用轨迹,即程序先后调用了哪些对象
或类的方法,使得运行过程中产生了这个异常对象。
18
计算机工程学院
(3)常见的系统定义的异常类
系统定义的运行异常
异常对应的系统运行错误
NullPointerException
试图引用一个空对象
ClassNotFoundException
未找到欲装载使用的类
ArrayIndexOutOfBoundsException
数组越界使用
FileNotFoundException
未找到指定的文件或目录
IOException
输入、输出错误
ArithmeticException
算术错误,如除数为0
SecurityException
安全性错误,如Applet欲读写
文件
MalformedURLException
URL格式错误
19
计算机工程学院
(4)用户自定义的异常
作用:用来处理程序中特定的逻辑运行错误。
创建用户自定义异常时,一般需要完成如下工作:
(1)声明一个新的异常类,使之以Exception类
或其他某个已经存在的系统异常类或用户异常类
为父类;
(2)为新的异常类定义属性和方法,或重载父类的
属性和方法,使这些属性和方法能够体现该类所
对应的错误的信息。
定义足够多的异常类是构建一个稳定完善的应用
系统的重要基础之一。
20
计算机工程学院
异常的抛出
Java程序在运行时如果出现可识别的错误,系统就产生一个与该错
误相对应的异常类的对象,这个过程就是异常的抛出。
(1)系统自动抛出的异常
所有系统定义的运行异常(RuntimeException,如算术运算异常、
数组下标越界异常等)都可以由系统自动抛出。
例:public class TestSystemException
{
public static void main(String[] args)
{
int a=0,b=5;
//以零为除数,引发系统定义的算术异常
System.out.println(b/a);
}
}
21
计算机工程学院
(2)语句抛出的异常
用户程序定义的异常不可能靠系统自动抛出,必须借
助throw语句定义何种情况才算产生了此种异常对应的
错误,并抛出这个异常类的新对象。
语法:
修饰符 返回类型 方法名(参数列表) throws 异常类名
列表
{
...
if(条件) throw 异常对象;
...
}
22
计算机工程学院
注意的问题:
(1)一般这种抛出异常的语句应该被定
义为在满足一定条件时执行,如在if语
句的条件分支中。
(2)含有throw语句的方法,应该在方
法头定义中增加如下的部分:
throws 异常类名列表
23
计算机工程学院
异常的处理
包括捕捉异常、程序流程的跳转和异常处理
语句块的定义。
(1)捕捉异常
异常被抛出时,用专门的语句来接收异常对
象,格式如下:
catch(异常类名 异常对象)
{
异常处理语句;
}
24
计算机工程学院
Java语言规定:
每个catch语句块都应该与一个try语
句块相对应,这个try语句块用来启动Java的
异常处理机制,可能抛出异常的语句都应该包
含在这个try语句块中。
25
计算机工程学院
(2)多异常的处理
通过一个try块后面定义若干个catch块来实现,
每个catch块用来接收和处理一种特定的异常对象。
注意如下问题:
(1)catch块中的语句应根据异常的不同执行不
同的操作;
(2)处理多异常时应注意设计各catch块的排列
顺序:一般处理较具体和常见的异常应放在前,
可以与多种异常相匹配的应放在后;
26
计算机工程学院
异常处理的注意事项:
对于系统类库中的方法,如果其方法头中声明了
throws ***Exception,则对这样的方法的调用语句,
必须放在try语句块中,后面跟上catch子句,然后再跟
上可选的finally子句。
如:
try {
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
}
catch(ClassNotFoundException e)
{
e.printStackTrace(); }
finally { ….. }
27
计算机工程学院
自定义异常类的简单示例
class myException extends Exception
{
String errorMessage=null;
myException (String s) {errorMessage=s;}
public String toString() {return errorMessage; }
}
class Student {
public void speak(int m) throws myException
{
if (m>=1000)
throw new myException(“值太大了!”);
}
}
28
计算机工程学院
public class Test
{
public static void main(String args[])
{
Student s=new Student();
try {
s.speak(999); }
catch(myException e)
{ System.out.println(e.toString()); }
try {
s.speak(1000); }
catch(myException e)
{ System.out.println(e.toString()); } } }
29
计算机工程学院
 4.1 抽象类与抽象方法
 4.2 接口
 4.3 异常处理
 4.4 断言
30
计算机工程学院
什么是断言(assert)?
(1)断言是一个包含布尔表达式的语句,在执行这
个语句时假定该表达式为 true.如果表达式计算
为 false,那么系统会报告一个
AssertionError.
(2)断言只适用于复杂的调试过程。一般用于程序
执行结果的判断,不要让断言处理业务流程。
(3) 默认情况下JVM是禁用断言的。
要启用断言,用java -ea选项
java -ea 主类名
31
计算机工程学院
断言的使用:
(1)第 1 种使用方法: assert <boolean表达式>
如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出AssertionError,并终止执行。
public static void main(String[] args) {
boolean isOk = 1>2;
assert isOk;
System.out.println("程序正常");
}
因为 1>2 显然是错误的,所以执行结果抛出异常:
Exception in thread "main" java.lang.AssertionError
如果把 1>2 改为 1<2 则程序能顺利执行,打印 “程序正常
”
32
计算机工程学院
第 2 种使用方法: assert <boolean表达式> : <错误信息表达式>
如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出java.lang.AssertionError,<错误信息表达式>成
为AssertionError的message。
public static void main(String[] args) {
boolean isOk = 1>2;
try{ assert isOk : "程序错误";
System.out.println("程序正常");
} catch(AssertionError err){
System.out.println(err.getMessage());
} }
assert 后面跟个冒号表达式。如果冒号前为 true,则冒号后面的被忽
略。 如果冒号前为false,则抛出AssertionError ,错误信息内容为冒号后
面的内容,上面程序执行结果就是打印:"程序错误"
33
计算机工程学院