Java4Android自習レコード(23):内部クラスと匿名の内部クラス

道は邪魔で長く、線が来ています。頭を下げて一生懸命頑張ってください。話さなければ、あなたは大ヒット作になります!さあ、サンニアン!

ディレクトリとリソースのインデックス

  Java4Android自己学習プロセスのカタログとリソースインデックス

1内部クラスとは何ですか?

  内部クラス:クラスは別のクラスの内部で定義されるため、このクラスは内部クラスと呼ばれ、コード例は次のとおりです。

class A
{
    
    
    class B
    {
    
    
        
	}
}

  この時点で直接コンパイルすると、コンパイルの結果はどうなりますか?以下に示すように、コンパイル後に2つのクラスファイルがあります。
image-20200526224829631

  このうち、A $ B.classは内部クラスによって生成されたクラスファイルです。

  内部クラスのコンパイルされた名前は次のとおりです。外部クラス名$内部クラス名。クラス

2内部クラスの文法的特徴は何ですか?

2.1内部クラスオブジェクトを生成する方法

  上記のクラスファイルを引き続き使用します。この時点で、メイン関数を格納する新しいクラスを作成します。プログラムの内容は次のとおりです。

class Test
{
    
    
	public static void main(String args[]) 
	{
    
    
		A a = new A();				// 生成类A 对象
		
		A.B b = new A().new B();	// 生成子类B 对象
	}
}

2.2内部クラスメンバー変数/関数の使用方法

  まず、最初のセクションでクラスファイルを変更し、テストのためにいくつかのメンバー変数を追加します。具体的なコードは次のとおりです。

class A 
{
    
    
	int i;
	
	class B 
	{
    
    
		int j;
		
		int funB()
		{
    
    
			int result = i + j;
			System.out.println(result);		// 添加result打印,调试用
			return result;
		}
	}
}

  この時点で、メイン関数を変更し、クラスAとクラスBのメンバー変数に値を割り当て、関数の出力結果を表示します

class Test
{
    
    
	public static void main(String args[]) 
	{
    
    
		A a = new A();				// 生成类A 对象
		
		A.B b = a.new B();			// 生成子类B 对象
		
		a.i = 3;
		b.j = 1;
		b.funB();
	}
}

  上記のコードをコンパイルして実行すると、結果は次のようになります。
image-20200526230400661

  コードの分析と実行結果から:

  • 内部クラスは、外部クラスによって定義されたメンバー変数を自由に使用できます。
  • BはAの内部クラスです。つまり、Aのメンバー変数とメンバー関数を自由にBで使用できますが、これは、BがAを継承して使用できることを意味しませんが、Bはこれらのメンバー変数を所有しません。
  • 内部クラスのすべてのオブジェクトは、外部クラスのオブジェクトに関連付けられています。つまり、内部クラスオブジェクトがある場合、それに関連付けられている外部クラスオブジェクトが必要です。
  • 内部クラスBで実際に使用される変数iは、外部クラスのメンバー変数です。

3匿名の内部クラス

  匿名内部クラス:最初は内部クラスであり、名前はありません。匿名内部クラスと呼ばれます。

  以下の特定のコードを使用して、新しいインターフェイスクラスAを実装および作成します

interface A 
{
    
    
	public void doSomething();
}

  次に、クラスBを定義します。

class B 
{
    
    
	public void fun(A a)
	{
    
    
		System.out.println("B类的fun函数");
		a.doSomething();
	}
}

  現時点では、クラスBにはタイプAのオブジェクトが必要です。次のように、Aはオブジェクトを直接生成できないため、パラメーターとして、インターフェイスAのサブクラスも必要です。

class AImpl implements A 
{
    
    
	public void doSomething()
	{
    
    
		System.out.println("doSomething");
	}
}

  この時点でmain関数は少し変更されています。具体的なコードは次のとおりです。

class Test
{
    
    
	public static void main(String args[]) 
	{
    
    
		AImpl al = new AImpl();	// 生成子类对象
		A a = al;				// 向上转型
		
		B b = new B();
		b.fun(a);				// 传进去类型为A的参数
	}
}

  上記のコードのコンパイルと実行の結果は次のとおりです。
image-20200526232124996

  現時点で匿名の内部クラスが使用されている場合は、通常とは異なる方法で記述されることに注意してください。メイン関数コードを次のように変更します。

class Test
{
    
    
	public static void main(String args[]) 
	{
    
    
		// AImpl al = new AImpl();	// 生成子类对象
		// A a = al;				// 向上转型
		
		B b = new B();
		b.fun(new A()
			{
    
    
				public void doSomething()
				{
    
    
					System.out.println("匿名内部类");
				}
			}
		);
	}
}

  上記のコードを再コンパイルすると、実行結果は次のようになります。

  匿名の内部クラスコードとコンパイル結果の分析は次のとおりです。

  • クラスBのfun関数にはタイプAのオブジェクトが必要です。これは基本的に前のAImplに似ていますが、名前はありません。
  • new A()は直接使用できません。インターフェイスを実装するクラスの後に続く必要がありますが、名前がないと匿名クラスと呼ばれます。

4まとめ

  1. 内部クラス、内部クラスの基本的な文法特性、実装方法などを理解します。
  2. 内部クラスのメンバー変数とメンバー関数の使用法とスコープを理解します。
  3. 匿名の内部クラス、特性、および実装方法の簡単な理解。

記事の内容が間違っている場合は、コメント/プライベートメッセージをたくさんアドバイスしてください、ありがとう!記事の内容が悪くないと思うなら、いいねを残してください。あなたのいいねが私の最大の励ましです、ありがとう!

おすすめ

転載: blog.csdn.net/Fighting_Boom/article/details/106368055