java回调函数和抽象类的区别_通俗地解释回调函数

在以下场景中,假设A要给B发送消息,并且B收到消息后,需要告诉A我事情做完了。如果A不知道B到底有没有做完,就不能进行下一步操作,这时候我们就需要用到回调函数。

/**

* java的回调函数

*

* @author lewic

* @since 2020/4/29 20:29

*/

public class CallbackDemo {

public static void main(String[] args) {

// 测试

ASend aSend = new ASend();

aSend.sendB();

}

}

/**

* 发送方A

*/

class ASend {

/**

* 发送给B消息

*/

public void sendB() {

System.out.println("A send to new B, contain A object");

// 注意!!此处this为回调函数的精髓

new BReceived().receivedA(this);

}

/**

* 告诉我结果

*/

public boolean tellMe(boolean res) {

System.out.println("received result tell A by B");

return res;

}

}

/**

* 接收方B

*/

class BReceived {

private ASend aSend;

/**

* 接收A的请求

*/

public void receivedA(ASend aSend) {

System.out.println("B received A, set aSend");

this.aSend = aSend;

executeMy();

}

/**

* 接收到A请求后,B需要做的事

*/

private void executeMy() {

try {

System.out.println("exec my program");

finallyMy(true);

} catch (Exception e) {

finallyMy(false);

}

}

/**

* 事做完了,回调,通知A做的成功与否

*/

private void finallyMy(boolean res) {

System.out.println("B exec program, tell A result");

aSend.tellMe(res);

}

}

返回结果:

A send tonewB, contain A object

B received A, set aSend

exec my program

B exec program, tell A result

received result tell A by B

Process finished with exit code0

此处,有个不足之处就是,当有多方C,D,E,F等等,都发送给B消息时,总不能在B中设置多个C,D,E,F吧。

此时,我们可以用接口或者抽象类完美解决这个问题。

/*** java的回调函数

*

*@authorlewic

*@since2020/4/29 20:29*/

public classCallbackDemo2 {public static voidmain(String[] args) {//测试

ASend aSend = newASend();

aSend.sendB();

System.out.println();

CSend cSend= newCSend();

cSend.sendB();

}

}interfaceSendCallback {boolean tellMe(booleanres);

}/*** 发送方A*/

class ASend implementsSendCallback{/*** 发送给B消息*/

public voidsendB() {

System.out.println("A send to new B, contain A object");new BReceived().receivedA(this);

}/*** 告诉A结果*/@Overridepublic boolean tellMe(booleanres) {

System.out.println("received result tell A by B");returnres;

}

}/*** 发送方C*/

class CSend implementsSendCallback{/*** 发送给B消息*/

public voidsendB() {

System.out.println("C send to new B, contain C object");new BReceived().receivedA(this);

}/*** 告诉C结果*/@Overridepublic boolean tellMe(booleanres) {

System.out.println("received result tell C by B");returnres;

}

}/*** 接收方B*/

classBReceived {privateSendCallback send;/*** 接收A的请求*/

public voidreceivedA(SendCallback send) {

System.out.println("B received A, set aSend");this.send =send;

executeMy();

}/*** 接收到A请求后,B需要做的事*/

private voidexecuteMy() {try{

System.out.println("exec my program");

finallyMy(true);

}catch(Exception e) {

finallyMy(false);

}

}/*** 事做完了,回调,通知Send做的成功与否*/

private void finallyMy(booleanres) {

System.out.println("B exec program, tell Send result");

send.tellMe(res);

}

}

结果如下:

A send to new B, contain A object

B received A, set aSend

exec my program

B exec program, tell Send result

received result tell A by B

C send to new B, contain C object

B received A, set aSend

exec my program

B exec program, tell Send result

received result tell C by B

Process finished with exit code 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java回调函数是一种在Java中实现事件驱动编程的重要机制。回调函数允许您将一个函数作为参数传递给其他函数,并在需要时调用它。回调函数Java中实现事件驱动编程的重要工具,可以用于处理各种事件,如用户交互、定时器触发、数据读取等。 在Java中,回调函数通常使用接口来实现。接口是一种定义了一组方法的抽象类型,这些方法在实现时可以由任何类来实现。回调函数通常通过实现接口中的方法来实现,并在需要时调用这些方法。 下面是一个简单的回调函数示例: ```java interface Callback { void call(); } public class MyClass { private Callback callback; public void doSomething(Callback callback) { this.callback = callback; // 做一些事情 if (callback != null) { callback.call(); } } } ``` 在上面的示例中,`Callback` 接口定义了一个名为 `call()` 的方法,用于在适当的时候被调用。`MyClass` 类将 `Callback` 接口的实现作为参数传递给 `doSomething()` 方法,并在完成后调用 `call()` 方法。 当您需要使用回调函数时,您可以将一个实现了回调接口的类的实例传递给需要使用回调的方法。该方法将在适当的时候调用回调方法,并将结果传递给该实例的方法或属性。这样,您就可以根据需要执行其他操作或处理回调结果。 使用回调函数可以简化代码并提高代码的可维护性,因为它允许您将复杂的事件处理逻辑封装在单独的方法中,并使用回调函数将其与主程序分离。这使得代码更加清晰和易于理解,并且可以在需要时轻松地扩展和修改代码。 需要注意的是,使用回调函数时需要注意线程安全问题。由于回调函数通常是在其他线程中执行的,因此需要确保在调用回调方法时正确地同步和保护数据,以避免出现并发问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值