Javaのプログラムで頻繁に利用される「this」は自分のクラスのインスタンス変数やコンストラクタへのアクセス時に使用されます。
本記事では、Javaプログラムにおける「this」の基本的な使い方と意味合いについてご紹介していきたいと思います。
目次
Javaのthisとは
インスタンス自身のフィールドやメソッドを呼び出す際に利用する
thisの基本的な使い方としては、インスタンス自身のフィールド値やメソッドを呼び出す際に利用します。
thisを用いることで、明示的に自分自身のインスタンスのフィールドやメソッドを利用することを記述出来ます。
別のコンストラクタを呼び出す際に利用する
コンストラクタ内で別のコンストラクタを呼び出す際には「this()」を利用します。
引数の数を変えることによって同名コンストラクタを定義し、「this()」を用いて別コンストラクタを呼び出す方法が一般的です。
Javaサンプルコードでthisの使い方を確認しよう
ここからはサンプルコードを掲載しながらthisの使い方を実際のコードでご紹介していきます。
まずは最も基本となる自身のフィールドを呼び出す方法
フィールドに設定された値を表示するサンプルコードで確認してみます。
import java.util.*; public class Main { public static void main(String[] args) throws Exception { SampleClass sample = new SampleClass(); // ※1 sample.execute(); // ※2 } } class SampleClass { private String str = "Tiger"; ※3 public void execute() { System.out.println(str); // ※4 System.out.println(this.str); // ※5 } }
サンプルコードを実行した結果は下記の通りとなります。
Tiger Tiger
まず※1の行でSampleClassのインスタンスを作成しています。
※2の行でインスタンス化したSampleClassのexecuteメソッドを実行しています。
※4と※5は「this」が記述されているかどうかの違いがありますが、※3の行のフィールド値を表示するコードとなっており、上記サンプルでの出力結果は全く同じ結果となります。
このように「this」メソッドは基本的な使い方をする場合、省略することも可能な点がポイントです。
メソッド内で同名の変数を利用する場合にはthisで明示する必要がある
一方、「this」を必ず明記しなければいけないケースとしては同名の変数を利用する場合が挙げられます。
サンプルコードで確認していきましょう。
import java.util.*; public class Main { public static void main(String[] args) throws Exception { SampleClass sample = new SampleClass(); sample.execute("Dog"); // ※1 } } class SampleClass { private String str = "Tiger"; // ※2 public void execute(String str) { // ※3 System.out.println(str); // ※4 System.out.println(this.str); // ※5 } }
サンプルコードを実行した結果が下記の通りとなります。
Dog Tiger
1つ目でご紹介したサンプルコードと出力結果が変わっていることがご確認頂けます。
1つ目のサンプルコードではSampleClassのexecuteメソッドに引数の設定がありませんでしたが、2つ目のサンプルコードではexecuteメソッドにフィールドと同名の変数が引数として設定されています。
同名の変数が定義されている場合には、「this」を利用することで参照する変数を明示することが可能となります。
まず※1の行でexecuteメソッドの引数に設定するStringの値を「Dog」と定義しています。
※4と※5の行では1つ目のサンプルコード同様、変数「str」の値を出力するコードが記述されていますがなぜ出力結果が変わるのでしょうか?
メソッド内でフィールドと同名の変数を利用する場合には「this」を記述しない場合、ローカルで定義した変数が優先されます。
今回の場合、※3の行で定義された「str」の値、つまり「Dog」が優先される形となります。
※4の行では「this」が記述されていないため「Dog」が結果として出力されることになります。
一方、※5の行では「this」を記述しているため、※2の行で定義されたSampleClassのフィールド「str」の値「Tiger」が結果として出力されることになります。
Javaコンストラクタで利用するthis()を理解しよう
Javaでは上記でご紹介した「this」とは別に「this()」との記述が頻繁に利用されます。
コンストラクタの中で別のコンストラクタを呼び出す際に利用する「this()」をサンプルコードで確認していきましょう。
this()を利用して別のコンストラクタを呼び出す
import java.util.*; public class Main { public static void main(String[] args) throws Exception { AnimalClass animal1 = new AnimalClass(); // ※1 AnimalClass animal2 = new AnimalClass("ハチ"); // ※2 AnimalClass animal3 = new AnimalClass("ポチ", 5, "犬"); // ※3 System.out.println("引数を指定しないコンストラクタの呼び出し結果"); animal1.execute(); System.out.println("引数を1つだけ指定したコンストラクタの呼び出し結果"); animal2.execute(); System.out.println("引数を全て指定したコンストラクタの呼び出し結果"); animal3.execute(); } } class AnimalClass { private String name; private int age; private String type; AnimalClass() { // ※4 this("unknown", 99999, "不明"); } AnimalClass(String name) { // ※5 this(name, 99999, "不明"); } AnimalClass(String name, int age, String type) { // ※6 this.name = name; this.age = age; this.type = type; } public void execute() { System.out.println("name= " + name); System.out.println("age= " + age); System.out.println("type= " + type); } }
サンプルコードを実行した結果が下記の通りとなります。
引数を指定しないコンストラクタの呼び出し結果 name= unknown age= 99999 type= 不明 引数を1つだけ指定したコンストラクタの呼び出し結果 name= ハチ age= 99999 type= 不明 引数を全て指定したコンストラクタの呼び出し結果 name= ポチ age= 5 type= 犬
※1の行では引数を指定しない状態でインスタンスを作成しています。
サンプルコードの場合、※4のコンストラクタが呼び出されることになりますがコンストラクタの中で「this()」を利用していることがご確認頂けます。
「this()」に引数を指定することでJavaの「オーバーロード」の機能を利用して、引数の数に応じたコンストラクタ(※6)を呼び出しています。
引数を指定した状態でインスタンスを作成している※3の行では、いきなり※6の該当するコンストラクタが呼び出され、出力結果として指定した名前や年齢といった情報が表示されています。
また、応用として名前だけがわかる状態でインスタンスを作成したケースとして※2の行を掲載しています。
引数を1つだけ指定した場合には※5のコンストラクタが呼び出され、「this()」を用いて不明な部分の引数を初期値として設定しておき、最終的に※6のコンストラクタが呼び出される結果となっています。
さいごに:thisはインスタンス自身を呼び出すと覚えておこう
本記事では、Javaプログラミングにおける「this」の定義と使い方をご紹介していきました。
thisの使い方をしっかりと把握しておくことで、よりオブジェクト指向への理解も深まります。
きちんとthisを使えば可読性の高いコードを記述出来ることにも繋がりますので、しっかりと理解出来るように学習してみてください。
thisはインスタンス自身を表すJavaの言語仕様として定義された予約語(keyword)となります。