Java内部クラス間のクロージャとコールバックの詳細な説明

高洛峰
リリース: 2017-01-24 11:55:13
オリジナル
1499 人が閲覧しました

前書き

クロージャは、作成されたスコープからの情報を記録する呼び出し可能なオブジェクトです。この定義を通じて、内部クラスがオブジェクト指向クロージャであることがわかります。これは、内部クラスには外部クラスのオブジェクト (内部クラスが作成されるスコープ) に関する情報が含まれるだけでなく、この外部クラスへの参照も自動的に含まれるためです。オブジェクトの場合、このスコープ内で、内部クラスはプライベート メンバーを含むすべてのメンバーを操作する権限を持ちます。

Java で最も物議を醸している問題の 1 つは、Java にはコールバックを可能にする何らかのポインタのようなメカニズムを含めるべきであるという考えです。コールバックを通じて、オブジェクトは後で元のオブジェクトを呼び出すことを可能にする情報を運ぶことができます。コールバックがポインタを介して実装されている場合、プログラマがポインタを誤用しないことを祈るだけです。

1. メンバーの内部クラス

内部クラスはメンバーとみなすことができます。メンバーの内部クラスは、外部クラスのすべてのメンバー プロパティとメンバー メソッドに無条件でアクセスできます。

class OutterClass {//外部类
 private int in = 0;
 static int inn=4;
 public OutterClass(int in) {
   this.in = in;
 }
 class InnerClass {   //内部类
   public void output() {
     System.out.println(in);
     System.out.println(inn);
   }
 }
}
ログイン後にコピー

メンバー内部クラスに外部クラスと同じ名前のメンバー変数またはメソッドがある場合、デフォルトではメンバー内部クラスのメンバーにアクセスします。同じ名前の外部クラスのメンバーにアクセスしたい場合は、次の形式でアクセスする必要があります:

OutterClass(外部类).this.成员
ログイン後にコピー

外部クラスが内部クラスにアクセスするには、まずメンバーのオブジェクトを作成する必要があります。内部クラスにアクセスし、このオブジェクトへの参照を通じてアクセスします。

class OutterClass {
 private int in = 0;
 static int inn=4;
 public OutterClass(int in) {
   InnerClass inner=new InnerClass();
   this.in=inner.innerNum;
 }
 class InnerClass {  //内部类
   public int innerNum=1;
   public void output() {
     System.out.println(in);
     System.out.println(inn);
     int a=OutterClass.this.inn;
   }
 }
}
ログイン後にコピー

メンバの内部クラスは外部クラスに依存して存在します。つまり、メンバの内部クラスのオブジェクトを作成するには、外部クラスのオブジェクトが存在することが前提となります。メンバー内部クラス オブジェクトを作成する一般的な方法は次のとおりです:

public class classa {
 public static void main(){
   OutterClass oc=new OutterClass(3);
   OutterClass.InnerClass in=oc.new InnerClass();
 }
}
ログイン後にコピー

2. ローカル内部クラス

ローカル内部クラスはメソッド内のローカル変数のようなもので、public、protected、private、および static 修飾子を持つことはできません。 。

class OutterClass {
 public OutterClass(int in) {
   class InnerClass {  //局部内部类
      int innerNum=1;
   }
 }
}
ログイン後にコピー

3. ネストされた内部クラス

ネストされた内部クラスは、静的に変更された内部クラスです。 static として宣言された内部クラスは、内部クラス オブジェクトと外部クラス オブジェクト間の接続を必要としません。つまり、outer.inner を直接参照できます。つまり、外部クラスや内部クラスを作成する必要はありません。

class OutterClass {
 public OutterClass(int in) {   
 }
 static class InnerClass {  //局部内部类
   int innerNum=1;
 }
}
public class classa {
 public static void main(){
   OutterClass.InnerClass in=new OutterClass.InnerClass();
 }
}
ログイン後にコピー

4. 匿名内部クラス

匿名内部クラスは私たちが最もよく使用するものです。名前を付けたくないので、匿名を使用しています。匿名の内部クラスは事前に定義する必要があります。

btnSan.setOnClickListener(newOnClickListener() {
  @Override
  publicvoidonClick(View v) {
  }
});
ログイン後にコピー

5. クロージャとコールバック

クロージャ (Closure) は、それが作成されたスコープに関する情報を保存する、呼び出し可能なオブジェクトです。 JAVA はクロージャを明示的にサポートしていませんが、JAVA では「インターフェイス + 内部クラス」を通じてクロージャを実装できます。

例: インターフェイス プログラマと基本クラスの作成者は両方とも同じメソッドの動作とメソッド名を持っていますが、それらの意味は完全に異なります。この場合、クロージャが必要です。

class Writer {//作家基类
 void work(){};
}
interface programmer{//程序员接口
 void work();
}
ログイン後にコピー

クロージャの実装コードは次のとおりです:

public class WriterProgrammer extends Writer {
 @Override
 public void work(){
   //写作
 }
 public void code(){
   //写代码
 }
 class ProgrammerInner implements programmer{
   @Override
   public void work(){
     code();
   }
 }
}
ログイン後にコピー

は、サブクラスでプログラマのインターフェース規則に従う内部クラスを定義し、その内部クラスを使用してプログラマの work() メソッドのコールバック code() を実装します。メソッド、in 親クラスのライターの work() メソッドは、サブクラスに直接実装されます。

6. 内部クラスの役割

内部クラスは隠蔽を非常にうまく実現できます。

一般的な非内部クラスはプライベートおよび保護されたアクセス許可を持つことはできませんが、内部クラスは許可されます

内部クラスは周辺クラスのすべての要素へのアクセス許可を持つことができます

ただし、多重継承は実装できます

変更を避ける このインターフェイスは、同じクラス内の同じ名前を持つ 2 つのメソッドの呼び出しを実装します。

7. 概要

以上がこの記事の全内容です。ご質問がございましたら、メッセージを残してください。

Java 内部クラス間のクロージャとコールバックの詳細な説明については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート