JAVA インナークラス・メンバークラス

**<FONT color="#ff0000">メンバークラス</font>**とは、
クラス内の変数やメソッドと同様にクラスをメンバーとして宣言できる。
static付きメンバークラスと非staticメンバークラスは、全く別物。

**<font color = "#ff0000">メンバー</font>**とは「フィールド」「メソッド」「(メンバークラスとしての)インナークラス」。
メンバーの中にあるインナークラスは**<FONT color="#ff69b4">メンバークラス</font>**。

メンバークラス宣言に関しては**<FONT color="#ff0000">staticを付けるか付けないかで利用法に大きな違い</FONT>**が現れる点に特徴がある。
* * *
##**staticメンバークラス**
**<font color = "#ff000">staticメンバークラス</font>**は外部クラスやそのインスタンスとの関係が比較的薄く、
<font color = "#ff69b4">「インナークラスとしてではなく通常の別クラスとして宣言した場合」
に近い感覚で利用できる」</font>。

- [x] staticメンバークラスとは、_________________________________              
**通常の別クラスとstaticメンバークラスの違い**              
・基本的に「外部クラス名.メンバークラス名」で利用する。  
・外部クラスのメンバーにアクセス出来るが、staticなものに限られる。              
_________________________________________________________

・基本的に「外部クラス名.メンバークラス名」で利用する。→
Outer.Innner ic = new Outer.Inner();
* * *
##**staticなしメンバークラス**
**<font color = "#ff000">staticなしメンバークラス(インナークラス)</font>**は、
<font color = "ff69b4">外部クラスから生み出される個々のインスタンスと強い結び付き</font>を持ったクラス定義。
非staticなインナークラスは、
外部クラスのメンバの１つとして定義されているインナークラスで、
static指定のないもののこと。
メンバークラスのインスタンスは、
必ずある外部クラスのインスタンスと結び付く形で生み出される。

- [x] staticなしメンバークラスとは_________________________________                            
・基本的に「外部クラス名.メンバークラス名」で利用する。  
・結び付いている外部インスタンスの非staticメンバーにもアクセス出来る。
_________________________________________________________

staticなしメンバークラスのインスタンス生成には、次に示す特殊な文法を使う。

- [x] staticなしメンバークラスのインスタンス化_________________________________                            
・外部クラスのインスタンス変数名.new メンバークラスコンストラクタ呼び出し                            
ex)

```java
		Outer o = new Outer();//まず外部インスタンスを生成
		Outer.Inner = o.new Inner();//oと繋がるInnerインスタンスを生成
```  
_________________________________________________________

▪️Test93.java staticメンバークラスの利用例

```java
//▪staticメンバークラスの利用例

//外部クラス
class Outer {
	int outerField;
	static int a;

	// staticなメンバークラス
	static class Inner {
		void innerMethod() {
			// staticな外部クラスメンバのみ利用可
			a = 10;
		}
	}

	// 外部クラスの中にあるメソッド
	void outerMethod() {
		// 外部クラスからはInnerで利用可
		Inner ic = new Inner();
	}
}

// 無関係なクラス
class Test93 {
	public static void main(String[] args) {
		// 無関係なクラスからstaticなメンバークラスにアクセスするにはOuter.Innerで利用
		Outer.Inner ic = new Outer.Inner();
	}
}
```

#**インナークラス(内部クラス)**
<font color = "#ff000">インナークラス</font>とは
ネストされた(=入れ子になった)クラスで、static宣言されていないもの
![スクリーンショット 2016-01-14 14.10.55.png](https://qiita-image-store.s3.amazonaws.com/0/95187/e3f23daa-4c77-7f66-4f9d-94ee03681f31.png)
![スクリーンショット 2016-01-15 11.45.22.png](https://qiita-image-store.s3.amazonaws.com/0/95187/613e29f2-221c-569b-15f7-c38d5c9dfeaf.png)

▪️Test94.java 非staticメンバークラス(インナークラス)の利用例①

```java
//*非staticメンバークラス(インナークラス)の利用例
class Outer {
	static int outerField;
	int b;

	class Inner {
		void innerMethod() {
			outerField = 10;
			b = 5;
		}
	}

	void outerMethod() {
		Inner ic = new Inner();
	}

}

class Test94 {
	public static void main(String[] args) {
		Outer o = new Outer();
		Outer.Inner in = o.new Inner();
	}
}
```

▪️Test95.java 非staticメンバークラス(インナークラス)の利用例②

```java
//*非staticメンバークラス(インナークラス)の利用例
class OuterClass {
	int outerField;
	int c;
	
	//インナークラス
	class InnerClass {
		void method2() {
			c = 13;
		}

	}

	void method() {
		InnerClass ic = new InnerClass();
	}

	InnerClass ic3 = new InnerClass();
}

class Test95 {
	public static void main(String[] args) {
		// 全く無関係なクラスからは
		// InnerClass ic2 = new InnerClass();では
		// InnerClassのインスタンス生成できない
		OuterClass oc = new OuterClass();
		// 非staticメンバークラスのインスタンス化
		OuterClass.InnerClass oi = oc.new InnerClass();
	}
}
```

#**まとめ**
staticのインナークラスは**<font color = "#ff000">インナークラスではなく、メンバーという扱いになる</font>**。


[Nested Class](http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html)