接口
理解接口
- 接口和类很相似,分为接口声明和接口体,接口用interface声明
- 接口体只有抽象方法,且访问权限都为public ,static常量
- 抽象方法在声明时允许省略public abstract
(1)接口可以抽象出重要的行为标准,该行为标准用抽象方法来表示。
(2)可以把实现接口的类的对象的引用赋值给接口变量,该接口变量可以调用被该类实现的接口方法,即体现该类根据接口里的行为标准给出的具体行为。
接口与实现
- 接口由类来实现以便使用接口方法,一个类需要在声明中使用implements声明该类实现一个或多个接口。
- 如果一个非抽象类实现了某个接口,那么这个类必须重写这个接口中的所有方法。需要注意的是,由于接口中的方法一定是public abstract方法,所以类在重写接口方法时不仅要去掉 abstract 修饰符、给出方法体,而且方法的访问权限一定要明显地用public来修饰(否则就降低了访问权限,这是不允许的)。实现接口的非抽象类实现了该接口中的方法,即给出了方法的具体行为功能。
- 如果父类实现了某个接口,那么子类也就自然实现了该接口,子类不必再显式地使用关
键字implements声明实现这个接口。
接口的UML图
和类类似
接口回调*
“接口回调”一词是借用了C语言中指针回调的术语,表示一个变量的地址在某一个时刻存放在一个指针变量中,那么指针变量就可以间接操作该变量中存放的数据。
在Java语言中,接口回调是指:可以把实现某一接口的类,创建的对象的引用,赋值给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口方法。实际上,当接口变量调用被类实现的接口方法时,就是通知相应的对象调用这个方法。
我们举个例子:
interface Com{ //声明一个接口
void fun();//这是一个public abstract的方法(public static可省略)
}
class ImpleCom implement Com{ //声明实现接口的类
public static void fun(){ //实现接口的方法(重写)
System.out.println("实现了接口");
}
public void f(){
System.out.println("随便一个方法");
}
}
public class test {
public static void main(String[] args) {
Com com; //cut是接口型变量
ImpleCom object = new ImpleCom; //implement是类创建的对象的引用
com = object; //赋值后,com可调用ImpleCom实现的接口的方法,只能是Com接口的方法
com.fun();//com不能调用f(),因为此方法Com接口没有
输出结果:
接口与多态
接口产生的多态指在接口被多个类以不同实现方式实现的时候,接口变量通过回调可以调用不同的实现方法。
接口参数
如果一个方法的参数是接口类型,我们就可以将任何实现该接口的类的实例的引用传递给该接口参数,那么接口参数就可以回调类实现的接口方法。
不理解?没关系!,看下面例子再来看这个例子:
interface Greet {
public abstract void Greet();
}
class Dog implements Greet {
public void GreetSpeak() {//实现接口
System.out.println("汪汪汪~");
}
}
class Cat implements Greet {
public void GreetSpeak() {//实现接口
System.out.println("喵喵喵~");
}
}
class Meet{
public void Speak(Greet hello) {//声明一个有接口参数的方法,如果括号里是实现接口的类,则回调方法也不同
hello.GreetSpeak();//接口回调
}
}
public class test {
public static void main(String [] args) {
Meet meet = new Meet();
meet.Speak(new Dog());
meet.Speak(new Cat());
}
}
接口参数与接口回调关联性较强