第2章 クラスの基本

2.5 thisキーワードについて

クラス内に定義したメンバで使用できる「this」キーワードについて説明していきます。

2.5.1 thisキーワードとは

クラス内に宣言しているメンバの頭に「this.」を付けることで、「オブジェクト自身のフィールド変数」、「オブジェクト自身のメソッド」と言う意味が追加されます。thisキーワードを利用することで他の変数名(引数の変数またはローカル変数)と区別し一目で、クラス内のメンバである事が分かるようになります。
以下に基本構文を示します。

2.5.2 thisキーワードを使っていないプログラムの再確認

これまでに学習してきたクラスでは以下のようにソースコードを記述してきたと思います。2.3.6項で作成したComputer5クラスを例にソースコードを示します。

Computer5クラス
  class Computer5 {
    String os;
    int memory;

    //メッセージとパソコン情報を表示するメソッド
    public void showComputer(){
      System.out.println("パソコンの情報を表示します。");
      //クラス内のshowメソッドを呼び出す
      show();
    }

    //フィールド変数の値を表示するメソッド
    public void show(){
      System.out.println("OSは「" + os + "」です。");
      System.out.println("メモリサイズは「" + memory + "MByte」です。");
    }

    //フィールド変数よりOSの値を取得する
    public String getOs(){
      return os;
    }

    //フィールド変数よりMemoryの値を取得する
    public int getMemory(){
      return memory;
    }

    //フィールド変数に値を設定するメソッド
    public void setOsMemory(String name,int size){
      os = name;
      memory = size;
      System.out.println("OSを「" + name + "」に、メモリサイズを「" + size + "MByte」に変更しました。");
    }
  }
  

このComputer5クラスを見てもらうと分かりますが、どこにも「this」というキーワードは使用していないことが分かります。特にthisキーワードを使わなくても問題はありませんが、thisキーワードを利用することで便利になることがあります。
では次項で「this」キーワードを利用したプログラムを紹介します。

2.5.3 thisキーワードを使ったプログラム

thisキーワードを利用したクラスのオブジェクトを生成し、そのオブジェクトメンバにアクセスするプログラムです。

① ソース・フォルダー: myproj_basic/src
② パッケージ: jp.co.f1.basic.ch02
③ 名前: ThisKeyWord
④ 作成するメソッド・スタブの選択: public static void main(String[] args) にチェックを入れる

  package jp.co.f1.basic.ch02;

  class Computer9 {
    String os;
    int memory;

    // メッセージとパソコン情報を表示するメソッド
    public void showComputer() {
      System.out.println("パソコンの情報を表示します。");
      // クラス内のshowメソッドを呼び出す
      this.show(); // thisキーワードを使用
    }

    // フィールド変数の値を表示するメソッド
    public void show() {
      System.out.println("OSは「" + this.os + "」です。"); // thisキーワードを使用
      System.out.println("メモリサイズは「" + this.memory + "MByte」です。"); // thisキーワードを使用
    }

    // フィールド変数よりOSの値を取得する
    public String getOs() {
      return this.os; // thisキーワードを使用
    }

    // フィールド変数よりMemoryの値を取得する
    public int getMemory() {
      return this.memory; // thisキーワードを使用
    }

    // フィールド変数に値を設定するメソッド
    public void setOsMemory(String os, int memory) {
      this.os = os; // thisキーワードを使用
      this.memory = memory; // thisキーワードを使用
      System.out.println("OSを「" + os + "」に、メモリサイズを「" + memory + "MByte」に変更しました。");
    }
  }

  public class ThisKeyWord {

    public static void main(String[] args) {
      // Computer9クラスからオブジェクトを生成
      Computer9 com = new Computer9();

      // オブジェクトのフィールド変数に、各データを格納
      com.os = "WindowsXP";
      com.memory = 2048;

      // メソッドを利用してフィールド変数に格納しているデータを取得
      System.out.println("パソコンのOSは「" + com.getOs() + "」です。");
      System.out.println("メモリサイズは「" + com.getMemory() + "MByte」です。");

      // オブジェクトのフィールド変数に、各データを再格納
      com.setOsMemory("Windows2000", 512);

      // showComputerメソッドを呼び出してフィールド変数の値を確認
      com.showComputer();
    }
  }
  

実行結果
※2.3.6のサンプルと同じ結果になります。

解説
今回のポイントはクラス内でのメンバアクセス方法です。フィールド変数とメソッドの前に「this.」と付いている点に注目して下さい。ソースコードを抜粋すると以下の部分が該当します。

thisキーワードは「オブジェクト自身」を表すので、結果「オブジェクト自身のshowメソッド」、「オブジェクト自身のフィールド変数os」という意味になります。
もう1つ重要なポイントがあります。それは31~35行目の「setOsMemoryメソッド」の引数名です。

フィールド変数と同じ名前の引数を設定しています。thisを付けるとオブジェクト自信のフィールド変数osと引数の変数osと区別できるようになり、同じ名前の変数があってもメソッド内で使用可能になります。
別に無理に同じ名前を利用しなければ「this」を使用しなくてもいいのですが、引数をフィールド変数と同じ名前にすることで、引数の意味が分かりやすくなります。

ポイント
  • thisキーワードを利用することで、オブジェクト自身のメンバと明確に表すことができる。

NEXT>> 2.6 本章のまとめ