検索
ホームページJava&#&チュートリアルJavaコールバック機構の詳しい説明とサンプルコードの具体的な内容

この記事では、主に Java コールバック メカニズムの詳細な説明とサンプル コードの具体的な詳細を紹介します。必要な友人は参照してください

Java コールバック メカニズム

概要:

最近 Java を学び、来ました。コールバック メカニズム (CallBack) に接続します。初めてこれに出会ったとき、非常にわかりにくいと感じましたが、インターネットで見つけた関連する説明は、一文で説明されているか、比較的単純で CallBack の定義を提供しているように見えました。もちろん、コールバックを理解した後、インターネットでさまざまな説明を読みましたが、特に問題はありませんでした。ただし、初心者の私にとっては、段階的なプロセスが欠けています。ここでは、コールバックメカニズムについての私の個人的な理解を浅いところから深いところまで順番に説明します。間違っていることがあれば、遠慮なくご指摘ください。

始める前に、ある場面を想像してください: 幼稚園児は 10 以内の足し算を学んだばかりです。

第 1 章 物語の起源

幼稚園の先生が黒板に「1 + 1 = 」という方程式を書き、シャオミンが空欄を埋めました。

Xiao Ming は足し算を 10 以内に学習しているので、この問題を完全に自分で計算できます。プロセスをシミュレートするコードは次のとおりです:

public class Student
 {
  private String name = null;

  public Student(String name)
  {
   // TODO Auto-generated 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 + "心算:" + a + " + " + b + " = " + result);
  }
 }

Xiao Ming が空白を埋めるとき (fillBalnk)、彼は直接計算します。暗算 ( clacADD ) を実行すると、結果は 2 になり、結果を空白のボックスに書き込みます。テスト コードは次のとおりです。

public class Test
 {
  public static void main(String[] args)
  {
  int a = 1;
   int b = 1;
   Student s = new Student("小明");
   s.fillBlank(a, b);
  }
 }

実行結果は次のとおりです。

小明心算:1 + 1 = 2

このプロセスは Student クラスのインスタンス オブジェクトだけで完全に完了し、コールバックメカニズム。

第2章 幼稚園の先生のあら探し

授業中、幼稚園の先生は突然思いつき、シャオミンに黒板に「168 + 291 =」と書いて完成させ、事務所に戻りました。

フラワーラブ!なぜ教師たちはシャオミンに問題を抱えているのですか?それは明らかにやりすぎです、大丈夫!このとき、シャオミンが上記のように暗算に頼ることができないことは明らかでしたが、混乱していると、クラスの同級生シャオホンが足し算(利得)だけを計算できる電卓を渡しました。 ! ! !シャオミンはたまたま電卓の使い方を知っていたので、電卓を使って結果を計算し、空白を埋めました。

電卓のコードは次のとおりです:

public class Calculator
 {
  public int add(int a, int b)
  {
   return a + b;
  }
 }

Student クラスを変更し、電卓を使用するメソッドを追加します:

public class Student
 {
  private String name = null;

  public Student(String name)
  {
   // TODO Auto-generated constructor stub
   this.name = name;
  }

  public void setName(String name)
  {
   this.name = name;
  }

  @SuppressWarnings("unused")
  private int calcADD(int a, int b)
  {
   return a + b;
  }

  private int useCalculator(int a, int b)
  {
   return new Calculator().add(a, b);
  }

  public void fillBlank(int a, int b)
  {
   int result = useCalculator(a, b);
   System.out.println(name + "使用计算器:" + a + " + " + b + " = " + result);
  }
 }

テストコードは次のとおりです:ええ

実行 結果は次のとおりです:

public class Test
 {
  public static void main(String[] args)
  {
   int a = 168;
   int b = 291;
   Student s = new Student("小明");
   s.fillBlank(a, b);
  }
 }

コールバック メカニズムはまだこのプロセスに関与していませんが、Xiao Ming の作業の一部が転送され、計算機によって支援されています。

