Java this キーワード
1. Java this キーワードとは?
Javaにおける this キーワードは、メソッドまたはコンストラクタ内において、「現在のオブジェクト(自分自身のインスタンス)」を参照するために使用されます。
this キーワードは、クラスの属性(アトリビュート / フィールド)と、メソッドやコンストラクタのパラメータ(引数)が同じ名前である場合に、その混同を避けるために頻繁に利用されます。
2. クラス属性へのアクセス
コンストラクタやメソッドのパラメータが、クラス内の変数(インスタンス変数)と同じ名前を持つことがあります。この場合、そのメソッド内ではパラメータがクラス変数を一時的に隠蔽(シャドウイング)してしまいます。
パラメータではなく、クラス変数を明示的に指し示すには、this キーワードを使用します。
例:
public class Main {
int x; // クラス変数(フィールド)x
// 1つのパラメータ x を持つコンストラクタ
public Main(int x) {
this.x = x; // this.x はクラス変数の x を指す
}
public static void main(String[] args) {
// Mainクラスのオブジェクトを作成し、コンストラクタに 5 を渡す
Main myObj = new Main(5);
System.out.println("x の値 = " + myObj.x);
}
}出力結果:
x の値 = 5 ヒント:this.x = x; は、「this.x(クラス変数)に x(パラメータの値)を代入する」という意味です。
もし this を使わずに x = x; と記述した場合、パラメータの x 自身に x を代入することになり、クラス変数は初期化されないまま(デフォルト値の 0)になってしまいます。
3. 別のコンストラクタの呼び出し
同じクラス内の別のコンストラクタを呼び出すために this() を使用することもできます。
これは、デフォルト値を設定したい場合や、初期化コードを重複させずに再利用(DRY原則の適用)したい場合に非常に有用です。
例:
public class Main {
int modelYear;
String modelName;
// パラメータ1つのコンストラクタ
public Main(String modelName) {
// コードを再利用し、デフォルトの製造年を設定するために2引数のコンストラクタを呼び出す
this(2020, modelName);
}
// パラメータ2つのコンストラクタ
public Main(int modelYear, String modelName) {
// 'this' を使用してクラス変数に値を代入する
this.modelYear = modelYear;
this.modelName = modelName;
}
// 車の情報を出力するメソッド
public void printInfo() {
System.out.println(modelYear + " " + modelName);
}
public static void main(String[] args) {
// モデル名のみを指定して車を作成(デフォルトの製造年が使用される)
Main car1 = new Main("Corvette");
// 製造年とモデル名の両方を指定して車を作成
Main car2 = new Main(1969, "Mustang");
car1.printInfo();
car2.printInfo();
}
}出力結果:
2020 Corvette
1969 Mustang 注記:this() によるコンストラクタの呼び出しは、コンストラクタ内の最初の文(ステートメント)でなければなりません。
4. this をいつ使うべきか?
- 名前の競合解消: コンストラクタやメソッドのパラメータ名がクラス変数と同じ場合、
thisを使用してクラス変数を正しく更新します。 - コンストラクタの再利用: 同じクラス内の別のコンストラクタを呼び出し、初期化処理を共通化する場合に使用します。