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