(1) Javaのthisとは?コンストラクタに出現する場合やメソッド引数に使われる場合もご紹介
(1-1) thisとは?
(1-2) 用途1:自分自身を指定【重要】
(1-3) 用途2:自クラスの別のコンストラクタを呼び出す
(1-4) 用途3:他オブジェクトに自身の参照を渡す
(1) Javaのthisとは?コンストラクタに出現する場合やメソッド引数に使われる場合もご紹介
(1-1) thisとは?
「this」は自オブジェクト内のメンバ変数やメソッドを表現する記述で、主に次の3つの用途があります。
public class IT0210_ThisKeyword1 { public static void main(String args[]) { //Person1クラスをインスタンス化 Person1 p1 = new Person1(); p1.setValue("Rainbow Planet",30); System.out.println("My name is "+p1.name+" and my age is "+p1.ag e); } } class Person1 { String name; int age; //(用途1)メンバ変数と引数の区別 void setValue(String name,int age) { this.name = name; this.age = age; } }
(図121)実行結果
nameとageはメンバ変数と引数で名前が重複しているため、メンバ変数側にはthisを付ける。
(1-3) 用途2:自クラスの別のコンストラクタを呼び出す
2つ目の用途として、自クラス内の別のコンストラクタを呼ぶ時に使います。
これはクラス内で複数のコンストラクタがある場合に(コンストラクタがオーバーロードされている)、あるコンストラクタから別のコンストラクタを呼ぶことができ、これは正式には「明示的なコンストラクタ呼び出し」といいます。
ルールとして、この記述は必ずコンストラクタの1行目に記載する必要があります。
(サンプルプログラム②)
public class IT0210_ThisKeyword2 { public static void main(String args[]) { //引数を6個全て与えて初期化 Person2 p2 = new Person2("Rainbow","Planet","Men",30,173.5,60.3); System.out.println("### My name is "+p2.firstname+" "+p2.lastname); System.out.println("### I am "+p2.age+" years old."); System.out.println("### My height is "+p2.height+" cm and my weight is "+p2.weight+" kg."); } } class Person2 { String firstname; String lastname; String gender; int age; double height; double weight; //(用途2)自クラスの別のコンストラクターを呼び出す Person2(String fnm, String lnm) { firstname = fnm; lastname = lnm; System.out.println("引数2個のコンストラクタを通過"); } Person2(String fnm, String lnm, String gen, int a, double he, double we){ //自クラス内の引数が2つ(いずれもString型)を呼び出す this(fnm, lnm); //上記コンストラクタで初期化しきれなかった残りの変数を初期化 gender = gen; age = a; height = he; weight = we; System.out.println("引数6個のコンストラクタを通過"); } }
(図131)
引数6個のコンストラクタの最初に、引数2個のコンストラクタを呼んでる。
(1-4) 用途3:他オブジェクトに自身の参照を渡す
3つ目の用途は「this」による自身の参照を渡す使い方です。
具体的には別のクラスのコンストラクタに自分自身の参照情報を代入しています。受け取った側はこの情報をクラス内の変数に格納するなどして利用します。この記述により、オブジェクト間に関連性を持たせる事ができます。
(サンプルプログラム③)
public class IT0210_ThisKeyword3 { public static void main(String args[]) { //引数を6個全て与えて初期化 Person3 p3 = new Person3("Rainbow","Planet","Men",30,173.5,60.3); } } class Person3 { String firstname; String lastname; String gender; int age; double height; double weight; //(用途2)自クラスの別のコンストラクターを呼び出す Person3(String fnm, String lnm) { firstname = fnm; lastname = lnm; System.out.println("引数2個のコンストラクタを通過"); } Person3(String fnm, String lnm, String gen, int a, double he, double we){ //自クラス内の引数が2つ(いずれもString型)を呼び出す this(fnm, lnm); //上記コンストラクタで初期化しきれなかった残りの変数を初期化 gender = gen; age = a; height = he; weight = we; System.out.println("引数6個のコンストラクタを通過"); AdditionalInfo adinfo = new AdditionalInfo(this, "Kanagawa"); } } class AdditionalInfo { String prefecture = ""; AdditionalInfo(Person3 p3, String pref){ prefecture = pref; System.out.println(p3.firstname+" "+p3.lastname+"さんの都道府県("+pref+")の登録が完了しました"); } }
(図141)