3. 幼稚園の先生が戻ってきて

、シャオ・ミンが3桁の数字の足し算を終えていることに気づきました。先生はシャオ・ミンがとても賢くて、順応性のある才能があると思いました。そこで彼は黒板に「26549 + 16487 = 」と書き、授業に行く前にシャオミンに空欄を埋めるように頼み、それからオフィスに戻りました。 シャオミンは教室の外で友達が楽しんでいるのを見て、悲しくならずにはいられませんでした。遊びに行かないと、この休み場が台無しになってしまうよ! ! ! ! シャオホンが再び手渡した電卓を眺めながら、シャオミンはある計画を思いついた。それはシャオホンにやらせてみることだった。

シャオミンはシャオホンに、お題は「26549 + 16487 = 」であると伝え、結果を記入する具体的な場所を指定して、楽しく遊びに出かけました。

ここでは、Xiaohongを個別に実装するのではなく、足し算とXiaohong全体を追加することしかできないこの電卓を、結果を計算して空白を埋めることができるスーパー電卓として考えます。このスーパー電卓に渡す必要があるパラメータは 2 つの加数と埋められる位置であり、これらの内容は事前にシャオ ミンに通知する必要があります。つまり、シャオ ミンは自分のメソッドの一部をシャオ ホンに公開したいと考えています。最も簡単な方法は、Xiaohong に引用と 2 つの足し算を一緒に伝えることです。

したがって、スーパー電卓の add メソッドには 2 つのオペランドと Xiao Ming 自身への参照が含まれている必要があります。コードは次のとおりです:

小明使用计算器:168 + 291 = 459

Xiao Ming は暗算をしたり、電卓を使用したりする必要がなくなりました。必要なのは、Xiaohong に助けを求める方法だけです。コードは次のとおりです。

public class SuperCalculator
 {
  public void add(int a, int b, Student xiaoming)
  {
   int result = a + b;
   xiaoming.fillBlank(a, b, result);
  }
 }

実行プロセスは次のとおりです: Xiao Ming は、独自の callHelp メソッドを通じて Xiao Hon の add メソッド (new SuperCalculator()) を呼び出し、呼び出し時に自分自身の参照 (this) をパラメータとして渡します。取得する電卓 結果の後、Xiao Ming の fillBlank メソッドが呼び戻され、結果が黒板の空白スペースに埋められます。

軽い、軽い、軽い!この時点で、Xiao Ming の fillBlank メソッドが正式に登場します。これは、私たちがよくコールバック関数と呼ぶものです。

この方法を通じて、教師の穴埋め問題を完了するタスクについて、シャオ・ミンは足し算が完了して結果が黒板に記入されるまで待つ必要がなくなったことがはっきりとわかります。彼は友達と一緒に楽しむことができます。 空白を埋めてください。 この作業はスーパー電卓のシャオホンによって行われました。撤退の利点はすでに現れ始めています。

第4章 玄関先の義母

幼稚园的门口有一个头发花白的老婆婆,每天风雨无阻在那里摆着地摊卖一些快过期的垃圾食品。由于年纪大了,脑子有些糊涂,经常算不清楚自己挣了多少钱。有一天,她无意间听到了小明跟小伙伴们吹嘘自己如何在小红的帮助下与幼师斗智斗勇。于是,婆婆决定找到小红牌超级计算器来做自己的小帮手,并提供一包卫龙辣条作为报酬。小红经不住诱惑,答应了。

回看一下上一章的代码,我们发现小红牌超级计算器的add方法需要的参数是两个整型变量和一个Student对象,但是老婆婆她不是学生,是个小商贩啊,这里肯定要做修改。这种情况下,我们很自然的会想到继承和多态。如果让小明这个学生和老婆婆这个小商贩从一个父类进行继承,那么我们只需要给小红牌超级计算器传入一个父类的引用就可以啦。

不过,实际使用中,考虑到java的单继承,以及不希望把自身太多东西暴漏给别人,这里使用从接口继承的方式配合内部类来做。

