序文
コールバックはコールバックを意味します。 Windowsプログラミングに精通している人は、「コールバック関数」という4つの単語に精通している必要がありますが、Javaプログラマーはそれについてあまり知らないかもしれません。 「コールバック関数」または「コールバックメソッド」は、ソフトウェアの設計と開発において非常に重要な概念です。プログラマーには非常に必要です(どの言語に関係なく)。
最近、私はJavaを学び、コールバックメカニズム(コールバック)と接触しました。私が最初に会ったとき、私はかなり混乱したと感じました、そして、私がオンラインで検索した関連する説明は、まるでコールバックを定義したかのように言及されたか、単純に言ったかのどちらかでした。もちろん、コールバックを理解した後、私はさまざまな説明をオンラインで読みに行きましたが、問題はありませんでした。しかし、初心者である私にとっては、漸進的なプロセスがありません。ここでは、浅いものから深いものへの順序でのコールバックメカニズムについての私の個人的な理解について説明します。不適切なものがあれば、私はあなたにアドバイスを与えることを願っています!
開始する前に、シナリオを想像してください。幼稚園の子供たちは10以内に追加を学んだばかりです。
第1章。物語の起源
幼稚園の先生は、ブラックボードに「1 + 1 =」という式を書きました。シャオ・ミンは空白を埋めました。
10未満の追加を学んだので、Xiao Mingはこの質問を完全に自分で計算できます。プロセスをシミュレートするコードは次のとおりです。
パブリッククラスの学生{private string name = null; public student(string name){// todo auto-fenated constructor stubthis.name.name = name;} public void name(this.name = name;} private int calcadd(int a、int b){return a + b;} public fillblank(int a b); system.out.println(name + "Mental Arithmetic:" + a + " +" + b + "=" + result);}} Xiao Mingが空白を埋めていたとき、彼はクラカドを直接計算し、結果が2であることを発見し、結果をスペースに書きました。テストコードは次のとおりです。
public class test {public static void main(string [] args){int a =; int b =; sustent s = new Student( "xiao ming"); s.fillblank(a、b);}}}操作結果は次のとおりです。
Xiao Mingの精神的算術:1 + 1 = 2
このプロセスは、学生クラスのみのインスタンスオブジェクトによって完全に行われ、コールバックメカニズムは含まれません。
第2章。幼稚園の教師のトラブルの検索
休憩中、幼稚園の先生は突然気まぐれになり、「168 + 291 =」を黒板に書いて、Xiao Mingにそれを完成させ、その後オフィスに戻りました。
フラワー摩擦!なぜすべての教師がXiao Mingと仲良くできないのですか?それは明らかにルールを超えていますねこの時点で、Xiao Mingは明らかに上記のような精神的算術によってそれを完了できませんでした。彼が混乱したとき、クラスのXiao Hongは、追加を計算できる計算機(利益者)を渡しました! ! ! ! Xiao Mingはたまたま計算機の使用方法を知っていたので、彼は計算機を介して結果を計算し、fill-in-the-Blanksを完了しました。
計算機のコードは次のとおりです。
パブリッククラス計算機{public int add(int a、int b){return a + b;}}学生クラスを変更し、計算機を使用する方法を追加します。
パブリッククラスの学生{private string name = null; public student(string name){// todo auto-fenated constructor stubthis.name.name = name;} public void setname(this.name = name;}@suppresswarnings( "unused")private int calcadd(int b){return a a + b; int b;} private int b;} calculator()。add(a、b);} public void fillblank(int a、int b){int result = usecalculator(a、b); system.out.println(name + "calculator:" + a + " +" + b + "=" + result);}}}}テストコードは次のとおりです。
public class test {public static void main(string [] args){int a =; int b =; sustent s = new Student( "xiao ming"); s.fillblank(a、b);}}}操作結果は次のとおりです。
Xiao Mingは計算機を使用します:168 + 291 = 459
コールバックメカニズムはこのプロセスに関与していませんが、Xiao Mingの作業の一部が転送され、計算機によって支援されます。
3.幼稚園の先生が戻ってきました
Xiao Mingが3桁の追加を完了したことがわかったとき、教師はXiao Mingが非常に賢く、順応性のある才能があると考えました。そこで彼は、「26549 + 16487 =」を黒板に書き、Xiao Mingに授業の前に埋め立てを完了するように頼み、その後オフィスに戻りました。
Xiao Mingは、教室の外で楽しんでいて、悲しみを感じずにはいられなかった小さな友人を見ました。あなたがプレイに出かけなければ、この休憩は台無しになります! ! ! ! Xiaohongが再び引き渡した計算機を見ると、Xiao Mingは計画を思いつきました。Xiaohongに彼のためにそれをさせてください。
Xiao Mingは、質問は「26549 + 16487 =」であるとXiaohongに語り、結果を埋めるために特定の場所を指摘し、それから楽しんで出かけました。
ここでは、Xiaohongだけを実装するのではなく、追加とXiaohong全体を計算できるこの計算機を、結果を計算してブランクを埋めることができるスーパー計算機を考慮してください。このスーパー計算機が合格する必要があるパラメーターは、ブランクを埋めるための2つの追加とポジションであり、これらの内容は事前に通知する必要があります。つまり、Xiao Mingは彼の方法の一部をXiao Hongにさらしたいと考えています。最も簡単な方法は、Xiao Hongに彼の参照と2つの追加を一緒に伝えることです。
したがって、スーパーコルシュレーターのADDメソッドには2つのオペランドとXiao Ming自体への参照が含まれている必要があります。コードは次のとおりです。
public class supercalculator {public void add(int a、int b、desute xiaoming){int result = a + b; xiaoming.fillblank(a、b、result);}}} Xiao Mingはもはや精神的な算術や計算機を必要としないため、Xiaohongに助けを求める方法を持っているだけです。コードは次のとおりです。
パブリッククラスの学生{private string name = null; public student(string name){// todo auto-fenated constructor stubthis.name.name = name;} public void setname(this.name = name;} public void callhelp(int a、int b){new supercalcorator( result){System.out.println(name + "Xiaohong計算を求める:" + a + " +" + b + "=" + results);}}テストコードは次のとおりです。
public class test {public static void main(string [] args){int a =; int b =; sustent s = new Student( "xiao ming"); s.callhelp(a、b);}}}実行中の結果は次のとおりです。
Xiao MingはXiaohongを計算するのに助けを求めました:26549 + 16487 = 43036
実行プロセスは次のとおりです。XiaoMingは、彼自身のCallHelpメソッドを介してXiaohong(新しいSuperCalculator())のADDメソッドを呼び出し、呼び出すときに彼自身の参照を参照します。
(これ)パラメーターとして渡します。 Xiaohongが計算機を使用して結果を取得した後、彼はXiao MingのFillblankメソッドを呼び出し、ブラックボードのスペースで結果を埋めました。
ライトとライト!この時点で、コールバック関数が正式にデビューしました。 Xiao MingのFillBlankメソッドは、頻繁にコールバック関数です。
このようにして、Xiao Mingが追加が完了するまで待つ必要がなく、結果が彼が友人と楽しむことができるようになる前にブラックボードで満たされる必要がなくなったことが明確にわかります。空白の作業は、スーパー計算機であるXiaohongによって行われます。コールバックの利点が反映され始めました。
第4章。ドアの義理の母
幼稚園の入り口に白髪の老婦人がいます。彼女は、風や雨に関係なく、毎日ほとんど期限切れになっているジャンクフードを販売する街路屋を設置しました。私は年をとっているので、私の心は少し混乱しており、稼いだお金の量をよく理解することはできません。ある日、彼女はシャオホンの助けを借りて幼稚園の教師と幼稚園の教師とどのように戦ったかについて、Xiao Mingの自慢を誤って聞いた。そこで、私の義理の母は、リトルレッドカードスーパー計算機を彼女の小さなヘルパーにし、報酬としてワイロングスパイシーなストリップのパックを提供することを決めました。 Xiaohongは誘惑に抵抗することができず、同意しました。
前の章のコードを振り返ると、リトルレッドカードスーパー計算機のADDメソッドに必要なパラメーターは2つの整数変数と学生オブジェクトであることがわかりましたが、老婦人は学生ではなく、小さなベンダーであるため、ここで修正を行う必要があります。この場合、相続と多型を考えるのは当然です。学生のXiao Mingと老婦人のベンダーに親クラスから継承するように依頼する場合、親クラスへの参照をリトルレッドカードスーパー計算機に渡すだけです。
ただし、実際に使用して、Javaの単一の継承を考慮して、他の人にあまりにも多くの自分自身をさらしたくないことを考慮して、インターフェイスから継承する方法を使用して内部クラスと協力します。
言い換えれば、Xiaohongは、将来クラスの子どもたちに計算サービスを提供し続け、同時に老婦人に会計サービスを提供し、将来他の人々のビジネスを拡大することを望んでいます。そのため、彼女はすべての顧客に、統一された処理の方法、つまり必要なオペランドと計算を完了した後の方法に同意しました。 Xiaohongはこの統一された方法をインターフェイスにし、すべての人に提供します。コードは次のとおりです。
パブリックインターフェイスdojob {public void fillblank(int a、int b、int result);}インスピレーションはXiao Mingが空白を埋めるのを手伝うことから来たので、Xiaohongは彼女の元の意図を保持し、すべてのビジネスをFillblankとして扱いました。
同時に、Xiaohongは計算機を変更して、Dojobインターフェイスを同時に実装するさまざまな人を処理できるようにしました。コードは次のとおりです。
Public Class SuperCalculator {public void add(int a、int b、dojob customer){int result = a + b; customer.fillblank(a、b、result);}}} Xiao Mingと老婦人がこのインターフェイスを実装している限り、このインターフェイスを取得した後、Xiaohongに統一モデルで結果を処理する方法を伝えることと、前述のように内部クラスを使用することに相当します。コードは次のとおりです。
Xiao Ming's:
パブリッククラスの学生{private string name = null; public student(string name){// todo auto-funated constructors stubthis.name.name = name;} public void setname(string name){this.name = name;} public class dohomework implements dojob {@overridepublic void fillblank(int a int a、int a、int b、auto gento auto auto stubsystem.out.println(name + "Xiaohong計算を求める:" + a + " +" + b + " +" + results);}} public void callhelp(int a、int b){new supercalculator()。老婦人:
パブリッククラスの売り手{プライベート文字列名= null; public seller(string name){// todo auto-fenated constructor stubthis.name.name = name;} public void setname(string name){this.name = name;} public class dohomework implements dojob {@overridepublic void fillbllank(int a int a Stubsystem.out.println(name + "Xiaohongがアカウントを解決するのを助けてください:" + a + " +" + b + " + result +" Meta ");}} public void callhelp(int a、int b){new supercalculator()。テスト手順は次のとおりです。
public class test {public static void main(string [] args){int a =; int b =; int c =; int d =; int d =; dew Student( "xiao ming"); seller s = new seller( "grandma"); s.callhelp(a、b); s.callhelp(c、d);}}}操作結果は次のとおりです。
Xiao Mingは、Xiaohongが計算するのに助けを求めました:56 + 31 = 87
老婦人は、アカウントを解決するためにXiaohongから助けを求めます:26497 + 11256 = 37753元
最後の言葉
Xiaohongはすでにこの問題をキャリアとして扱っていることを明確に見ることができ、彼女がインターフェイスDojobに与えた名前を見ることでそれを知るでしょう。
なぜ老婦人は失速をセットアップすることでそんなにお金を稼ぐことができるのかと尋ねるかもしれません。あなたの焦点に問題はありますか? !ここで話しているのは、コールバックメカニズムです! !
私が知っているのは、Xiaohongのビジネスが後で拡大し続け、幼稚園を卒業する前に、彼女はついに彼女が稼いだお金で彼女の人生で彼女の最初の家を買ったということです。