一、接口
1、接口定义
接口是一系列方法的声明,是一些抽象的集合;
接口只有抽象方法没有方法的实现,且默认就是public权限;
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念;
类描述对象的属性和方法,接口则包含类要实现的方法;
接口就是特殊的抽象类,即所有方法都是抽象方法的抽象类就是Java中的接口(interface);
接口无法被实例化,但是可以被实现。
2、接口的基本格式
【修饰符】interface 接口名 【extends 父接口名列表】
【public】【static】【final】常量;
【public】【abstract】方法;
接口名必选参数,用于指定接口的名称,接口名必须是合法的Java标识符。一般情况下,要求首字母大写;
接口中没有变量,只能有public static final修饰的静态常量。三个修饰符可以省略;
二、类接口的实现
1、特点
类最多只能继承一个类,即单继承,而一个类却可以同时实现多个接口,实现类需要覆盖所有接口中的所有抽象方法,否则该类也必须声明为抽象类。
接口是抽象的,接口中没有任何具体方法和变量,所以接口不能进行实例化;
类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。
2、实现接口的基本格式
[修饰符] class <类名> [extends 父类名] [implements 接口列表]{ }
implements 接口列表:可选参数,用于指定该类实现的是哪些接口。当使用implements关键字时,接口列表为必选参数。当接口列表中存在多个接口名时,各个接口名之间使用逗号分隔。
3、重写接口中声明的方法时,需要注意以下规则:
- 类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常。
- 类在重写方法时要保持一致的方法名,并且应该保持相同或者相兼容的返回值类型。
- 如果实现接口的类是抽象类,那么就没必要实现该接口的方法。
4、在实现接口的时候,也要注意一些规则:
- 一个类可以同时实现多个接口。
- 一个类只能继承一个类(单继承),但是能实现多个接口(多重继承)。
- 一个接口能继承另一个接口,这和类之间的继承比较相似使用关键字extends,不要错用成implements。
例如: Interface3 extends ,Interface0, Interface1, interface……
三、接口与抽象类的区别
对比图:
|
Abstract class |
Interface |
属性 |
不用限制 |
静态常量 |
构造方法 |
可有可无 |
没有 |
普通方法 |
可以有具体方法 |
必须是抽象方法 |
子类 |
单一继承 |
多重实现 |
1、抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行;
2、 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的;
3、接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法;
4、一个类只能继承一个抽象类,而一个类却可以实现多个接口。
四、面向接口编程
1、接口是设计层面的概念,往往由设计师设计,将定义与实现分离
程序员实现接口,实现具体方法
常见的类设计结构:
接口
子接口 抽象类
具体类
2、面向接口编程
面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分;
或者说,它是面向对象编程体系中的思想精髓之一;
面向接口编程的意思是指在面向对象的系统中所有的类或者模块之间的交互是由接口完成的。
总结:
1.接口可以多继承
2.接口的方法声明必须是 public abstract 即便不写默认也是
3.接口里面不能包含方法具体实现
4.类实继承接口必须实现接口里申明的全部方法,除非该类是抽象类
5.类里面可以声明 public static final 修饰的变量
6.接口不能被实例化,但是可以被实现类创建
五、异常处理
1、异常概念
异常是不正常的事件,不是错误;
异常是指程序运行的过程中,发生某些意外的事情,比如10除以0, 文件不存在等
2、错误
错误是很难处理的,比如内存溢出等,不能够通过异常处理机制来解决;
异常是程序中发生的不正常事件流,通过处理程序依然可以运行下去。但是错误是无法控制的,程序肯定要中断.
3、异常体系
Throwable类有两个直接子类:Exception类、Error类。
Error表示错误,可能是编译期错误或者系统错误,往往程序中并不处理。
Exception表示异常,是所有异常类的父类,是程序员所关心的。
4、异常种类
异常分为运行期异常和编译期异常两种
运行期异常:程序运行时抛除的异常,所有RuntimeException的子类都是运行期异常
-数学异常
-空指针异常
-数组下标越界
-................
编译期异常(Checked Exception):除去运行期的异常都是编译期异常,也称为检测异常
-IOException
-SQLException
-...............
六、捕获异常
1、使用 try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方。
try/catch代码块中的代码称为保护代码,使用 try/catch 的语法如下:
try{
可能会发生异常的代码
}catch(异常类型 引用名){
异常处理代码
}finally{
必须执行代码
}
运行流程(无异常情况)
try{
System.out.println("try");
}catch(Exception e) {
System.out.println("Exception");
} finally{
System.out.println("Finally");
}
运行流程(有异常情况)
try{
String demo = null; demo.split("a");
System.out.println("try");
}catch(Exception e) {
System.out.println("Exception");
e.printStackTrace();
} finally{
System.out.println("Finally");
}
2、finally与return
在try中没有异常的情况下try、catch、finally的执行顺序 try --- finally;
如果try中有异常,执行顺序是try --- catch --- finally;
如果try中没有异常并且try中有return这时候正常执行顺序是try ---- finally --- return;
如果try中有异常并且try中有return这时候正常执行顺序是try----catch---finally--- return;
如果try有异常,相应catch中有return,顺序是try---catch---finally---return。
七、抛出异常
throw关键字
1、 --关键字throw用于显式抛出异常
--抛除异常后处理
--使用try-catch捕获异常
--使用throws声明异常
语法
throw new 异常类构造方法;
例如:throw new Exception();
2、用于方法声明处,指出方法引发的异常。
可以声明多种异常类型,用逗号分开即可。
示例 public void test throws 异常1,异常2,异常3{ }
3、层层抛出异常
catch语句中,处理异常后,再次用throw抛出该异常对象
继续抛出异常的作用:使得调用该方法的方法,能够再一次捕获并处理异常
4、总结
--throw用于方法体中,用来抛出一个实际的异常对象,使用throw后,要么使用try catch捕获异常,要么使用throws声明异常;
--throws用于方法声明处,用来声明该方法可能发生的异常类型,可以是多个异常类型,用来强制调用该方法时处理这些异常;
--抽象方法也可以使用throws,所以说并不是有throw才有throws;
--如果使用throw关键字抛异常,一定不要使用Exception,不能很好标记异常类型;
--如果throw要抛出与业务逻辑有关的异常,需要使用自定义异常类,后续学习。
八、自定义异常
1、自定义异常就是自己定义的异常类,也就是API中的标准异常类的直接或间接的子类
作用:用自定义异常标记业务逻辑的异常,避免与标准异常混淆
基本语法 public class 异常类名 extends Exception{
public 异常类名(String msg){
super(msg);
}
}
自定义异常类中往往不写其他方法,只重载需要使用的构造方法。
2、在程序中使用自定义异常大致可以分为以下几步
--创建自定义异常类;
--在方法中通过throw 关键字抛出自定义异常;
--如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理,否则在方法的声明处通过throws关键字声明该异常;
--调用throws声明该异常的方法时,使用try catch捕获自定义的异常类型,并在catch中进行处理。
|