第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キーワードを利用することで、オブジェクト自身のメンバと明確に表すことができる。