换句话说,小红希望以后继续向班里的小朋友们提供计算服务,同时还能向老婆婆提供算账服务,甚至以后能够拓展其他人的业务,于是她向所有的顾客约定了一个办法,用于统一的处理,也就是自己需要的操作数和做完计算之后应该怎么做。这个统一的方法,小红做成了一个接口,提供给了大家,代码如下:

public interface doJob
 {
  public void fillBlank(int a, int b, int result);
 }

因为灵感来自帮小明填空,因此小红保留了初心,把所有业务都当做填空(fillBlank)来做。

同时,小红修改了自己的计算器,使其可以同时处理不同的实现了doJob接口的人,代码如下:

public class SuperCalculator
 {
  public void add(int a, int b, doJob customer)
  {
   int result = a + b;
   customer.fillBlank(a, b, result);
  }
 }

小明和老婆婆拿到这个接口之后,只要实现了这个接口,就相当于按照统一的模式告诉小红得到结果之后的处理办法,按照之前说的使用内部类来做,代码如下:

小明的:

public class Student
 {
  private String name = null;

  public Student(String name)
  {
   // TODO Auto-generated constructor stub
   this.name = name;
  }

  public void setName(String name)
  {
   this.name = name;
  }

  public class doHomeWork implements doJob
  {

   @Override
   public void fillBlank(int a, int b, int result)
   {
    // TODO Auto-generated method stub
    System.out.println(name + "求助小红计算:" + a + " + " + b + " = " + result);
   }

  }

  public void callHelp (int a, int b)
  {
   new SuperCalculator().add(a, b, new doHomeWork());
  }
 }

老婆婆的:

public class Seller
{
 private String name = null;

 public Seller(String name)
 {
  // TODO Auto-generated constructor stub
  this.name = name;
 }

 public void setName(String name)
 {
  this.name = name;
 }

 public class doHomeWork implements doJob
 {

  @Override
  public void fillBlank(int a, int b, int result)
  {
   // TODO Auto-generated method stub
   System.out.println(name + "求助小红算账:" + a + " + " + b + " = " + result + "元");
  }

 }

 public void callHelp (int a, int b)
 {
  new SuperCalculator().add(a, b, new doHomeWork());
 }
}

测试程序如下:

public class Test
{
 public static void main(String[] args)
 {
  int a = 56;
  int b = 31;
  int c = 26497;
  int d = 11256;
  Student s1 = new Student("小明");
  Seller s2 = new Seller("老婆婆");

  s1.callHelp(a, b);
  s2.callHelp(c, d);
 }
}

运行结果如下:

小明求助小红计算:56 + 31 = 87
老婆婆求助小红算账:26497 + 11256 = 37753元

最后的话

可以很明显的看到,小红已经把这件事情当做一个事业来做了,看她给接口命的名字doJob就知道了。

有人也许会问,为什么老婆婆摆摊能挣那么多钱? 你的关注点有问题好吗!!这里聊的是回调机制啊!!

我只知道,后来小红的业务不断扩大,终于在幼稚园毕业之前,用挣到的钱买了人生的第一套房子。


以上がJavaコールバック機構の詳しい説明とサンプルコードの具体的な内容の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
JVMはオペレーティングシステムAPIの違いをどのように処理しますか?JVMはオペレーティングシステムAPIの違いをどのように処理しますか?Apr 27, 2025 am 12:18 AM

JVMは、JavanativeInterface(JNI)およびJava Standard Libraryを介してオペレーティングシステムのAPIの違いを処理します。1。JNIでは、Javaコードがローカルコードを呼び出し、オペレーティングシステムAPIと直接対話できます。 2. Java Standard Libraryは統一されたAPIを提供します。これは、異なるオペレーティングシステムAPIに内部的にマッピングされ、コードがプラットフォーム間で実行されるようにします。

