忍者ブログ
よくわからないことを調べて解説してみるブログ。

2017

0920
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2015

0527
・内部クラスのことをネステッドクラスと呼ぶ
・最上位のネストされていないクラスをトップレベルクラスと呼ぶ
・外部クラスから内部クラスのインスタンス変数へのアクセスは不可能。
・内部クラスから外部クラスメンバのアクセス方法は、
 インスタンスメソッド内では、外部クラス名.this.メンバメソッドまたはメンバ変数
・内部クラスのstaticメンバ変数はfinal修飾子が必須。
・内部クラスにstaticメソッドは定義できない
 (staticメソッドは、トップレベルクラスにのみ定義可能。)

上記ゆえに
・インスタンス化する内部クラスは外部クラスのインスタンス化を前提にしている
・thisは相対的な自身を指している

public class SameValInnerClassAndOuterClass {
	static final int sttnum = 3;
	int num = 0;
	void printNum() {
		System.out.println("-----------------Outer Class--------------------");
		System.out.println(num);													//	0
		System.out.println(this.num);// ここでのthisは、外部クラスを指す。			//	0
		System.out.println(SameValInnerClassAndOuterClass.this.num);				//	0

		System.out.println(sttnum);													//	3
		System.out.println(InnerClass.sttnum);										//	2
		System.out.println(SameValInnerClassAndOuterClass.sttnum);					//	3
		System.out.println(SameValInnerClassAndOuterClass.InnerClass.sttnum);		//	2

		// this.printNum(); 					// 当然無限ループ
		// this.new InnerClass().printNum();	// 当然無限ループ
	}
	class InnerClass {
		static final int sttnum = 2; // 内部クラスでは、static変数はfinal修飾子が必須。
//		static int getSttnum() { return sttnum;} // コンパイルエラー。staticメソッドはトップレベルクラスにのみ定義可能。
		int num = 1;
		void printNum() {
			System.out.println("-----------------Inner Class--------------------");
			System.out.println(num);												//	1
			System.out.println(this.num);// ここでのthisは、内部クラスを指す。		//	1
			System.out.println(SameValInnerClassAndOuterClass.this.num); //内部クラスを保持する外部クラスのメンバへはアクセス可能。
																					//	0

			System.out.println(sttnum);												//	2
			System.out.println(InnerClass.sttnum);									//	2
			System.out.println(SameValInnerClassAndOuterClass.InnerClass.sttnum);	//	2

			SameValInnerClassAndOuterClass.this.printNum();             // 内部クラスを保持する外部クラスへのメンバへはアクセス可能。

			System.out.println("-----------------Inner Class--------------------");
			System.out.println(SameValInnerClassAndOuterClass.sttnum);				//	3

			// SameValInnerClassAndOuterClass.printNum(); // static参照になるため、コンパイルエラー。
			// this.printNum();					// 当然無限ループ
		}
	}

	public static void main(String[] args) {
		SameValInnerClassAndOuterClass outerClass = new SameValInnerClassAndOuterClass();
		InnerClass innerClass = outerClass.new InnerClass();
		outerClass.printNum();
		innerClass.printNum();
		// System.out.println(SameValInnerClassAndOuterClass.this.num); // staticコンテキストではthisを利用できないと言われる。
	}
}
class TopLevel {
	static void TopLevelMethod(){ // staticメソッドは、トップレベルクラスにのみ定義可能。
	}
}
実行結果
-----------------Outer Class--------------------
0
0
0
3
2
3
2
-----------------Inner Class--------------------
1
1
0
2
2
2
-----------------Outer Class--------------------
0
0
0
3
2
3
2
-----------------Inner Class--------------------
3

拍手[0回]

PR
Post your Comment
Name:
Title:
Font:
Mail:
URL:
Comment:
Pass: Vodafone絵文字 i-mode絵文字 Ezweb絵文字
<< [OCJP]オブジェクト指向の設計 | HOME | [OCJP]ENUM型について忍者ブログ [PR] * Template by TMP >>
プロフィール
HN:
たんてーくん
性別:
非公開
フリーエリア
最新CM
[09/13 http://2017.gjpmall.net]
[09/13 http://www.bjpld8.com]
[09/12 http://2017.njpex.net]
[09/12 http://www.gjpmall.net]
[09/11 http://www.gjpmall.net]
ブログ内検索
忍者ブログ [PR]
* Template by TMP