接口调回
和类一样,接口也是Java中一种重要的数据类型,用接口声明的变量称作接口变量。那么接口变量中可以存放怎么样的数据呢?
接口属于引用型变量,接口变量中可以存放实现该接口的类的实例的引用,即存放对象的引用。比如,假设Com是一个接口,那么就可以用Com声明一个变量:
Com com;
内存模型如图所示,称此时的com是一个空接口,因为com变量中还没有存放实现该接口的类的实例(对象)的引用。
假设ImpleCom类是实现Com接口的类,用ImpleCom创建名字为object的对象,那么object对象不仅可以调用ImpleCom类中原有的方法,而且也可以调用ImpleCom类实现的接口方法,如图所示。
ImpleCom object=new ImpleCom();
“接口回调”一词是借用了C语言中指针回调的术语,表示一个表示一个变量的地址在某一个时刻存放在一个指针变量中,那么指针变量就可以间接操作该变量中存放的数据。
在Java语言中,接口回调是指:可以把某一接口的类创建的对象的引用赋值给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口方法。实际上,当接口变量调用被类实现的接口方法时,就是通知相应的对象调用这个方法。
例如,将上述object对象的引用赋值给com接口:
com=object;
那么内存模型如图所示,箭头示意接口com变量可以调用类实现的接口方法(这一过程被称为接口回调)。
接口回调非常类似于上转型对象调用子类重写的方法。
注:接口无法调用类中的其他的非接口方法。
下面的例子使用了接口的回调技术。
public class KY2_1 {
public static void main(String args[]) {
ShowMessage sm;
sm=new TV();
sm.显示商标("长城牌电视机");
sm=new PC();
sm.显示商标("联想奔月5008PC机");
}
}
interface ShowMessage{
void 显示商标(String s);
}
class TV implements ShowMessage{
public void 显示商标(String s){
System.out.println(s);
}
}
class PC implements ShowMessage{
public void 显示商标(String s){
System.out.println(s);
}
}