クラスの継承
コンストラクタで this を使う
this は、自身を示すキーワードです。
this()
目次
1. this() は自身のコンストラクタ
「this()」について、説明させてください。
スーパークラスの Animal_01クラスの中で、引数を持たない方のコンストラクタに、
「this("無名");」
という記述がありますね。
このチュートリアルでは初めての thisの使い方です。
//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 はインスタンス化した自分自身のこと。」
と紹介させていただいたと思います。
クラスの中で、わざわざ自分自身であることを明記する場面は限られます。
前の時は、
同名のインスタンス変数と
ローカル変数を
区別したのよね。
そう。
「this.変数」すると、
インスタンス変数を示す。
Animal_01クラス でも、
this.name = name;
として、同名のインスタンス変数と、ローカル変数を識別しています。
本題に戻りましょう。
「this()」のように「()」丸かっこを付ると、
今度は「自分自身のコンストラクタ」という意味になります。
「this()」に与える引数で、コンストラクタを識別します。
つまり、コンストラクタがオーバーロードされているときに利用します。
「this("無名");」の場合は、
引数が String型1つのコンストラクタ「Animal_01(String name)」に、
文字列「"無名"」を渡していることになります。
コンストラクタの中で、
別のコンストラクタを
呼んでるんすね!
難しくないだろ?
2. this を使ったコンストラクタのオーバーロード
以下のような書き方を覚えておくといいでしょう。
引数を与えなかった場合のデフォルト値を設定する際に定番の書き方です。
定番中の定番だ。
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);
}
}
どのコンストラクタを使っても
必ず引数が3つあるコンストラクタを
参照している。
引数が3つある
コンストラクタを
作りこめばいいのね。
一方
下の例は悲惨だ。
お勧めできない例
//動作はしますが、お勧めできない例
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() を使用する場合は、必ずコンストラクタの最初に記述します。
コンストラクタの最初
でなければだめなんスね?
そうだ。
最初というのが
ポイントだ。
//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() の使い方のまとめです。
- コンストラクタをオーバーロードするときに使います。
- コンストラクタの中で使います。
- コンストラクタの最初に記述します。
- 引数で呼び出すコンストラクタを指定します。
- 引数が多いコンストラクタに処理をまとめて書くと良いでしょう。
というわけで
今後は this()を使うので
よろしく頼む。
んー。
わかったぁ。
お疲れ様でした。