Javaで用いられるthisとは、呼び出されたコンストラクタやオブジェクトを参照するために使われるものだ。
このページではthisの使い方についてお伝えしていこう。
thisとは?
Javaのthisは、呼び出されたコンストラクタやメソッドのオブジェクトを参照するために使われる予約語(keyword)である。
例えば、人を表すPersonクラスが定義されているとする。このコードをよく見て欲しい。
1 2 3 4 5 6 7 8 9 |
class Person { String name; void printName() { System.out.println(this.name); } void whatIsYourName() { this.printName(); } } |
このPersonクラスから作られたオブジェクトのnameの値を得るために、オブジェクトのフィールドやメソッドにアクセスする。アクセスする方法は、オブジェクト(object)を指定し、ドット演算子の次にフィールドやメソッドを書く。
では、呼び出された側のオブジェクト(object)のメソッド(whatIsYourName())の中で、同じ呼び出された側の中にあるフィールドやメソッドにアクセスするコードはどうなっているだろう。別のオブジェクトからではなく、同じオブジェクトの中からアクセスする場合である。この場合、objectの代わりにthisを使って、同じオブジェクト内にあることをを指定する。
どんな場合にthisが必要か
実は,Personクラスはthisを省略して書くことも可能である。省略するとこうなる。
1 2 3 4 5 6 7 8 9 |
class Person { String name; void printName() { System.out.println(name); } void whatIsYourName() { printMyName(); } } |
では、どんな場合にthisが必要になるのだろうか。それは、コンストラクタやメソッドで引数の名前とフィールドの名前が同じである場合だ。この場合は、引数とフィールドをなんらかの方法で区別しなければならない。thisを使うと同じ名前でも区別することができる。thisをつけたnameは、オブジェクトフィールドとなり、thisをつけなければ引数となる。
また,ローカル変数の名前とフィールド名前が同じでも、thisを使って区別できる。
サンプルプログラム
このサンプルプログラムは、Personクラスを実際に使ってこれまで出てきたいくつかのオブジェクトへのアクセスの方法を示している。
1 2 3 4 5 6 7 8 9 10 11 12 |
class Person {//[1] String name;//[2] Person(String name) {//[3] this.name = name;//[4] } void printName() {//[5] System.out.println("[6]" + this.name); } void whatIsYourName() {//[7] this.printName();//[8] } } |
1 2 3 4 5 6 7 8 |
class ThisSample { public static void main (String[] args) { Person object = new Person("太郎");//[10] System.out.println("[11]" + object.name); object.printName();//[12] object.whatIsYourName();//[13] } } |
実行結果
1 2 3 |
[11]太郎 [6]太郎 [6]太郎 |
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] クラスを定義する。
- [2] フィールドnameを定義する。
- [3]-[4] コンストラクタによりnameの初期値を設定する。
- [5]-[6] メソッドprintNameによりnameの値を表示する。
- [7]-[8] メソッドwhatIsYourNameにより,名前を表示する。
- [10] Personクラスのコンストラクタの引数(名前)に「太郎」を設定してobjectを作る。
- [11] objectのフィールドnameを表示する。
- [12] objectのprintNameメソッドを呼び出す。
- [13] objectのwhatIsYourNameメソッドを呼び出す。
まとめ
このページではJavaのthisの使い方についてお伝えした。オブジェクト指向のJavaではなくてはならないものなので、ぜひ理解していただければと思う。
すいません、現在Javaを学習している者なのですが、質問させていただきたい。
実行結果の2,3には、太郎の前に[6]は表示されないのでしょうか?
ご指摘いただきありがとうございます。
確かに結果表示の所で[6]が抜けております。該当箇所の記述を訂正いたしました。
引き続き、ご愛読のほど、よろしくお願いいたします。