【Java解説】自分自身のインスタンスを指す変数 “this” の使い方

こんにちは、湯本です。
 
今回は、thisを使って変数を呼びだしたところ以下の警告が表示されたので、改めて使用方法を整理したいと思います。

警告内容

static フィールド HowToThis.name には static にアクセスする必要があります

問題ソース

public class HowToThis {

	static String name = "ルーカス"; // static変数

	/**
	 * コンストラクタ
	 */
	public HowToThis() {
		String name = "スピルバーグ";
		System.out.println(name); 
		System.out.println(this.name); // ここで警告
	}
}

原因と解決方法

static変数にアクセスするのに、”クラス名.変数名”ではなく”this.変数名”でアクセスしていたことが原因でした。
 
ソースを以下のように修正し、警告が表示されないことを確認します。

System.out.println(HowToThis.name);

thisの使い分け

フィールド変数、ローカル変数、パラメーター変数の変数名が重複する場合、以下のようにフィールド変数の前にthis.を明示し明確に区別します。

/**
 * HowToThisクラス
 */
public class HowToThis {

	String name = "ルーカス";

	/**
	 * コンストラクタ
	 */
	public HowToThis() {
		String name = "スピルバーグ";
		System.out.println(name); // ローカル変数
		System.out.println(this.name); // フィールド変数
	}

	/**
	 * コンストラクタ
	 * @param name 名前
	 */
	public HowToThis(String name) {
		System.out.println(name); // パラメータ変数
		System.out.println(this.name); // フィールド変数
	}

	/**
	 * 名前を表示する
	 */
	public void callName1() {
		String name = "スコセッシ";
		System.out.println(name);  // ローカル変数
		System.out.println(this.name); // フィールド変数
	}

	/**
	 * 名前を表示する
	 * @param name 名前
	 */
	public void callName2(String name) {
		System.out.println(name);  // パラメータ変数
		System.out.println(this.name); // フィールド変数
	}
}

/**
 * メインクラス
 */
public class HowtoThisMain {

	public static void main(String[] args) {

		HowToThis htt1 = new HowToThis();
		HowToThis htt2 = new HowToThis("コッポラ");

		/**
		 * メソッドの呼び出し
		 */
		htt1.callName1();
		htt2.callName2("キューブリック");

	}
}

実行結果は、以下のとおりです。
スピルバーグ
ルーカス
コッポラ
ルーカス
スコセッシ
ルーカス
キューブリック
ルーカス

thisとは

thisとは、明示的な宣言なしにすべてのクラスで使うことができる予約語になります。
 
クラス内での変数名の検索では、フィールド変数よりもローカル変数とパラメーター変数を優先するため、変数名が重複する場合フィールド変数名の前にthis.を明示し区別します。

まとめ

いかがでしたでしょうか。
 
this.は頻繁に使用されるため誰かに教わらなくても感覚的に使用できてしまうと思います。今回改めて使い方を整理し、僕自身「なんとなくわかっていた」から「明確にわかった」に変わりました。
 
正しい知識を持ってプログラムを書き、エンジニアとして成長していきたいと思います。
 
 
 
 
《関連記事》

Listで構文エラー
技術
2023.3.1(Wed)

【エラー解決方法】Listで構文エラーが発生したときの対処法

#プログラム#Java

MappingException
技術
2022.12.21(Wed)

【エラー解決方法】Entity追加時にMappingException Unknown entityが発生!?を解決する方法

#Java#データベース

replaceAllでエラー
技術
2022.1.21(Fri)

【エラー解決方法】JavaのreplaceAllでエラーが出たときの対処法

#プログラム#Java

記事をシェア
MOST VIEWED ARTICLES