JAVA中的回调函数

发布时间:2023年12月29日

回调函数的基本概念:

回调函数是一种常见的编程模式,也称为回调机制。回调函数是一种特殊的函数,它允许将一段代码作为参数传递给另一个方法,并在需要时调用。回调函数通常用于异步编程或事件处理,可以将程序的控制权转移到回调函数上,以便在特定事件发生时执行相关的操作。

基本概念:
1. 回调:指被传入到另一个函数的函数。
2. 异步编程:指在代码执行时不会阻塞程序运行的方式。
3. 事件驱动:指程序的执行是由外部事件触发而不是顺序执行的方式。

在这里插入图片描述

回调函数的作用和使用场景

回调函数是一种常见的编程技术,它可以在异步操作完成后调用一个预定义的函数来处理结果。回调函数通常用于处理事件、执行异步操作或响应用户输入等场景。

回调函数的作用是将代码逻辑分离出来,使得代码更加模块化和可维护。使用回调函数可以避免阻塞程序的运行,提高程序的性能和效率。另外,回调函数还可以实现代码的复用,因为它们可以被多个地方调用。

回调函数的使用场景包括:

事件处理:回调函数可以用于处理各种事件,例如鼠标点击、键盘输入、网络请求等。

异步操作:回调函数可以用于异步操作,例如读取文件、发送邮件、下载文件等。

数据处理:回调函数可以用于处理数据,例如对数组进行排序、过滤、映射等。

插件开发:回调函数可以用于开发插件,例如 WordPress 插件、jQuery 插件等。

回调函数是一种非常灵活和强大的编程技术,可以让我们更好地处理各种异步操作和事件。

JAVA中的回调函数

在Java中,回调函数通常通过接口来实现。具体步骤如下:

1. 定义一个接口,其中声明回调方法。这个方法的参数和返回类型取决于你的需求。

2. 编写包含回调函数的方法,并将接口作为参数传递进去。这样,该方法就知道在需要时调用哪个回调方法。

3. 创建实现接口的类,并实现回调方法。

4. 在主程序中,实例化回调接口的实现类,并将其作为参数传递给包含回调函数的方法。

5. 第三步和第四步通常使用匿名内部类和匿名对象或者匿名函数/lambda表达式

在 Java 中,回调函数通常通过接口(interface)的方式实现。

一个接口可以定义一个或多个回调函数,这些回调函数由实现接口的类来实现。

当某个事件触发时,调用方可以通过接口中的方法调用回调函数,从而实现相应的处理逻辑。

匿名函数/lambda表达式

内部类:
将一个类的定义写在另一个类的内部,形成了类之间的嵌套定义内部类分为两种:

  1. 成员内部类【了解】 2.局部内部类【重点】
  • 内部类本质上也是一个类,只是定义在一个外部类的里面
  • 匿名内部类属于局部内部类的一种变形【特殊情况】
  • 和局部变量一样,局部内部类定义时不能加访问权限修饰
  • 局部内部类只能被定义的当前方法使用
  • 在局部内部类的方法中可以访问外部的属性或者定义的当前方法的局部变量
    如果内部类的属性和外部类发生冲突,按照就近原则优先访问内部类的,如果非要访问外部类的属性需要在属性名前面加上外部类名.this.属性名

注意:在内部类的方法中可以访问当前定义所在的方法中的局部变量,但是不允许修改

int[] array = new int[5];
class MyComparator implements Comparator{
	@Override
	public int compare(Integer i, Integer j){
		return i - j;
	}
}
Arrays.sort(array, new MyComparator());

匿名内部类:

  1. 在内部类中都是先定义实现类再写创建类的对象,与内部类不同的是匿名内部类无需定义实现类
  2. 总所周知,接口和抽象类无法创建对象,通过new 接口名(){@Override}的方式并不是通过接口创建对象,而是创建的是该接口的实现类对象,只不过该实现类的名称没有被显式定义
  3. 通过new 接口名(){@Override}的方式创建一个匿名的实现类;匿名内部类不在乎实现类的名字,它只在乎该对象是否为对应接口类型的对象
  4. new 接口名(){@Override}的方式本质上创建的是该接口的实现类对象,类的定义这一块由编译器完成了
匿名内部类语法:
new 接口名(){
	//对接口中方法的实现
}
==============================================================================================================
int[] array = new int[5];
Comparator comparator = new Comparator(){ //这句话里面既包含了一个没有名字的类的定义,又包含了对这个接口的实现类对象的创建,new Comparator()这个就叫做匿名内部类。
	@Override
	public int compare(Integer i, Integer j){
		return i - j;
	}
}
Arrays.sort(array, comparator );

匿名函数/lambda表达式

int[] array = new int[5];
Arrays.sort(array, new Comparator<Integer>(){ //这句话里面既包含了一个没有名字的类的定义,又包含了对这个接口的实现类对象的创建
	@Override
	public int compare(Integer i, Integer j){
		return i - j;
	}
}
lambda表达式
int[] array = new int[5];
Arrays.sort(array, () => {
	@Override
	public int compare(Integer i, Integer j){
		return i - j;
	}
}
文章来源:https://blog.csdn.net/qq_44861126/article/details/135237672
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。