“接口回调”一词是借用了C语言中指针回调的术语,表示一个变量的地址在某一个时刻存放在一个指针变量中,那么指针变量就可以间接操作该变量中存放的数据。
和类一样,接口也是Java中的一种重要的数据类型,用接口声明的变量称作接口变量.
接口属于引用型变量,在接口变量中可以存放实现该接口的类的实例的引用,即存放对象的引用。
例如,假设Com是一个接口,那么就可以用Com声明一个变量:
Com com;
ImpleCom object = new ImpleCom();
其内存模型如图6.4所示,称此时的com是一个空接口,因为在com变量中还没有存放实现该接口的类的实例(对象)的引用。
例如,将上述object对象的引用赋值给com接口:
com = object;
那么内存模型如图6.6所示
箭头示意接口com变量可以调用类实现的接口方法(这一过程被称为接口回调)。
接口回调非常类似上转型对象调用子类重写的方法。
注:接口无法调用类中的其他非接口方法。
实例代码:
interface ShowMessage{
void showLable(String s);
default void outPutStart(){
System.out.println("****");
}
}
class TV implements ShowMessage{
public void showLable(String s){
System.out.println("**tv**");
System.out.println(s);
System.out.println("**tv**");
}
}
class PC implements ShowMessage{
public void showLable(String s){
System.out.println("**pc**");
System.out.println(s);
System.out.println("**pc**");
}
}
public class E{
public static void main(String[] args) {
ShowMessage sm;
sm=new TV();
sm.showLable("电视");
sm=new PC();
sm.showLable("电脑");
sm.outPutStart();
}
}
结果:
**tv**
电视
**tv**
**pc**
电脑
**pc**
****
函数接口(单接口)
一个接口中有且只有一个abstract方法。
interface Ex{
public abstract int sum(int a,int b);
}
class Ex1 implements Ex{
public int sum(int a ,int b){
return a+b;
}
}
public class E {
public static void main(String[] args) {
Ex e1 = new Ex1 ();
Ex e2 =(a,b)->{
return a+b;
};
System.out.println(e1.sum(1,2));
System.out.println(e2.sum(2, 2));
}
}
结果:
3
4
Lambda表达式
由于lambda过于简化,所以必须有特殊的上下文。因此lambda表达式通常用于单接口中。
Ex e =(a,b)->{
return a+b
};
e.sum(1,2);
定义一个方法,方法的类型是接口类型,就可以将任何实现该接口的实例引用作为形参。通过接口回调, 实现接口的多态。
实例:
interface SpeakHello{
void speakHello();
}
class Chinese implements SpeakHello{
@Override
public void speakHello() {
System.out.println("中国人的问候");
}
}
class English implements SpeakHello{
@Override
public void speakHello() {
System.out.println("英国人的问候");
}
}
class KindHello{
public void lookHello(SpeakHello hello) {
hello.speakHello();
}
}
public class Ex1 {
public static void main(String[] args) {
KindHello a =new KindHello();
Chinese c=new Chinese();
a.lookHello(c);
a.lookHello(new English());
a.lookHello(()->{System.out.println("码农的问候");});
}
}
结果:
中国人的问候
英国人的问候
码农的问候
Original: https://www.cnblogs.com/stblack/p/16637207.html
Author: 司徒小夜
Title: 接口回调与lambda表达式
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/601586/
转载文章受原作者版权保护。转载请注明原作者出处!