日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java函数回调

發布時間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java函数回调 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、本質

函數回調本質就是:通過傳遞引用來調用引用指定對象的方法,回調方法一定涉及兩個類,通過方法參數接收另外一個類的引用來調用另外一個類的方法,其實就是一個函數的參數是某個接口的實現類

二、代碼直接解釋

  • 基礎需求,讓室友幫忙寫作業
  • 代碼
  • public class RoomMate {public String getAnswer(String homework) {if("1+1=?".equals(homework)) {return "2";} else {return null;}}public void getAnswer(String homework, Student student) {if("1+1=?".equals(homework)) {student.doHomeWork(homework, "2");} else {student.doHomeWork(homework, "(空白)");}}public void getAnswer(String homework, Work work) {if("1+1=?".equals(homework)) {work.doHomeWork(homework,"2");} else {work.doHomeWork(homework,"(空白)");}}public void getAnswerMyWork(String homework, Work work) {System.out.println("question is "+homework);work.doHomeWorkWithoutParam();}public void askDifficult(String homework, Work work) {System.out.println("question is "+homework);work.doHomeWorkWithoutParam();} } public interface Work {default void doHomeWork(String question, String answer){}default void doHomeWorkWithoutParam(){}; } public class WorkImpl implements Work{@Overridepublic void doHomeWork(String question,String answer) {if(question != null) {System.out.println("作業:"+question+" 答案:"+ 2);} else {System.out.println("作業:"+question+" 答案:"+ "(空白)");}} } public class Student{public void doHomeWork(String homeWork, String answer) {System.out.println("student.doHomeWork");System.out.println("作業:" + homeWork + " 答案:" + Objects.requireNonNullElse(answer, "(空白)"));}private static void goHome() {System.out.println("我先回家");}public static void main(String[] args) throws InterruptedException {Student student = new Student();String aHomeWork = "1+1=?";RoomMate roomMate = new RoomMate();String theAnswer = roomMate.getAnswer(aHomeWork);//1.這里并沒有體現回調,只是別人將答案給你,你自己在抄上去student.doHomeWork(aHomeWork, theAnswer);//2.于是室友說,那你在調用getAnswer方法的時候,//除了傳入作業,也把自己的引用放里面。這樣我做完了,直接調用你的做作業方法就行了。這里其實已經體現了回調的意思。roomMate.getAnswer(aHomeWork,student);//3.基于對象的回調方式,不僅將回調的方法暴露了,也將其他不回調的方法暴露了,不安全,于是,基于接口回調的方式出現了// 因為是以接口作為參數類型的約定,在普通對象upcast向上轉型之后將只暴露接口描述的那個方法,別人獲取到這個引用,也只能使用這個(回調)方法。// 至此,遺留的重大安全隱患重要解決。WorkImpl workImpl= new WorkImpl();roomMate.getAnswer(aHomeWork, workImpl);//4.到目前為止,實現類Work接口的類,都可以傳給roommate進行回調,于是乎,即使是匿名內部類(傳遞的仍然是引用),只要實現了接口方法,依然可以調用roomMate.getAnswerMyWork(aHomeWork, new Work() {//這個方法隨意發揮了,無需再寫一個接口實現類去實現方法@Overridepublic void doHomeWorkWithoutParam() {if (aHomeWork!=null){System.out.println("answer is 2");}}});//5.但是回調方法的優勢是異步回調,這樣是其最被廣為使用的原因。// 為了體現異步的意思,我們給好室友設置了個較難的問題,希望好室友能多好點時間思考。String hardHomework = "當x趨向于0,sin(x)/x =?";// 新開的線程純粹用來等待好室友來寫完作用。由于在好室友類中設置了3秒的等待時間,所以可以看到goHome方法將先執行。// 意味著該學生在告知好室友做作用后,就可以做自己的事情去了,不需要同步阻塞去等待結果。// 一旦好室友完成作業,寫入作業本,該現場也就結束運行了。new Thread(() -> roomMate.askDifficult(hardHomework, new Work() {@Overridepublic void doHomeWorkWithoutParam() {if ("1+1=?".equals(hardHomework)) {System.out.println("作業:" + hardHomework + " 答案:" + 2);} else if ("當x趨向于0,sin(x)/x =?".equals(hardHomework)) {System.out.print("思考:");for (int i = 1; i <= 3; i++) {System.out.print(i + "秒 ");try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println();System.out.println("作業:" + hardHomework + " 答案:" + 1);} else {System.out.println("作業:" + hardHomework + " 答案:" + "(空白)");}}})).start();goHome();} }

    參考文章

    總結

    以上是生活随笔為你收集整理的java函数回调的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。