接口由若干常量定义和一组抽象方法组成,接口中不包括变量和有具体实现的方法。从本质上讲,接口是一种特殊的抽象类,它比抽象类还要抽象,因为它只能包含常量和方法的声明,而没有变量和方法的实现。接口中的方法是由它的实现类来实现。也可以将接口理解为一种契约,主要用于声明一组应该履行的方法
接口是由常量和抽象方法两部分组成,定义一个接口跟创建一个类非常相似。接口定义包括接口声明和接口体。
public interface Callnterface{
float PI=3.14159f;//定义用于表示圆周率的常量PI,省略了public static final修饰符
float getArea(float r);//定义一个用于计算面积的方法
float getCircumference(float r);//定义一个用于计算周长的方法
接口实现
接口在定义后,要想使用接口,就需要借助于类来实现该接口。在类中实现接口可以使用关键字implments,
接口与抽象类的区别
(1)相同点:都不能直接实例化,即不能直接new对象,通过子类实例化。
(2:不同点:
**1.**抽象类包括一般方法,抽象方法,变量,常量;而接口只能包括常量和抽象方法。
**2.**抽象类可以有构造方法;而接口不能有构造方法。
**3.**抽象类可以实现多个接口;而接口不能继承一个抽象类。
**4.**如果继承类时会引发单继承所带来的局限性;而通过实现接口的方式能够解决单继承带来的局限性
接口的使用场合
接口的使用场合主要在两个方面,一个是多重继承,一个是可扩展性。
Java中类不允许多重继承,接口可以弥补这一缺陷。
Java引入接口的目的
(1)实现多重继承。
(2)通过接口能够更好的提高程序的可扩展性和维护性。
1.适配器设计模式
注:
适配器设计模式可以实现根据需要重写相应的方法。
2.简单工厂设计模式
2.简单工厂设计模式则USBSimulator类中的代码:
USB usb=new MP3();//生产了符合USB接口规范的MP3可以修改为:可以修改为:
通过中间加一个过渡,只管接口和工厂, 解决了子类直接和接口的耦合,这就是简单工厂设计模式,当需要改变类对象时,只需要修改工厂类,不会影响到客户端的实现。
异常(Exception)也就是不正常,又称为例外或突发事件,在生活中,异常情况随时都有可能发生。
异常处理,类似于现实生活中的应急工作预案。
Java中的异常,指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。
例如:
import java.util.Scanner;
public class DivByZero {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int x,y;
System.out.println("请输入除数x:");
x=input.nextInt();
y=10/x;
System.out.println("10/x的结果为:"+y);
input.close();
}
}
当输入0或者非整数的时候就会运行错误。就会退出程序的运行状态。
这是Java程序在运行时出现的突发情况,它不影响程序的编译,也不影响正常情况下的运行使用。
改进当输入0和非整数时能够运行代码:
import java.util.Scanner;
public class DivByZeroPlus {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);//输入对象
int x,y;
System.out.println("请输入除数x:");
if(input.hasNextInt()) {//判断是否为整数
x=input.nextInt();
if(x==0) {
System.out.println("除数是0,运算结果为无穷大");
}else {
y=10/x;
System.out.println("10/x的结果为:"+y);
}}
else {
System.out.println("您输入的数据不是整数类型。");
}
input.close();
}
}
1.在java语言中,所有的异常都是用类表示的。
2.当程序发生异常时,会生成某个类的对象。
3.异常类对象包括:关于异常的信息、类型和错误发生时程序的状态,以及对该错误的详细描述。
4.java通过API中“Throwable类的众多子类”,来描述各种不同的异常。因而,java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的错误条件。当条件成立时,错误将引发异常。
5.Throwable类有两个子类:Exception(异常)类和Error(错误)类。
6.Java程序用继承的方式来组织各种异常。所有的异常都是个Throwable类或其子类,而Throwable类又直接继承于object类。
(1)当出现RuntimeException的时候,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。
(2)非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。如IOException、SQLException等以及 用户自定义的Exception异常。
可以被捕获并且可能恢复的异常类,用户程序也可以通过继承Exception类,来生成自己的异常类。
Exception异常类包括:
1.java.awt.AWTException,抽象窗口工具包AWT出现异常
2.java.nio.channels.AlreadyBoundException,尝试绑定已经绑定的、网络套接字时抛出的异常;
3.java.util.zip.DataFromatException,数据格式错误异常;
4.java.io.EOFException,在向文件写入数据的过程,意外的到达了文件或流操作文件,其它的输入操作,是返回值而不是抛出异常;
5.java.io.FileNotFoundException,试图打开一个指定路径的文件时,引发的异常。当指定路径的文件不存在时,而使用FileInputStream、FileOutputStream或RandomAccessFile构造实例时,就会抛出这个异常;如果这个文件确实存在,但因为某种特殊的原因(如:打开一个只读文件进行读写时),也会抛出这个异常;
6.java.net.HttpRetryException,当流媒体模式被启动,一个HTTP请求需要重新发送、却无法自动重发而引发的异常;
7.java.net.MalformedURLException,统一资源定位器(URL)的格式不正确,引发的异常;
8.java.net.ProtocolException,网络协议异常;
9.java.net.SocketException,Socket操作异常;
10.java.lang.ArithmeticException,算术(如除数为0)运算引发的异常;
11.java.lang.ClassCastException,类型转换异常;
12.java.lang.IndexOutOfBoundsException,下标越界异常;
13.java.lang.NullPointerException,访问一个空对象中的成员时,引发的异常;
14.java.lang.NumberFormatException,数据类型转换错误的异常;
15.java.util.InputMismatchException,通过Scanner对象输入的数据类型,与接收数据的类型不匹配,而引发的异常。
16.java.lang.ArrayIndexOutOfBoundsException,数组下标越界异常,如定义int a[]=new int[3];引用int a[3]={1,2,3},引用其中的元素a[3],其实a[3]为第4个元素,因为Java数组引用下标是从0开始的,a[0]是第1个元素,类似后a[3]是第4个元素。
一般情况下,被认为是不可恢复、和不可捕捉的异常类,用户程序不需要处理这类异常。
在捕捉Error类及子类时要多加小心,因为它们通常、是在出现灾难性错误时被创建。
Error异常类包括:
1.java.lang.LinkageError,一个类A依赖于另一个类B,当类A编译完成后,类B发生了更改,导致A无法找到B,而创建的错误信息对象;
2.java.lang.VirtualMachineError,Java虚拟机坏了,或继续运行Java虚拟机,所需的资源已经耗尽了,而创建的错误信息对象;
3.java.awt.AWTError,抽象窗口工具包,AWT发生严重错误时,而创建的错误信息对象。
**
try…catch格式:
try{
可能产生异常的代码
}catch(异常类 异常对象){
异常处理代码
}
//try代码块中的代码,可能同时存在多个异常。
catch代码中的“异常类”参数,指定要捕获哪类异常。
catch代码块类似于方法的声明,包括一个异常类
类型、和该类型的一一个实例,异常类必须是Throwable
类的子类,用来指定catch语句要捕获的异常,异常类对
象可以在catch代码块中被调用,如调用对象的printSta
ckTrace()方法,将异常信息打印显示到指定的对象中去。
多个catch块结构的一般格式:
try{
可能产生异常的代码
}catch(异常类1 异常对象1){
异常1处理代码
}catch(异常类2 异常对象2){
异常2处理代码
}
...其他的catch语句块
}catch(异常类n 异常对象n){
异常n处理代码
}
Java中的try…catch结构提供了finally子句,在try…catch 结构中、使用finally子句后,不管程序中有无异常发生,也不管之前的try…catch结构、是否程序顺利有无执行,都实现finally里面的内容。
如果某个方法会抛出异常,但不想在当前的这个方法中来处理这个异常,可以将这个异常抛出,在调用这个方法的代码中,捕捉这个异常并进行处理。Java语言中通过关键字throws,声明某个方法可能抛出的多种异常,throws可以同时声明多个异常,各个异常之间用逗号分隔。
使用try…catch结构与throws关键字,抛出与捕获的都是系统定义异常;或用户自定义的异常;
Java中提供了throw关键字,可以在方法体内部抛出一个异常类对象。
public class ChkAgeByThrow {
public static void main(String[] args) {
try {
int age=chkAge("-23");//调用chkAge方法
System.out.println("字符串的年龄为:"+age+"岁");
}catch(Exception ex) {
//捕获throw抛出的异常
System.out.println("年龄数据有逻辑错误!");
System.out.println("原因:"+ex.getMessage());
}
}
private static int chkAge(String strAge) throws Exception {
int age=Integer.parseInt(strAge);//将字符串转换为整型
if(age<0) {
//如果年龄小于0//抛出一个异常
throw new Exception("年龄不能为负数!");
}
return age;
}
}
(1)在数字格式的字符串数据,转换为整型数据时(如int age=chkAge("-23A"),抛出NumberFormatException,该类异常由系统抛出并做处理;
(2)当年龄age<0时,发生逻辑错误而抛出的Exception异常。
(1)作用不同:
①throw用于Java语言环境不能捕捉的异常:如年龄、性别等逻辑错误、由程序员自行产生并抛出。
②throws用于声明在该方法内抛出异常;
(2)使用位置不同:
①throw位于方法体内部,可以作为单独的语句使用。
②throws必须跟在方法参数列表的后面,不能单独使用;
例如:throws的代码
import java.util.InputMismatchException;
import java.util.Scanner;
public class DivByZeroUseThrows {
public static void main(String[] args) {
try {
divByZero();//调用自定义方法
}catch(InputMismatchException ex) {
//异常
System.out.println("数入的除数数据必须是整数类型");
}catch(ArithmeticException ex){
System.out.println("除数不能为0");
}finally {
//finally子句肯定被执行
System.out.println("欢迎使用本计算机程序");
}
}
private static void divByZero() {
Scanner input=new Scanner(System.in);//输入对象
int x,y;
System.out.println("请输入除数x:");
x=input.nextInt();
y=10/x;
System.out.println("10/x的结果为:"+y);
input.close();
}
}
throw代码
public class ChkAgeByThrow {
public static void main(String[] args) {
try {
int age=chkAge("-23");//调用chkAge方法
System.out.println("字符串的年龄为:"+age+"岁");
}catch(Exception ex) {
//捕获throw抛出的异常
System.out.println("年龄数据有逻辑错误!");
System.out.println("原因:"+ex.getMessage());
}
}
private static int chkAge(String strAge) throws Exception {
int age=Integer.parseInt(strAge);//将字符串转换为整型
if(age<0) {
//如果年龄小于0//抛出一个异常
throw new Exception("年龄不能为负数!");
}
return age;
}
}
(3)内容不同:
①throw抛出一个异常对象,而且只能抛出一个。
②throws后面跟异常类,而且可以跟多个异常类。
异常处理主要使用:try、catch、finally、throws、throw等关键名字。
注意事项:
(1)对于程序中的异常,必须使用try…catch结构捕获,或通过throws向上抛出异常,否则编译会出错;
(2)不能单独的使用try、catch或者finally代码块,否则代码在编译时会出错;
(3)try代码块后面,可以单独的跟一个到多个catch块,也可以单独的仅跟一个finally块,catch块和finally块可以同时存在,但finally块一定要跟在catch块之后,
格式为:
try{
//try块的代码
}catch(异常类型 异常变量){
//最多只能有一个finally块
//不管是否有异常抛出或捕获,
finally代码块都会被执行
}
(4).在try…catch…finally结构中,不论程序是否会抛出异常,finally代码块都会被执行;
(5) try只跟catch代码配合使用时,可以使用多个catch块,来捕获try代码块中、可能发生的多种异常,异常发生后,Java
虚拟机、会由上而下的检查当前catch代码块所捕获的异常,是否与try代码中的发生的异常匹配,若匹配,则不再执行其它的catch代码块。
如果多重catch代码块捕获的是同种类型的异常,则捕获子类异常的catch代码块要放在捕获父类异常的catch块代码之前,否则将会在编译时发生编译错误。
== 例如:==
try{
//try块的代码
}catch(NumberFormatException ex){ //数据格式化异常
//异常1,
}catch(llegalArgumentException ex){ //非法参数异常
//异常2,NumberFormatException是IllegalArgument
Exception的子类
}catch(RuntimeException ex){ //运行时异常
//异常3,IllegalArgumentException是RuntimeException的子类
}catch(Exception ex){
//异常4, RuntimeException是Exception的子类
}
(6)在try、catch、 finally等的代码块中,定义的变量为局部变量,只能在代码块内部使用,如果要使用全局变量,则要将变量定义在这几个模块之外;
(7)在使用throw语句,抛出一个异常对象时,该语句后面的代码将不会被执行,
== 例如:==
if(age<0){ //如果年龄小于0
throw new Exception("年龄不能为负数! ");//①抛出一个异常}
return age;//②
}
在程序运行过程中,当年龄小于0时,会使用①处的代码行抛出异常,并中断该段程序的执行,因此此时代码行②将不能执行。
自定义异常类,必须是继承自Throwable类或其子类,才能被视为异常类,在实现中通常继承Exception类或其子类。