10章-内部類(メモ)

3180 ワード

一、内部クラスの分類
二、普通の内部クラス(後に内部クラスと略称する)とネストクラスの作成時の違い
三、Javaはなぜ内部クラスを導入し、内部クラスを利用してどのような問題を解決することができますか?
四、匿名内部クラスで直接使用される変数はfinalキーワードで修飾される
 
一、内部クラスの分類
内部クラスはstaticかどうかによって2つのクラスに分けられます.
1.内部クラス
2、ネストクラス(内部クラスがstaticのネストクラスの場合、この参照はありません)
内部クラスは、次の3つに分けられます.
1.一般内部クラス(周辺クラスの役割ドメインで定義)
2.ローカル内部クラス(一般内部で定義された役割ドメインとは異なり、一般内部クラスは一般的に周辺クラスの役割ドメインに定義され、ローカル内部クラスはメソッドの役割ドメイン内または一般的な役割ドメイン内で作成できる)
3、匿名内部クラス(宣言クラスの名前が表示されていない内部クラスを匿名内部クラスと呼ぶ)
 
二、普通の内部クラス(後に内部クラスと略称する)とネストクラスの作成時の違い
ネストされたクラスの作成:new周辺クラス.内部クラス()を通過する必要があります.  に表示されます.
内部クラスの作成:基本的には周辺クラスオブジェクトから参照.new  内部クラス()は作成されますが、その内部クラスを定義する周辺内で内部クラスオブジェクトを作成する必要がある場合はnew周辺クラス.内部クラス()   に表示されます.
注意:内部クラスの周辺クラスに内部クラスを作成する場合はnew周辺クラス.内部クラス()を使用することもできます.  それを作成しますか?  これは、内部がその周辺クラスのオブジェクトを必要とするため、基本的には周辺クラスのオブジェクトによって参照されます.new  内部クラス() のように作成され、
ただし、内部クラスを定義する周辺クラスに内部クラスを作成する場合、セグメントコードが実行できる場合は、その周辺クラスがすでに存在していることを示します.したがって、ここでは、周辺クラスのオブジェクト参照を作成する必要がなく、内部クラスオブジェクトを作成する必要はありません(もちろん、よろしければ).周辺クラスオブジェクト参照のように.new  内部クラス()この作成方法は、コンパイラに、その周辺クラスのオブジェクトリファレンスによって作成されたことを伝えることです.コンパイラは、内部クラスを作成する際に、その内部クラスの周辺クラスのオブジェクトリファレンスを作成する必要があるためです.
 
三、Javaはなぜ内部クラスを導入し、内部クラスを利用してどのような問題を解決することができますか?
個人的には、なぜ内部クラス、内部クラスを導入したのかを簡単にまとめます.
1、Javaが許さない多重継承の問題を解決することができ、あるクラスが機能的に2つのクラスの機能を同時に継承する必要がある場合、周辺クラスを通じて1つのクラスを継承し、それから内部クラスを通じて別のクラスを継承することができる.
2、2つ以上のインタフェースを実装できる場合、この2つのインタフェースに同じメソッド署名が含まれている場合、サブクラスがいずれかのインタフェースを実装している場合、別のインタフェースのメソッドを実装することはできません.そうすると、2つのインタフェースが同じメソッドを共有し、javaでのマルチステート(親がサブクラスオブジェクトを呼び出す効果を参照した)を実装することはできません.したがって、この場合、別のインタフェースを内部クラスで実現することができる.
内部クラスを通さなくても、あるクラスに2つのインタフェースの機能を同時に持たせたい場合は、別のクラスで2番目のインタフェースを実現し、オブジェクトを作成することで対応するメソッドを呼び出すこともできるのではないでしょうか.ここで注意しなければならないのは、内部には非常に重要な特徴があり、周辺クラスへのデフォルトの参照があり、周辺クラスの任意の方法と属性に任意にアクセスすることができ、周辺クラスの特殊な方法に相当することです.外部クラスのメソッドによって内部クラスオブジェクトの対応メソッドを呼び出して周辺クラスのプロパティを変更する方法は、透明な類似のマルチ継承を実現する機能を完全に使用することができる.例:
 
interface A {}

interface B {
	void getMoney();
}

class OtherClass implements B {

	public void getMoney() {
		System.out.println("                         ");
	}

}

public class TestWhyImportInnerClass implements A  {

	private  int age;
	private int money;
	
	class InnerClass implements B {

		public void getMoney() {
		    //                  ,                     
			money = age * 100;
			System.out.println("    money:" + money);
		}		
	}
	
	public void getMoney() {
	     TestWhyImportInnerClass.InnerClass innerClass = new TestWhyImportInnerClass.InnerClass();
	     innerClass.getMoney();
	}
	
	public static void main(String[] args) {
		TestWhyImportInnerClass test = new TestWhyImportInnerClass();
		test.age = 10;
		test.getMoney();
		
		OtherClass otherClass = new OtherClass();
		otherClass.getMoney();
		
/*		    money:1000
		                         */
	}
	
}



  
 四、匿名内部クラスで直接使用される変数はfinalキーワードで修飾される