Java 速習チュートリアル

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 を使用してクラス変数を正しく更新します。
  • コンストラクタの再利用: 同じクラス内の別のコンストラクタを呼び出し、初期化処理を共通化する場合に使用します。