四 “接口”,什么是“接口”,简单来说“接口”就是一种能力。
在JAVA语言中只支持单继承,不支持多继承,也就是一个类只能有一个父类,但是在实际的应用中,又需要多继承来解决问题,这就需要到“接口”。
举一个简单的例子,USB接口我们都知道,插上鼠标,可以让鼠标运转,插上U盘可以进行数据的传输,插上风扇,可以让风扇运转。怎样用JAVA语言来模拟呢?
首先我们定义一个接口类 U盘类,USB风扇类。
USB :
Public interface UsbInterface{
Void service();
}
USB U盘类:
Public class Udisk Implements UsbInterface{
Public void service(){
System.out printIn(“连接Usb接口,开始传输数据”);
}
}
Usb 风扇类:
Public class UsbFan implements UsbInterface{
Public void service(){
System.out printIn(“连接USB接口,风扇开始运转”);
}
}
在测试类里面:
UsbInterface uDisk =new UDisk();
uDisk.service();
我们发现我们在一开始定义的一个接口类,没有进行实例化,而是指向了USB风扇这个类,我们会在控制台上发现输出一句“连接USB接口,风扇开始运转”
语法:
[修饰符]interface 接口名[extends 父接口名列表]{
[public] [static][final] 变量:
[public] [abstract] 方法:
}
注意:
1 接口中可以定义变量,不能够定义常量。接口中的属性都会自动用“public static final”来进行修饰,也就是说,接口中的属性全部都是全局的静态常量,而且接口中的常量必须在定义的时候指定初始值。
2 接口中所有的方法都是抽象方法,接口中方法都会自动用“public abstract ”修饰,也就是说接口中只有全局的抽象方法。
3和抽象类一样,接口同样不能被实例化,接口中不能有构造方法。
4 接口之间可以通过extends实现继承关系,一个接口可以继承多个接口,单接口不能继承类。
5 一个类只能有一个直接父类,但可以通过implements 实现多个接口,类必须接口的全部方法,否则必须定义成抽象类,类在继承父类的同事又实现多个接口时,estends必须位于implementsh之前。
6在类中实现接口时候,方法名,返回值类型,参数的个数以及类型必须与接口中完全一致,并且必须实现接口中所有的方法。
在类的继承中,只能单继承,而实现接口的时候,一次则可以实现多个接口,每个接口都用逗号隔开,这时就可能出现变量或方法名冲突的情况,有变量冲突的时候,可以通过“接口名.变量”实现。
五 异常:
异常也就是我们平时写程序遇到的BUG,如何避免异常以及出现异常我们怎么处理,在JAVA的异常中我们主要是通过五个关键字来实现,“try”,“catch”,“finally”,“throw”,“throuws”。
下面我们看看try,catch关键字的语法:
Try{
代码块
}catch(Exception e){
代码块
}
public class text {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
Scanner input =new Scanner(System.in);
System.out.println("请输入除数");
int num = input.nextInt();
System.out.println("请输入被除数");
int num1=input.nextInt();
System.out.println(String.format("%d/%d=%d", num,num1,num/num1));
System.out.println("感谢使用本程序");
}catch(Exception e){
System.out.println("出现错误,被除数和除数必须是整数"+"除数不能为零");
e.printStackTrace();
}
}
}上面这段简单的代码演示整数之间的整除,除数和被除数都只能是整数或者不能为零,但是一旦输入小数,或者除数和被除数输入了零,这就会导致程序报错或无法运行,引进try,catch,
我们可以扑捉到这个错误,让我们发现错误的地方,进行代码的优化和修改。
如果try语句在执行过程中碰到异常,而抛出的异常在catch快里面没有被声明,那么程序会立刻退出()。
Tyr catch finally的语法:
Tyr catch finally{
代码块
}catch(Exception e){
代码块
}finally{
代码块
}
public class text {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
Scanner input =new Scanner(System.in);
System.out.println("请输入除数");
int num = input.nextInt();
System.out.println("请输入被除数");
int num1=input.nextInt();
System.out.println(String.format("%d/%d=%d", num,num1,num/num1));
System.out.println("感谢使用本程序");
}catch(Exception e){
System.out.println("出现错误,被除数和除数必须是整数"+"除数不能为零");
e.printStackTrace();
}finally{
System.out.println("感谢使用本程序");
}
}
}
这里我们发现最后面我们加入了一个finally语句, try catch finally,执行的流程大致分为两种情况,第一种是如果try块中所有的语句执行正常,那么finally块中的语句会被执行。第二种,如果try,catch,中的语句碰到异常,无论这种异常能否被catch扑捉到,finally中的语句也要被执行。
在这我们要注意一点:
即使在try块和catch块中存在return语句,finally块中的语句也会被执行,发生的异常时执行的顺序是:执行catch块或者catch中return之前的语句,执行finally中的语句,执行try块,或catch中的return语句退出。Finally块中语句唯一不执行的情况是:在异常处理代码执行System.exit(1),将退出JAVA虚拟机。
多重catch块
一段代码中出现一种异常,也可能出现多种异常,一个try catch,语句只能捕捉到一种异常,我们在try语句后面添加多个catchy语句模块,分别处理不同的异常,但排列的顺序,必须是从子类到父类,最后一个一般都是Exception类,以为按照匹配原则,如果把父类异常放到前面,后面的catch块将得不到执行的机会。
程序运行时,系统会从头到尾分别对每个catch语句处理的异常进行检测,并执行第一个与异常匹配的catch语句。执行其中一个catch语句后,后面的catch语句也都将被忽略。
常见的异常类型都有:
方 法 名 说 明
Exception 异常层次结构的根类
ArithmeticException 算术错误情形,如以零作除数
ArrayIndexOutOfBoundsException 数组下标越界
NullPointerException 尝试访问 null 对象成员
ClassNotFoundException 不能加载所需的类
InputMismatchException 欲得到数据类型与实际输入类型不匹配
IllegalArgumentException 方法接收到非法参数
ClassCastException 对象强制类型转换出错
NumberFormatException 数字格式转换异常,如把"abc"转换成数字
|