前回の記事で、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に注目。
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は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);」とすることはできなかった。
エラー。
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というメソッドを作ってみた。
メソッドの作り方はこちらを参考
⇒自分で作ったクラスの中にメソッドを作る方法 by Javaプログラミング初心者 Vol.40
新たに「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。
オブジェクトを作ってメソッドを呼び出す方法は以下参照
自分で作ったメソッドをオブジェクトを作って呼び出す by Javaプログラミング初心者 Vol.41
10
5
と実行したら表示される。
今回はthisを使っているからメソッドを作るときにstaticは使ってないよ。
最後に
コンストラクタとかいろんな用語が出てくるけど、用語は後で良いやって思っちゃってる今日この頃。
独学でやると間違って覚えそうだから怖い。
しかも次に何やったらいいのか分からないから困る。
習得しないといけない事は山のようにあるんだけど・・・。
また別の用法で「this」が出てくればその時はその時でまた学習しよう。
コメント