コンストラクタで this を使う - 萌えJava超入門
クラスの継承

コンストラクタで this を使う

this は、自身を示すキーワードです。

this()
自身のコンストラクタを表します。

目次

1. this() は自身のコンストラクタ

this()」について、説明させてください。

スーパークラスの Animal_01クラスの中で、引数を持たない方のコンストラクタに、
  「this("無名");」
という記述がありますね。
このチュートリアルでは初めての thisの使い方です。

Animal_01.java(再出)
//Animal_01.java

public class Animal_01{

      protected static String group = "生き物です。";
      protected String name;

      public Animal_01(){
          this("無名"); //引数が異なるコンストラクタを識別するthis
      }
      public Animal_01(String name){
          this.name = name; //インスタンス変数とローカル変数を識別するthis
      }
      public static void printGroup(){
          System.out.println(group);
      }
      public void printName(){
          System.out.println(name + "だぞ! ガオー!");
      }
}


ちょっとだけ復習です。
以前、
  「this はインスタンス化した自分自身のこと。」
と紹介させていただいたと思います。
クラスの中で、わざわざ自分自身であることを明記する場面は限られます。
萌えJava超入門 萌えJava超入門
前の時は、
同名のインスタンス変数と
ローカル変数を
区別したのよね。
萌えJava超入門
そう。
「this.変数」すると、
インスタンス変数を示す。
Animal_01クラス でも、
  this.name = name;
として、同名のインスタンス変数と、ローカル変数を識別しています。


本題に戻りましょう。
this()」のように「()」丸かっこを付ると、
今度は「自分自身のコンストラクタ」という意味になります。

重要
this() は自身のコンストラクタ。

this()」に与える引数で、コンストラクタを識別します。
つまり、コンストラクタがオーバーロードされているときに利用します。

自身のコンストラクタ 引数なし
this();

自身のコンストラクタ 引数あり
this(引数1, 引数2 ...);

this("無名");」の場合は、
引数が String型1つのコンストラクタ「Animal_01(String name)」に、
文字列「"無名"」を渡していることになります。

萌えJava超入門
コンストラクタの中で、
別のコンストラクタを
呼んでるんすね!
萌えJava超入門
萌えJava超入門
難しくないだろ?


2. this を使ったコンストラクタのオーバーロード


以下のような書き方を覚えておくといいでしょう。
引数を与えなかった場合のデフォルト値を設定する際に定番の書き方です。
萌えJava超入門
定番中の定番だ。
this を使ったコンストラクタのオーバーロード
public class Klass_01{

      protected String name1;
      protected String name2;
      protected String name3;

      public Klass_01(){
          this("デフォルト1", "デフォルト2", "デフォルト3");
      }
      public Klass_01(String name1){
          this(name1, "デフォルト2", "デフォルト3");
      }
      public Klass_01(String name1, String name2){
          this(name1, name2, "デフォルト3");
      }
      public Klass_01(String name1, String name2, String name3){
          this.name1 = name1;
          this.name2 = name2;
          this.name3 = name3;
          System.out.println(name1);
          System.out.println(name2);
          System.out.println(name3);
      }

}

萌えJava超入門
どのコンストラクタを使っても
必ず引数が3つあるコンストラクタを
参照している。
萌えJava超入門 萌えJava超入門
引数が3つある
コンストラクタを
作りこめばいいのね。


萌えJava超入門 萌えJava超入門 萌えJava超入門
一方
下の例は悲惨だ。
お勧めできない例
//動作はしますが、お勧めできない例

public class Klass_NG{

      protected String name1;
      protected String name2;
      protected String name3;

      public Klass_NG(){
          this.name1 = "デフォルト1";
          this.name2 = "デフォルト2";
          this.name3 = "デフォルト3";
          System.out.println(this.name1);
          System.out.println(this.name2);
          System.out.println(this.name3);
      }
      public Klass_NG(String name1){
          this.name1 = name1;
          this.name2 = "デフォルト2";
          this.name3 = "デフォルト3";
          System.out.println(this.name1);
          System.out.println(this.name2);
          System.out.println(this.name3);
      }
      public Klass_NG(String name1, String name2){
          this.name1 = name1;
          this.name2 = name2;
          this.name3 = "デフォルト3";
          System.out.println(this.name1);
          System.out.println(this.name2);
          System.out.println(this.name3);
      }
      public Klass_NG(String name1, String name2, String name3){
          this.name1 = name1;
          this.name2 = name2;
          this.name3 = name3;
          System.out.println(this.name1);
          System.out.println(this.name2);
          System.out.println(this.name3);
      }

}

this.name = name; だけで無理に書くとひどいことになりますね。
コンストラクタをオーバーロードするときは this()を検討しましょう。


3. this() の記述位置


this() の記述位置
 this() を使用する場合は、必ずコンストラクタの最初に記述します。
this() の引数は任意に与えてください。

萌えJava超入門 萌えJava超入門
コンストラクタの最初
でなければだめなんスね?
萌えJava超入門
そうだ。
最初というのが
ポイントだ。
 //Animal_thisNG.java

 public class Animal_thisNG{

       protected static String group = "生き物です。";
       protected String name;

       public Animal_thisNG(){
           System.out.println("Hello!");
           this("無名"); //コンストラクタの最初に無い this
       }
       public Animal_thisNG(String name){
           this.name = name;
       }
       public static void printGroup(){
           System.out.println(group);
       }
       public void printName(){
           System.out.println(name + "だぞ! ガオー!");
       }
 }
 

 //Driver_thisNG.java

 public class Driver_thisNG{
     public static void main(String[] args){
         Animal_thisNG dog_01 = new Animal_thisNG();
     }
 }
 

Animal_thisNG.java、
Driver_thisNG.java、を
wsフォルダに保存して実行します。

コマンドライン
 >cd ws
 ws>javac -encoding UTF-8 Driver_thisNG.java
 .\Animal_thisNG.java:10: エラー:
   thisの呼出しはコンストラクタの先頭文である必要があります
          this("無名");
              ^
エラー1個
 



4. まとめ


this() の使い方のまとめです。
  1. コンストラクタをオーバーロードするときに使います。
  2. コンストラクタの中で使います。
  3. コンストラクタの最初に記述します。
  4. 引数で呼び出すコンストラクタを指定します。
  5. 引数が多いコンストラクタに処理をまとめて書くと良いでしょう。

萌えJava超入門
というわけで
今後は this()を使うので
よろしく頼む。
萌えJava超入門 萌えJava超入門
んー。
わかったぁ。



お疲れ様でした。




© 2019 awasekagami