問題の歴史:
Javaでは、他のオブジェクト指向言語と同様に、現在のオブジェクトへのポインタメカニズムが適用されます。Javaでは、現在のインスタンスを明示的に参照するために、thisキーワードが導入されています。
問題:
thisを使用しない場合、ローカル変数(例えば、コンストラクタやメソッドのパラメータ)がインスタンスフィールドを隠すあいまいな状況が発生することがあります。また、現在のオブジェクトを別のコンポーネントに渡す必要がある場合や、クラス内でそのメソッドを呼び出す必要がある場合もあります。
解決策:
thisキーワードは、以下の目的で使用されます:
例:
public class Person { private String name; public Person(String name) { this.name = name; // フィールドとパラメータの競合を解決 } }
主な特徴:
thisなしで非静的メソッドとフィールドにアクセスできますか?
はい。クラスのメソッド内ではthisを使用する必要はありません:コンパイラはデフォルトで現在のオブジェクトの非静的メンバーにアクセスします。thisの使用が必須になるのはあいまいさがある場合(例えば、コンストラクタのパラメータがフィールドを隠す場合)です。
thisは静的メソッドまたは静的ブロックで使用できますか?
いいえ。静的コンテキストではthis変数は存在せず、静的要素は特定のインスタンスに依存しないためです。
this(...)(オーバーロードされたコンストラクタ)の呼び出しは、コンストラクタの最初の行でなければなりませんか?
いいえ。thisを使用して他のコンストラクタを呼び出す場合、それはコンストラクタの最初の行でなければならず、さもなければコンパイルエラーが発生します。
開発者がthisを使用せずにコンストラクタを書くと、インスタンスフィールドが正しく初期化されません:
public class A { private int a; public A(int a) { a = a; } // エラー! }
利点:
欠点:
コンストラクタが明示的にthisを使用して名前の衝突を解決し、フィールドを初期化します:
public class A { private int a; public A(int a) { this.a = a; } }
利点:
欠点: