お知らせ
2023.12.5(Tue)
目次
こんにちは、湯本です。
今回は、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.を明示し明確に区別します。
/**
* 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.は頻繁に使用されるため誰かに教わらなくても感覚的に使用できてしまうと思います。今回改めて使い方を整理し、僕自身「なんとなくわかっていた」から「明確にわかった」に変わりました。
正しい知識を持ってプログラムを書き、エンジニアとして成長していきたいと思います。
《関連記事》