一.接口
使用关键字interface来定义一个接口,接口的定义和类的定义很相似,分为接口声明和接口体
1.接口声明
interface 接口名字
2.接口体
接口体中包含常量(使用final关键字修饰的变量)的定义和抽象方法的定义。
接口中所有常量的访问权限必须是public,而且是static常量,允许省略public、final、static修饰符。为什么接口中的变量都必须是public权限的静态常量呢?原因如下
- 声明为public是因为接口作为一种抽象“协议”需要被其他类实现,实现类应当能够继承接口中的变量
- 声明为static是因为接口可以多实现,如果一个类实现了多个接口,假如这些接口中都有一个变量a,那么在这个实现类中如何区分这些继承而来的同名变量?如果加上static关键字,就可以通过接口名.变量名来进行区分。
- 声明为final是因为接口代表着一种标准,标准自然不能随便修改,即对修改关闭
Java 8以前,接口中的方法必须是抽象方法,不能有普通方法,且抽象方法的访问权限一定是public,同样也允许省略public、abstract修饰符。实现接口的非抽象类必须重写接口中的所有抽象方法,在重写接口方法,方法的访问权限必须显式地声明为public权限,否则就降低了访问权限,这是不允许的。
一个接口定义的例子如下:
interface Printable{
int MAX = 100; //该语句相当于public final static int MAX 100
void add();//该语句相当于public abstract void add()
}
在Java 8中,允许在接口中增加静态方法,同时静态方法要有默认实现,不能没有方法体。实例如下:
public interface Service{
public static int testMethod(int i){
return i;
}
}
二.抽象类
用关键字abstract修饰的类称为抽象类
和普通类相比,抽象类的特点是可以包含抽象方法,即用abstract关键字修饰的方法,抽象方法只允许声明,不允许实现,而且不允许使用final和abstract同时修饰一个方法或类,这是因为抽象类的子类需要重写其抽象方法,如果抽象类被final修饰,那么它无法被继承,同样如果抽象方法被final修饰,子类则无法重写其抽象方法,也不允许使用static修饰abstract方法,即abstract方法必须是实例方法。
三.接口与抽象类的区别
- 接口中只可以有常量,不可以有变量;而抽象类中既可以有常量,也可以有变量
- 接口中不可以有非抽象方法,抽象类中可以有非抽象方法
- 抽象类可以有构造方法,接口中不能有构造方法