第2章 クラスの基本

2.5 thisキーワードについて

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

2.5.1 thisキーワードとは

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

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

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

Computer5クラス
1class Computer5 {
2  String os;
3  int memory;
4 
5  //メッセージとパソコン情報を表示するメソッド
6  public void showComputer(){
7    System.out.println("パソコンの情報を表示します。");
8    //クラス内のshowメソッドを呼び出す
9    show();
10  }
11 
12  //フィールド変数の値を表示するメソッド
13  public void show(){
14    System.out.println("OSは「" + os + "」です。");
15    System.out.println("メモリサイズは「" + memory + "MByte」です。");
16  }
17 
18  //フィールド変数よりOSの値を取得する
19  public String getOs(){
20    return os;
21  }
22 
23  //フィールド変数よりMemoryの値を取得する
24  public int getMemory(){
25    return memory;
26  }
27 
28  //フィールド変数に値を設定するメソッド
29  public void setOsMemory(String name,int size){
30    os = name;
31    memory = size;
32    System.out.println("OSを「" + name + "」に、メモリサイズを「" + size + "MByte」に変更しました。");
33  }
34}

この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) にチェックを入れる

1package jp.co.f1.basic.ch02;
2 
3class Computer9 {
4  String os;
5  int memory;
6 
7  // メッセージとパソコン情報を表示するメソッド
8  public void showComputer() {
9    System.out.println("パソコンの情報を表示します。");
10    // クラス内のshowメソッドを呼び出す
11    this.show(); // thisキーワードを使用
12  }
13 
14  // フィールド変数の値を表示するメソッド
15  public void show() {
16    System.out.println("OSは「" + this.os + "」です。"); // thisキーワードを使用
17    System.out.println("メモリサイズは「" + this.memory + "MByte」です。"); // thisキーワードを使用
18  }
19 
20  // フィールド変数よりOSの値を取得する
21  public String getOs() {
22    return this.os; // thisキーワードを使用
23  }
24 
25  // フィールド変数よりMemoryの値を取得する
26  public int getMemory() {
27    return this.memory; // thisキーワードを使用
28  }
29 
30  // フィールド変数に値を設定するメソッド
31  public void setOsMemory(String os, int memory) {
32    this.os = os; // thisキーワードを使用
33    this.memory = memory; // thisキーワードを使用
34    System.out.println("OSを「" + os + "」に、メモリサイズを「" + memory + "MByte」に変更しました。");
35  }
36}
37 
38public class ThisKeyWord {
39 
40  public static void main(String[] args) {
41    // Computer9クラスからオブジェクトを生成
42    Computer9 com = new Computer9();
43 
44    // オブジェクトのフィールド変数に、各データを格納
45    com.os = "WindowsXP";
46    com.memory = 2048;
47 
48    // メソッドを利用してフィールド変数に格納しているデータを取得
49    System.out.println("パソコンのOSは「" + com.getOs() + "」です。");
50    System.out.println("メモリサイズは「" + com.getMemory() + "MByte」です。");
51 
52    // オブジェクトのフィールド変数に、各データを再格納
53    com.setOsMemory("Windows2000", 512);
54 
55    // showComputerメソッドを呼び出してフィールド変数の値を確認
56    com.showComputer();
57  }
58}

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

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

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

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

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

NEXT>> 2.6 本章のまとめ

f