Javaのthisキーワード徹底解説:実践的な用法とコンストラクタ活用
Java thisキーワード完全ガイド
この記事では、Javaのthisキーワードの目的、よくあるシナリオ、ベストプラクティスを明確な実例とともに解説します。
thisとは?
Javaにおいて、thisキーワードはクラスの現在のインスタンスを参照します。インスタンスメソッドやコンストラクタ内で、同じ名前を持つインスタンス変数とパラメータを区別するために最もよく使用されます。
class Main { int instVar; Main(int instVar){ this.instVar = instVar; System.out.println("this reference = " + this); } public static void main(String[] args) { Main obj = new Main(8); System.out.println("object reference = " + obj); } }
出力:
this reference = Main@23fc625e object reference = Main@23fc625e
thisと変数objの両方が同じオブジェクトインスタンスを指しており、thisが単に現在のオブジェクトへの参照であることを確認できます。
thisを使用する場面
このキーワードはいくつかの一般的なコーディングパターンで非常に役立ちます:
変数名の曖昧さを解消
Javaではパラメータとインスタンス変数が同じ名前を持つことを許可しますが、thisなしではコンパイラがどちらを意図しているか判断できません。例えば:
class MyClass { int age; MyClass(int age){ age = age; } }
上記のコンストラクタでは、age = ageはパラメータを自身に代入するだけで、インスタンス変数は変更されません。thisを使うと代入が明確になります:
class Main { int age; Main(int age){ this.age = age; } public static void main(String[] args) { Main obj = new Main(8); System.out.println("obj.age = " + obj.age); } }
出力:
obj.age = 8
パラメータ名がインスタンス変数と異なる場合、コンパイラは暗黙的にthisを使用します:
class Main { int age; Main(int i) { age = i; } }
これはthis.age = iと同等です。
ゲッターとセッターでのthisの使用
セッターとゲッターでは、フィールドと同じ名前のパラメータを受け取ることがよくあります。thisにより正しい変数が対象になります:
class Main { String name; // setter void setName(String name) { this.name = name; } // getter String getName(){ return this.name; } public static void main(String[] args) { Main obj = new Main(); obj.setName("Toshiba"); System.out.println("obj.name: " + obj.getName()); } }
出力:
obj.name: Toshiba
- セッター内でパラメータをフィールドに代入
- ゲッター内でフィールドの値を返却
this()によるコンストラクタのオーバーロード
あるコンストラクタが別のコンストラクタに処理を委譲する場合、this()で明示的なコンストラクタ呼び出しを行います:
class Complex { private int a, b; private Complex(int i, int j){ this.a = i; this.b = j; } private Complex(int i){ this(i, i); // 2引数コンストラクタを呼び出し } private Complex(){ this(0); // 1引数コンストラクタを呼び出し } @Override public String toString(){ return this.a + " + " + this.b + "i"; } public static void main(String[] args) { Complex c1 = new Complex(2, 3); Complex c2 = new Complex(3); Complex c3 = new Complex(); System.out.println(c1); System.out.println(c2); System.out.println(c3); } }
出力:
2 + 3i 3 + 3i 0 + 0i
重要なポイント:
- コンストラクタ間の重複コードを削減
- コンストラクタチェーン時のわずかなパフォーマンスオーバーヘッドに注意
注意: this()による明示的なコンストラクタ呼び出しは、コンストラクタの最初の文でなければなりません。
thisを引数として渡す
thisは現在のオブジェクトへの参照であるため、他のメソッドに渡すことができ、それらのメソッドがオブジェクトの状態を変更できます:
class ThisExample { int x; int y; ThisExample(int x, int y) { this.x = x; this.y = y; System.out.println("addTwo()メソッドにthisを渡す前:"); System.out.println("x = " + this.x + ", y = " + this.y); add(this); // 現在のインスタンスを渡す System.out.println("addTwo()メソッドにthisを渡した後:"); System.out.println("x = " + this.x + ", y = " + this.y); } void add(ThisExample o){ o.x += 2; o.y += 2; } } class Main { public static void main(String[] args) { new ThisExample(1, -2); } }
出力:
Before passing this to addTwo() method: x = 1, y = -2 After passing this to addTwo() method: x = 3, y = 0
ここでは、addメソッドが同じオブジェクトインスタンスを受け取り、そのフィールドを直接更新しています。
Java
- C# this キーワードをマスターする
- Java演算子をマスター:種類、構文、実践例
- Javaコメント:種類、使い方、ベストプラクティス
- Java拡張forループをマスター:構文、例、ベストプラクティス
- Javaコンストラクタをマスター:種類、使い方、実践例
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Javaのthisキーワード徹底解説:実践的な用法とコンストラクタ活用
- Javaのfinalキーワード完全解説:変数、メソッド、クラスでの活用法
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Javaカプセル化マスター:データ隠蔽の実践ガイド
- Java無名インナークラス完全ガイド:定義、構文、実践例