Inner Class(内部クラス)

6350 ワード

簡単な説明:
クラスごとに1つが生成されます.classファイル、ファイル名はクラス名です.内部クラスにもこのようなものが発生する.classファイルですが、その名前は内部クラスのクラス名ではなく、厳格な制限があります.周辺クラスの名前に$を加えて内部クラスの名前を付けます.内部クラスはメソッド呼び出し時に生成するのではなく、周辺クラスとともにコンパイルされ、表示することができる.classファイルの方法で証明します.
 
内部クラスを使用するメリット:
内部クラスは、外部クラスがインタフェースを継承しているかどうかにかかわらず、外部クラスに入る窓を提供し、各内部クラスは独立してインタフェースを継承することができます.したがって、内部クラスは多重継承ソリューションをより完全にします.
 
Inner Class(内部クラス)
1、定義:あるクラスの定義は別のクラスの内部に置かれ、このクラスは内部クラスと呼ばれます.
例:
public class OuterTest {
	
	public class InnerTest {
		public void test() {
			System.out.println("this is inner Class");
		}
	}
	
}

  
 
 
 
InnerTestは内部クラスと呼ばれ、内部クラスを作成した場合、周辺クラスのすべてのメンバーに特別な条件でアクセスする必要はありません.
 
2、内部クラスは周辺クラスのいかなるオブジェクトと方法にアクセスすることができ、内部クラスの実現方式が通常と異なることに注意する.
public class OuterTest {
	
	private String str = "hello";
	
	public class InnerTest {
		public void test() {
			System.out.println(str + " this is inner Class");
		}
	}
	
	public static void main(String[] args) {
		OuterTest ot = new OuterTest();
		OuterTest.InnerTest it = ot.new InnerTest();
		it.test();
	}
}

 
外部クラスで内部クラスオブジェクトを作成すると、この内部クラスオブジェクトは、外部クラスへの参照を秘密裏に取得し、この参照によって周辺クラスのメンバーにアクセスできます.通常、これらはコンパイラで処理されていますが、私たちは見えません.これに関心を持つ必要はありません.
 
 
 
 3、.これと.new
public class OuterTest {
	
	private int it = 0;
	
	public OuterTest(){
	}
	
	public OuterTest(int i){
		this.it = i;
	}
	
	public class InnerTest {
		public void test() {
			//  .this 
			System.out.println(OuterTest.this.it);
		}
		
		public void test2(OuterTest ot) {
			//  
			System.out.println(ot.it);
		}
		
		public void test3() {
			System.out.println(new OuterTest().it);
		}
	}
	
	public static void main(String[] args) {
		OuterTest ot = new OuterTest(100); 
		//  , , .new 
		//  .new, .new
		OuterTest.InnerTest it = ot.new InnerTest();
		it.test();
		it.test2(ot);
		it.test3();
	}
}

 
.new:周辺クラスオブジェクトの方法で得るのではなく、内部クラスオブジェクトを直接作成したい場合に使用できます.新キーワードは、周辺クラスのオブジェクトでなければならない.new、周辺類ではない.new
.this:内部クラスで周辺クラスを呼び出す方法で、クラスオブジェクトは必要ありません.
また、周辺クラスオブジェクトを作成する前に、内部クラスのオブジェクト(ネストされたクラスを除く:内部静的クラス)を作成することはできません.
 
4、内部クラスからインタフェースと親への変換
 
interface TestIn{
	public void printStr();
}

class TestInn {
	public void printCls() {
		System.out.println("TesTInn");
	}
}

public class OuterTest {
	
	private class InnerTest extends TestInn implements TestIn{
		public void printStr() {
			System.out.println("InnerTest ");
		}
		
		public void printCls() {
			System.out.println("InnerTest");
		}
	}
	
	public TestIn getInner(){
		return new InnerTest();
	}
	
	public static void main(String[] args) {
		OuterTest ot = new OuterTest();
		//  .new 
		OuterTest.InnerTest it = ot.new InnerTest();
		it.printStr();
		it.printCls();
		//  
		TestIn it2 = ot.getInner();
		it2.printStr();
		((TestInn)it2).printCls();
	}
}

 
 
 
内部クラスはprivateで、周辺クラス以外はアクセスできません.private内部クラスは、クラスの設計者に、タイプに依存する符号化を完全に阻止し、実装の詳細を完全に隠す方法を提供する.
 
 
Anonymous Inner Class匿名内部クラス
匿名の内部クラスは名前のない内部クラスです.匿名の内部クラスは表示できないextends(継承)他のクラス、表示できないimplements Interface(実装インタフェース)実装.しかし、extends(継承)他のクラスimplements Interface(実装インタフェース)を間接的に実装することができる.
interface TestIn{
	public void printStr();
}

class TestInn {
	public void printCls() {
		System.out.println("TesTInn");
	}
}

public class OuterTest {
	
	public TestIn OuterPrint() {
		return new TestIn(){
			public void printStr() {
				System.out.println("Inner");
			}
		};
	}
	
	public TestInn OuterPrint2() {
		return new TestInn(){
			public void printCls() {
				System.out.println("TesTInn  inner");
			}
		};
	}
	
	public static void main(String[] args) {
		OuterTest ot = new OuterTest();
		ot.OuterPrint().printStr();
		ot.OuterPrint2().printCls();
	}
}

 
 
 
 
 
匿名の内部クラスパスがfinalでなければ、コンパイラはエラーを提示し、匿名の内部クラスで属性、方法を定義することもできます.
 
class TestInn {
	private int num;
	
	public TestInn() {
		
	}
	
	public TestInn(int num) {
		this.num = num;
	}
	
	public void printCls() {
		System.out.println("TesTInn");
	}
}

public class OuterTest {
	
	public TestInn OuterPrint(final int num) {
		return new TestInn(num){
			public void printCls() {
				System.out.println("OuterPrint :" + num);
			}
			
		};
	}
	
	public static void main(String[] args) {
		OuterTest ot = new OuterTest();
		ot.OuterPrint(200).printCls();
	}
}

 
 
 
 
Nested class(ネストクラス/静的内部クラス)staticの内部クラスをネストクラスと呼びます.ネストクラスは例外です.ネストクラスを使用する場合は、次の2つの点に注意してください.
1、ネストされたクラスオブジェクトを作成する場合、周辺クラスは不要2、ネストされたクラスでは、通常の内部クラスのように周辺クラスの非staticメンバーにアクセスできない
class TestInn {
	private static int num;
	
	public TestInn() {
		
	}
	
	public TestInn(int num) {
		this.num = num;
	}
	
	public void printCls() {
		System.out.println("TesTInn");
	}
	
	public static class TestInner{
		public TestInner(int num){
			TestInn.num = num; 
		}
		
		public int getNum(){
			return num;
		}
	};
}

public class OuterTest {
	
	public static void main(String[] args) {
		TestInn.TestInner tr = new TestInn.TestInner(200);
		System.out.println(tr.getNum());
	}
}