一、接口定义
Java接口是一系列方法的声明,是一些抽象的集合
一个接口只有抽象方法没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
简单地说,接口就是特殊的抽象类,即所有方法都是抽象方法的抽象类就是Java中的接口(interface)
1.2 接口的基本格式
[修饰符] interface 接口名 [extends 父接口名列表]{
[public] [static] [final] 常量;
[public] [abstract] 方法;
}
修饰符:可选,用于指定接口的访问权限,可选值为public。即使省略,也依然是public。
接口名:必选参数,用于指定接口的名称,接口名必须是合法的Java标识符。一般情况下,要求首字母大写。
extends 父接口名列表:可选参数,用于指定要定义的接口继承于哪个父接口。当使用extends关键字时,父接口名为必选参数。父接口可以存在多个,用逗号隔开。
方法:接口中的方法只有定义而没有被实现。
1.3 接口的特点
接口是一种特殊的抽象类
接口中没有变量,只能有public static final修饰的静态常量。三个修饰符可以省略。
接口中所有方法都是抽象方法,且默认就是public权限
二、类实现接口的特点
类实现接口,本质上与类继承类相似,区别在于“类最多只能继承一个类,即单继承,而一个类却可以同时实现多个接口”,多个接口用逗号隔开即可。实现类需要覆盖所有接口中的所有抽象方法,否则该类也必须声明为抽象类。
接口是抽象的,接口中没有任何具体方法和变量,所以接口不能进行实例化。接口定义的是多个类都要实现的操作,即“what to do”。类可以实现接口,从而覆盖接口中的方法,实现“how to do”。
2.1 实现接口的基本格式
[修饰符] class <类名> [extends 父类名] [implements 接口列表]{
}
修饰符:可选参数,用于指定类的访问权限,可选值为public、abstract和final。
类名:必选参数,用于指定类的名称,类名必须是合法的Java标识符。一般情况下,要求首字母大写。
extends 父类名:可选参数,用于指定要定义的类继承于哪个父类。当使用extends关键字时,父类名为必选参数。
implements 接口列表:可选参数,用于指定该类实现的是哪些接口。当使用implements关键字时,接口列表为必选参数。当接口列表中存在多个接口名时,各个接口名之间使用逗号分隔。
2.2 接口继承接口
Java接口继承接口的原则
Java接口可以继承多个接口
接口继承接口依然使用关键字extends,不要错用成implements
Java接口继承接口的形式
Interface3 extends Interface0, Interface1, interface……
接口继承与类继承对比:Java类的继承是单一继承,Java接口的继承是多重继承。
接口可实现多继承原因分析
不允许类多重继承的主要原因是,如果A同时继承B和C,而B和C同时有一个D方法,A无法确定该继承那一个。
接口全都是抽象方法继承谁都可以,所以接口可继承多个接口
三、接口与抽象类区别
|
abstract class |
interface |
属性 |
不用限制 |
静态常量 |
构造方法 |
可有可无 |
没有 |
普通方法 |
可以有具体方法 |
必须是抽象方法 |
子类 |
单一继承 |
多重实现 |
abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface.
在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是 static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
接口中的方法默认都是 public,abstract 类型的。、
3.1面向接口编程
面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分。
或者说,它是面向对象编程体系中的思想精髓之一。
面向接口编程的意思是指在面向对象的系统中所有的类或者模块之间的交互是由接口完成的。
Comparable接口中定义了比较方法,compareTo,返回值为int(忽略泛型,后续学习)
当int值为正数,表示大于;为负数,表示小于;为0,表示等于
API中很多类实现了该接口,很多方法借助该接口
通过使用Arrays.sort(Object[])方法,理解该接口的作用,进一步理解接口的作用
四、异常概念
错误是无法控制的,程序肯定要中断。
4.1 异常是指程序运行的过程中,发生某些意外的事情,比如10除以0, 文件不存在等。
错误是很难处理的,比如内存溢出等,不能够通过异常处理机制来解决。异常是不正常的事件,不是错误。异常是程序中发生的不正常事件流,通过处理程序依然可以运行下去。
4.2 Throwable类有两个直接子类:Exception类、Error类。
4.3 异常分为运行期异常和编译期异常两种
运行期异常:程序运行时抛除的异常,所有RuntimeException的子类都是运行期异常
数学异常
空指针异常
数组下标越界
……
编译期异常(Checked Exception):除去运行期的异常都是编译期异常,也称为检测异常
IOException
SQLException
1. try
检测不安全的代码块(发现异常)
try块中任何一条语句发生了异常,下面的代码将不会被执行,程序将跳转到异常处理代码块中,即catch块。因此,不要随意将不相关的代码放到try块中,因为随时可能会中断执行。
2. catch
把抓到的类型匹配的异常捕获,保证程序能继续运行下去
catch语句必须紧跟着try语句之后,称为捕获异常,也就是异常处理函数,一个try后面可以写多个catch,分别捕获不同类型的异常,要从子类往父类的顺序写,否则有编译错误。
3. finally
finally该内容总是会执行的,只能有一个finally语句
4. 基本语法
try{
可能会发生异常的代码
}catch(异常类型 引用名){
异常处理代码
}finally{
必须执行代码
}
5.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
finally 永远执行
6.throw
关键字throw用于显式抛出异常
抛除异常后处理
使用try-catch捕获异常
使用throws声明异常
语法
throw new 异常类构造方法;
例如:throw new Exception();
7.throws
用于方法声明处,指出方法引发的异常。
可以声明多种异常类型,用逗号分开即可。
示例
public void test throws 异常1,异常2,异常3{
}
8.throw用于方法体中,用来抛出一个实际的异常对象,使用throw后,要么使用try catch捕获异常,要么使用throws声明异常
throws用于方法声明处,用来声明该方法可能发生的异常类型,可以是多个异常类型,用来强制调用该方法时处理这些异常
抽象方法也可以使用throws,所以说并不是有throw才有throws
如果使用throw关键字抛异常,一定不要使用Exception,不能很好标记异常类型
如果throw要抛出与业务逻辑有关的异常,需要使用自定义异常类,后续学习
9自定义异常就是自己定义的异常类,也就是API中的标准异常类的直接或间接的子类
作用:用自定义异常标记业务逻辑的异常,避免与标准异常混淆。
基本语法
public class 异常类名 extends Exception{
public 异常类名(String msg){
super(msg);
}
}
自定义异常类中往往不写其他方法,只重载需要使用的构造方法
10在程序中使用自定义异常大致可以分为以下几步
创建自定义异常类
在方法中通过throw 关键字抛出自定义异常
如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理,否则在方法的声明处通过throws关键字声明该异常
调用throws声明该异常的方法时,使用try catch捕获自定义的异常类型,并在catch中进行处理。