Java 9で導入されたモジュール性は、プラットフォームの独立性にどのように影響しますか?Java 9で導入されたモジュール性は、プラットフォームの独立性にどのように影響しますか?Apr 27, 2025 am 12:15 AM

modularitydoesnotdirectlyectlyectjava'splatformindepensence.java'splatformendepenceismaindainededainededainededaindainedaindained bythejvm、butmodularityinfluencesApplucationStructure andmanagement、間接的なインパクチャプラット形成依存性.1)

ByteCodeとは何ですか?また、Javaのプラットフォームの独立性とどのように関係していますか?ByteCodeとは何ですか?また、Javaのプラットフォームの独立性とどのように関係していますか?Apr 27, 2025 am 12:06 AM

bytecodeinjavaisthe intermediaterepresentationthateNablesplatformindepence.1)javacodeis compiledintobytecodestoredin.classfiles.2)thejvminterpretsorcompilesthisbytecodeintomachinecodeatime、

Javaがプラットフォームに依存しない言語と見なされるのはなぜですか?Javaがプラットフォームに依存しない言語と見なされるのはなぜですか?Apr 27, 2025 am 12:03 AM

javaachievesplatformedenceTheTheTheJavavirtualMachine(JVM)、これは、javacodeisisisisisissompiledIntobytecode.2)javaCodeisisisisissompiledevedevicetecode.2)

グラフィカルユーザーインターフェイス(GUI)は、Javaのプラットフォーム独立性の課題をどのように提示できますか?グラフィカルユーザーインターフェイス(GUI)は、Javaのプラットフォーム独立性の課題をどのように提示できますか?Apr 27, 2025 am 12:02 AM

Javagui開発におけるプラットフォームの独立性は課題に直面していますが、Swing、Javafx、統一外観、パフォーマンス最適化、サードパーティライブラリ、クロスプラットフォームテストを使用することで対処できます。 Javaguiの開発は、クロスプラットフォームの一貫性を提供することを目的としたAWTとSwingに依存していますが、実際の効果はオペレーティングシステムごとに異なります。ソリューションには以下が含まれます。1)SwingおよびJavafxをGUIツールキットとして使用します。 2)uimanager.setlookandfeel()を介して外観を統合します。 3)さまざまなプラットフォームに合わせてパフォーマンスを最適化します。 4)ApachepivotやSWTなどのサードパーティライブラリを使用する。 5)一貫性を確保するために、クロスプラットフォームテストを実施します。

Java開発のどの側面がプラットフォームに依存していますか?Java開発のどの側面がプラットフォームに依存していますか?Apr 26, 2025 am 12:19 AM

javadevelopmentisnotentirelylylypratform-IndopentDuetoseveralfactors.1)jvmvariationsaffectperformanceandbehavioracrossdifferentos.2)nativeLibrariesviajniintroducePlatform-specificissues.3)giaiasystemsdifferbeTioneplateplatifflics.4)

さまざまなプラットフォームでJavaコードを実行するときにパフォーマンスの違いはありますか?なぜ?さまざまなプラットフォームでJavaコードを実行するときにパフォーマンスの違いはありますか?なぜ?Apr 26, 2025 am 12:15 AM

Javaコードは、さまざまなプラットフォームで実行するときにパフォーマンスの違いがあります。 1)JVMの実装と最適化戦略は、OracleJDKやOpenJDKなどとは異なります。 2)メモリ管理やスレッドスケジューリングなどのオペレーティングシステムの特性もパフォーマンスに影響します。 3)適切なJVMを選択し、JVMパラメーターとコード最適化を調整することにより、パフォーマンスを改善できます。

Javaのプラットフォームの独立性の制限は何ですか?Javaのプラットフォームの独立性の制限は何ですか?Apr 26, 2025 am 12:10 AM

java'splatformindepentedencehaslimitationsincludingporformanceoverhead、versioncompatibulisisues、changleSwithnativeLibraryIntegration、プラットフォーム固有の機能、およびjvminStallation/maintenation。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。