zl程序教程

您现在的位置是:首页 >  Java

当前栏目

接口回调与lambda表达式

2023-03-31 10:55:01 时间

接口回调

“接口回调”一词是借用了C语言中指针回调的术语,表示一个变量的地址在某一个时刻存放在一个指针变量中,那么指针变量就可以间接操作该变量中存放的数据。

和类一样,接口也是Java中的一种重要的数据类型,用接口声明的变量称作接口变量.

接口属于引用型变量,在接口变量中可以存放实现该接口的类的实例的引用,即存放对象的引用。

例如,假设Com是一个接口,那么就可以用Com声明一个变量:

Com com;
ImpleCom object = new ImpleCom();

其内存模型如图6.4所示,称此时的com是一个空接口,因为在com变量中还没有存放实现该接口的类的实例(对象)的引用。
假设ImpleCom类是实现Com接口的类,用ImpleCom创建名字为object的对象,那么object对象不仅可以调用ImpleCom类中原有的方法,而且可以调用ImpleCom类实现的接口方法,如图6.5所示。在这里插入图片描述

例如,将上述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;// 1.声明接口变量
        sm=new TV();  //2. 上转型对象
        sm.showLable("电视");//3. 接口回调 调用的是实现接口的类的方法
        sm=new PC();
        sm.showLable("电脑");
        sm.outPutStart();
	}

}



结果:
**tv**
电视
**tv**
**pc**
电脑
**pc**
****

Lambda表达式

函数接口(单接口)

一个接口中有且只有一个abstract方法。

interface Ex{
	public abstract int sum(int a,int b);
}
//Ex1 继承 ex接口
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;
		};//使用lambda 实现sum方法并创建继承Ex接口的子类对象
		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
};//实现sum方法并创建继承Ex接口的子类对象
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类 调用lookHello方法
		KindHello a =new KindHello();
		//第一种回调接口的方法
		Chinese c=new Chinese();
		a.lookHello(c);
		//第二种回调接口的方法
		a.lookHello(new English());
		//第三种回调接口的方法 不用单独新建继承接口的类,使用lambda新建匿名内部类
		a.lookHello(()->{System.out.println("码农的问候");});
		
				
	}

}

结果:
中国人的问候
英国人的问候
码农的问候

进阶见:https://blog.csdn.net/qq_43530326/article/details/123801170?spm=1001.2014.3001.5501