thisキーワード


明示的にオブジェクトを指す

JAVA言語の仕様でC++と違う重要な部分の一つがthisキーワードです
thisキーワードは現在実行中のカレントオブジェクトを表します

thisキーワードを使用することによって、インスタンスメソッドのメンバ変数をより明確に表現できます
インスタンスメソッドは、オブジェクトに関連付けされるのでオブジェクトの指定は通常しません
しかし、パラメータの変数名とメンバ変数が同名の場合、混乱が生じます
class LOVE_HINA {
	String name;
	int age;

	void write() {
		System.out.println(name + "\t" + age);
	}

	LOVE_HINA(String name , int age) {
		name = name;	//<-!?!?!?
		age = age;
	}
}

class test {
	public static void main(String args[]) {
		LOVE_HINA naru = new LOVE_HINA("成瀬川なる" , 17);
		LOVE_HINA sinobu = new LOVE_HINA("前原しのぶ" , 13);

		System.out.println("名前\t\t年齢");
		naru.write();
		sinobu.write();
	}
}
このプログラムは正常にコンパイルすることができます
しかし、実行するとnullが表示され、何も値が代入されていないことがわかります
問題はLOVE_HINAコンストラクタにあります

パラメータから受け取る変数とメンバ変数名が一致しています
メンバ変数はグローバルな変数ですが、このような場合はローカル変数が優先されます
つまり、メソッド内部で宣言された変数名が優先されてしまうため
LOVE_HINAコンストラクタの name , age 変数は常にパラメータの変数を指しています

メンバ変数とは別名にしてしまえば良いのですが、そうなるとプログラムの可読性が低下します
さらに、メソッドないで使われている変数がメンバ変数かローカル変数かがハッキリしません
JAVA言語はこれをthisキーワードを用いて解決しています

this.member;

こうすることで、現在実行中のカレントオブジェクトを明示的に表すことができます
つまり、thisはオブジェクトの代名詞のようなものです
thisキーワードをインスタンスメソッドの内部で用いれば、メンバ変数であることを明示的に表せます
class LOVE_HINA {
	String name;
	int age;

	void write() {
		System.out.println(name + "\t" + age);
	}

	LOVE_HINA(String name , int age) {
		this.name = name;
		this.age = age;
	}
}

class test {
	public static void main(String args[]) {
		LOVE_HINA naru = new LOVE_HINA("成瀬川なる" , 17);
		LOVE_HINA sinobu = new LOVE_HINA("前原しのぶ" , 13);

		System.out.println("名前\t\t年齢");
		naru.write();
		sinobu.write();
	}
}


コンストラクタからコンストラクタ呼び出し

thisキーワードにはもう一つ、注目すべき使用方法があります
それは、同一クラス内のオーバーロードされている別コンストラクタの呼び出しです

コンストラクタから別コンストラクタの呼び出しを行うことによって、一部の処理を完結化できることがあります
ただし、この方法によるthisキーワードの使用はコンストラクタ内の先頭に限定されます

this(args);

argsはパラメータを指定します、渡されたパラメータから適当なコンストラクタが呼び出されます
以下に代表的なコンストラクタからコンストラクタの呼び出しの例を示します
class LOVE_HINA {
	String name;
	char blood_type;
	int age;

	void write() {
		System.out.println(name + "\t"+ blood_type + "\t" + age);
	}

	LOVE_HINA(String name , int age) {
		this(name , '?' , age);
	}

	LOVE_HINA(String name , char blood_type , int age) {
		this.name = name;
		this.blood_type = blood_type;
		this.age = age;
	}
}

class test {
	public static void main(String args[]) {
		LOVE_HINA naru = new LOVE_HINA("成瀬川なる" , 'A' , 17);
		LOVE_HINA sinobu = new LOVE_HINA("前原しのぶ" , 13);

		System.out.println("名前\t\t血液型\t年齢");
		naru.write();
		sinobu.write();
	}
}
オーバーロードされているコンストラクタのうち
LOVE_HINA(String name , int age) {
		this(name , '?' , age);
	}
に注目してください。このthisキーワードはコンストラクタの代名詞的存在になっています
このコンストラクタから、thisキーワードによって再びコンストラクタを呼び出しています
パラメータが一致するのはもう一方のコンストラクタです
結果は次のようになります
名前            血液型  年齢
成瀬川なる      A       17
前原しのぶ      ?       13

this

インスタンスメソッドかコンストラクタ内で使用します
現在のオブジェクトを参照します

コンストラクタの先頭でのみ、オーバーロードされている別コンストラクタの呼び出しに使用できます



前のページへ戻る次のページへ