序文
最近、私はJavaを学び、コールバックメカニズム(コールバック)と接触しました。私が最初に会ったとき、私はかなり混乱したと感じました、そして、私がオンラインで検索した関連する説明は、まるでコールバックを定義したかのように言及されたか、単純に言ったかのどちらかでした。もちろん、コールバックを理解した後、私はさまざまな説明をオンラインで読みに行きましたが、問題はありませんでした。しかし、初心者である私にとっては、漸進的なプロセスがありません。
コールバックは双方向の呼び出しモードです。それはどういう意味ですか?つまり、呼び出された当事者は、コールバックと呼ばれる呼び出されたときに相手にも電話します。 「あなたが私に電話したら、私は電話をかけます」。
わかりませんか?問題ではありません。まず、コールバックを使用するこの古典的な方法を見てみましょう。
クラスAはインターフェイスINAを実装します - 背景1
クラスAには、クラスBのリファレンスBが含まれています - 背景2
クラスBには、パラメーターINAテストを備えた方法があります(INA A) - バックグラウンド3
AのオブジェクトAはそれ自体にBのメソッドを呼び出します、テスト(a) - この手順はあなたと同等です
次に、Bはテスト方法でINAメソッドを呼び出すことができます - このステップは私があなたに電話をかけることと同等です
開始する前に、シナリオを想像してください。幼稚園の子供たちは10以内に追加を学んだばかりです。
以下では、浅いものから深いものへの順序でのコールバックメカニズムについての私の個人的な理解について説明します。不適切なものがあれば、私はあなたにアドバイスを与えることを願っています!
第1章。物語の起源
幼稚園の先生は、ブラックボードに「1 + 1 =」という式を書きました。シャオ・ミンは空白を埋めました。
10未満の追加を学んだので、Xiao Mingはこの質問を完全に自分で計算できます。プロセスをシミュレートするコードは次のとおりです。
パブリッククラスの学生{private string name = null; Public Student(String name){// todo auto-enerated constructor stub this.name = name; } public void setName(string name){this.name = name; } private int calcadd(int a、int b){return a + b; } public void fillblank(int a、int b){int result = calcadd(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 = 1; int b = 1;学生s =新しい学生( "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-enerated constructor stub this.name = name; } public void setName(string name){this.name = name; } @suppresswarnings( "unsused")private int calcadd(int a、int b){return a + b; } private int usecalculator(int a、int b){return new calculator()。(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 = 168; int b = 291;学生s =新しい学生( "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-enerated constructor stub this.name = name; } public void setName(string name){this.name = name; } public void callhelp(int a、int b){new supercalculator()。add(a、b、this); } public void fillblank(int a、int b、int result){system.out.println(name + "xiaohong計算を求めている:" + a + " +" + b + "=" + result); }}テストコードは次のとおりです。
public class test {public static void main(string [] args){int a = 26549; int b = 16487;学生s =新しい学生( "xiao ming"); S.Callhelp(a、b); }}実行中の結果は次のとおりです。
Xiao MingはXiaohongを計算するのに助けを求めました:26549 + 16487 = 43036
実行プロセスは次のとおりです。XiaoMingは、彼自身のCallhelpメソッドを介してXiao Hong (new SuperCalculator())のADDメソッドを呼び出し、呼び出し時のパラメーターとして彼自身の参照(This)を渡します。 Xiao Hongが計算機を使用して結果を取得した後、彼はXiao MingのFillblankメソッドを呼び出し、ブラックボードのスペースで結果を埋めます。
ライトとライト!この時点で、コールバック関数が正式にデビューしました。 Xiao MingのFillBlankメソッドは、頻繁にコールバック関数です。
このようにして、Xiao Mingが追加が完了するまで待つ必要がなく、結果が彼が友人と楽しむことができるようになる前にブラックボードで満たされる必要がなくなったことが明確にわかります。空白の作業は、スーパー計算機であるXiaohongによって行われます。コールバックの利点が反映され始めました。
第4章。ドアの義理の母
幼稚園の入り口に白髪の老婦人がいます。彼女は、風や雨に関係なく、毎日ほとんど期限切れになっているジャンクフードを販売する街路屋を設置しました。私は年をとっているので、私の心は少し混乱しており、稼いだお金の量をよく理解することはできません。ある日、彼女はシャオホンの助けを借りて幼稚園の教師と幼稚園の教師とどのように戦ったかについて、Xiao Mingの自慢を誤って聞いた。そこで、私の義理の母は、リトルレッドカードスーパー計算機を彼女の小さなヘルパーにし、報酬としてワイロングスパイシーなストリップのパックを提供することを決めました。 Xiaohongは誘惑に抵抗することができず、同意しました。
前の章のコードを振り返ると、リトルレッドカードスーパー計算機のADDメソッドに必要なパラメーターは2つの整数変数と学生オブジェクトであることがわかりましたが、老婦人は学生ではなく、小さなベンダーであるため、ここで修正を行う必要があります。この場合、相続と多型を考えるのは当然です。学生のXiao Mingと老婦人のベンダーに親クラスから継承するように依頼する場合、親クラスへの参照をリトルレッドカードスーパー計算機に渡すだけです。
ただし、実際に使用して、Javaの単一の継承を考慮して、他の人にあまりにも多くの自分自身をさらしたくないことを考慮して、インターフェイスから継承する方法を使用して内部クラスと協力します。
言い換えれば、Xiaohongは、将来クラスの子どもたちに計算サービスを提供し続け、同時に老婦人に会計サービスを提供し、将来他の人々のビジネスを拡大することを望んでいます。そのため、彼女はすべての顧客に、統一された処理の方法、つまり必要なオペランドと計算を完了した後の方法に同意しました。 Xiaohongはこの統一された方法をインターフェイスにし、すべての人に提供します。コードは次のとおりです。
public Interface 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-enerated constructor stub this.name = name; } public void setName(string name){this.name = name; } public class dohomeworkはdojobを実装しています{@Override public void fillblank(int a、int b、int result){// todo auto-enerated method stub.out.println(name + "Xiaohong計算の助けを求めている:" + a + " +" + b + "=" + " +" }} public void callhelp(int a、int b){new supercalculator()。add(a、b、new dohomework()); }}老婦人:
パブリッククラスセラー{プライベート文字列名= null; public seller(string name){// todo auto-enerated constructor stub this.name = name; } public void setName(string name){this.name = name; }パブリッククラスのdohomework Implements dojob {@override public void fillblank(int a、int b、int result){// dodo auto-feenated method stub.out.println(name + "xiaohongを求めてアカウントを解決するためのヘルプ:" + a + " +" + " +" + B + " {new SuperCalculator()。テスト手順は次のとおりです。
public class test {public static void main(string [] args){int a = 56; int b = 31; int c = 26497; int d = 11256;学生S1 =新しい学生( "Xiao Ming");売り手S2 =新しい売り手(「おばあちゃん」); s1.callhelp(a、b); s2.callhelp(c、d); }}操作結果は次のとおりです。
Xiao Mingは、Xiaohongが計算するのに助けを求めました:56 + 31 = 87
老婦人は、アカウントを解決するためにXiaohongから助けを求めます:26497 + 11256 = 37753元
要約します
Xiaohongはすでにこの問題をキャリアとして扱っていることを明確に見ることができ、彼女がインターフェイスDojobに与えた名前を見ることでそれを知るでしょう。
なぜ老婦人は失速をセットアップすることでそんなにお金を稼ぐことができるのかと尋ねるかもしれません。あなたの焦点に問題はありますか? !ここで話しているのは、コールバックメカニズムです! !
私が知っているのは、Xiaohongのビジネスが後で拡大し続け、幼稚園を卒業する前に、彼女はついに彼女が稼いだお金で彼女の人生で彼女の最初の家を買ったということです。
上記は、Javaのコールバックメカニズム(コールバック)の興味深い詳細な説明です。 Javaを学ぶことは誰にとっても役立つことを願っています。 wulin.comへのご支援ありがとうございます。