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
计算机工程学院