接口
接口的基本
定义接口: 使用关键字interface可以定义一个接口,像定义类一样,分为接口声明和接口体
接口声明
//定义一个名为A 的接口
interface A;
接口体
接口体中包含常量的声明和抽象方法两部分,没有变量和普通方法。并且接口体所有常量,抽象方法的访问权限一定都是public(允许省略public、final修饰符)
//定义接口体
interface A{
final int MAX = 100;
public abstract void add();
}
实现接口
接口由类去实现以便使用接口的方法,一个类使用关键字 implement 来声明实现多个接口。
//实现单个接口
class A implement B{}
//实现多个接口
class A implement B, C, D{}
//A类的子类X实现接口
class X extends A implement B, C{}
如果一个非抽象类实现了某个接口,那么这个类必须重写该接口的所有方法。因为接口中的方法都是public abstract修饰的方法,所以这个类在重写接口方法时,不仅要去掉abstract修饰,给出方法体,而且还要明确的用public来修饰(否则就降低了访问权限,这是不允许的),如果一个类实现了某个接口,但是没有重写所有的方法,那么这个类必须是abstract类
如果父类实现了某个接口,那么它的子类也默认实现了这个接口,即不必再用implement来实现
接口可以被继承,即可以通过关键字extends来声明一个接口是另一个接口的子接口,由于接口中的方法和常量都是public,所有子接口会继承父接口的所有方法和变量
接口的理解:
接口只关心操作,并不关心操作的具体实现,即只关心方法的类型、名称、参数,不关心方法的具体行为。
接口回调
接口回调是指: 可以把实现某一个接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类实现的接口方法。实际上,当接口变量调用被类实现的接口方法时,就是通知相应的对象调用该方法了。但是接口无法调用类中其他接口的方法
类似于上转型对象调用子类重写的方法一样
//假设A是一个接口
A a;//声明接口变量a
class B implement A{}//继承A接口的对象B
a = new B(); //将对象引用赋值给接口变量
接口变量做参数
如果一个方法的参数时接口类型,我们就可以将任何实现该接口的类的实例的引用传递给该接口参数,那么接口参数就可以回调类实现的接口方法
abstract类和接口的比较
1. 抽象类和接口都有abstract方法
2. 接口中只可以由常量,而abstract类中既可以有常量也可以有变量
3. abstract类可以有非abstract方法,但是接口不可以
所以在程序设计时,可以分析考虑使用接口还是abstract方法