thisとは?いつ使うの?使い方についても by Javaプログラミング初心者vol.45

スポンサーリンク
this Java攻略

前回の記事で、thisについてこう書いた。

この「this」は現在のオブジェクトを参照するように指示しているもの。
もしクラス内に同じ変数名があったときに、thisを使うか使わないかで違う実行結果が出ることがある。

自分で書いておきながらあまりピンとこないから、具体的なイメージができるように今回は「this」について掘り下げていこうと思う。

 

スポンサーリンク

thisの役割

 

thisは現時点のクラスのオブジェクトを常に指し示すもの。

もしクラス内に同じ変数を持つものがあったら、メソッド内に書かれたコードが優先されてしまう。

でもthisを使うことで同じ変数を使用しても、異なる情報を表示することができる。

文字よりコードで確認したほうが早い。

 

 

SetterとGetterを使ったコードで確認

 

同じ変数がない場合

 

GetterとSetterを使ったプログラミングで、以下のコードを作った。
クラスのファイルは自作のGetterSetterクラスだけのものと、メインメソッドがあるクラスとで別々に用意した。

これは前回でも使ったもの。

〈クラスファイル〉

public class GetterSetter {
private int age;

public void setAge(int A) {
this.age=A;
}
public int getAge() {
return age;
}
}

ピンクがクラス内に入力したコード。

〈メインクラスファイル〉

public class GetterSetterUse {

public static void main(String[] args) {
GetterSetter gs = new GetterSetter();
gs.setAge(10);

}

}

Setterに注目。

public void setAge(int A) {
this.age=A;
}

ここではthisを使っているが、じつはここは「age=A;」とthisを使わなくても問題ない。
なぜなら、ここで設定した()内の「int A」はGetterSetterクラス内で他に使用されていない。

ここでの「this.age=A」と「age =A」は同じ意味で、どちらのコードで実行してもエラーは出ず同じ結果になる。

 

同じ変数が使われている場合

 

public class GetterSetter {
private int age;

public void setAge(int age) {
this.age=age;
}
public int getAge() {
return age;
}
}

 

上のコードは、「private int age;」と、「int age」が使われているのにもかかわらずsetterのメソッドでも「int age」が再び宣言されている。

GetterSetterクラスと同じ変数が使われているということは、この「int age」がGetterSetterのクラス直下に書かれたものsetAgeの中に書かれたもので区別される必要がある。

 

同じ変数名があるとメソッドの中で設定したほうが優先される。

 

区別されないと、setAgeの{}内が「age=age;」となってしまって同じものを指し、意味のないものになる。

 

どうやって区別するのかというと、「this」を使う。

この「this」を付けることで、「this.age」の「age」はGetterSetterクラスに直接書かれた「private int age」の「age」を指し示す

なぜなら、最初に書いた通り「thisは現時点のクラスのオブジェクトを常に指し示すもの。」だから。

〈流れ〉

左側のageはクラス直下の「private int age」を指し示したい
右側のageはsetAgeメソッド内の「int age」を指し示す。

だけどage=ageじゃ同じものを指し示すことになって意味がない。

「this」を使って、左側のageが「private int age」の「age」だと指し示す。

同じ変数名のageでも区別できた。

 

同じ変数が使われていないものと比べたら分かりやすい。

変数名が違えば区別する必要はないから「this」はいらない。

ちなみに

 

もし「this」を使わずに、「age=age」で実行すると、エラー表示は出ないけど「0」と出力されるだけ。

今回は「int」を使っているが、もし文字列を表す変数の型の「String」を使っていれば、「null」と表示される。

nullはゼロという意味。

 

同じクラスファイル内で使ってみる

 

GetterとSetterを使って「this」を使う方法について見てきた。

GetterとSetterを使わなくても、「this」は使うことはできる。

こっちの方が簡単そうだからこっちを先にすれば良かった。

thisを使わなかった場合

 

public class OnajiGetterSetter {
int ABC=5;

public static void main(String[] args) {
int ABC=10;
System.out.println(ABC);

}

}

「OnajiGetterSetter」というクラスファイルを作った。
その直下に「int ABC=5;」と入力。

更にメインメソッド内に同じ変数名で「int ABC=10;」と書いた。

このまま「ABCの値を出力」すると、メインメソッドに書かれた「int ABC=10;」だけ反映される。

 

thisを使って同じ変数名でも違うデータを表示させる

 

この「int ABC=5;」というデータを表示させるために、まず新しくクラスを作る。

直接メインメソッド内で「System.out.println(this.ABC);」とすることはできなかった。

エラー。

thisは「static」があるメソッドの中では使用することができないから、メインメソッド内で直接使うとエラーを起こす。

public class OnajiGetterSetter {

public static void main(String[] args) {

XYZ Yeah = new XYZ();
Yeah.LMN();

}

}
class XYZ{
int ABC =5;

void LMN() {
int ABC=10;

System.out.println(ABC);
System.out.println(this.ABC);
}
}

XYZクラスの中にLMNというメソッドを作ってみた。

 

 

新たに「XYZ」というクラスを「OnajiGetterSetter」の外側に作成。
LMN」というメソッド名を作って、その中でABCの値を出力させるコードを書いた。

 

XYZクラス内に書かれたLMNメソッドの中には「int ABC=10;」とある。
System.out.println(ABC);」と書いたらLMNメソッドで設定したABCの値の「10」が表示されることになる。

 

一方で「int ABC =5;」は同じXYZクラスの中には書かれているが、LMNメソッドの外側にある。
そこで、「this」を使って「このABCはクラス直下にあるint ABC =5;のABCを指してるよ」と指示してあげる。

System.out.println(this.ABC);

これで「int ABC=5;」の「5」が表示されることになる。

 

あとはメインメソッド内でXYZのオブジェクトを作成して、LMNメソッドを呼び出すだけでOK。

10
5

と実行したら表示される。

 

今回はthisを使っているからメソッドを作るときにstaticは使ってないよ。

最後に

 

コンストラクタとかいろんな用語が出てくるけど、用語は後で良いやって思っちゃってる今日この頃。

 

独学でやると間違って覚えそうだから怖い。

しかも次に何やったらいいのか分からないから困る。
習得しないといけない事は山のようにあるんだけど・・・。

また別の用法で「this」が出てくればその時はその時でまた学習しよう。

このエントリーをはてなブックマークに追加

コメント

タイトルとURLをコピーしました