fc2ブログ
  • 館内放送 [ツイッター]

    キンコンカンコーン・・・うみゃーだよ。館内放送だみゃ。
    ・・・・・キンコンカンコーン・・・ブツ
  • 町内会からのお知らせ [相互RSS]

【技術部】Javaの仕様を総点検!!~ コンストラクター編 ~ 【試験勉強のお供に】


※カテゴリー【技術部】は技術者向けの記事となります。

Java の仕様について総点検しましょう。
認定資格の受験勉強等にもお役立ていただけます。


今回は コンストラクターについてです。


【目的】
Java コンストラクターの仕様を理解する。



※当記事はJava7をベースにしております。異なるバージョンでは挙動が違う可能性がありますのでご注意ください。



コンストラクターの実行順番

public class SuperClass {
  public SuperClass()
  {
    System.out.println("SuperClass");
  }
}
public class SubClass  extends SuperClass {
  public SubClass()
  {
    System.out.println("SubClass");
  }
}
public static void main(String[] args)
{
  SubClass cls = new SubClass();
}

出力結果
SuperClass
SubClass

解説
メソッドと違い、コンストラクターは親クラスのものをオーバーライドしない。
子クラスが newされた時、親クラスのコンストラクター→子クラスのコンストラクターの順で実行される。



親クラスの型で宣言された場合もルールは変わらない

public class SuperClass {
  public SuperClass()
  {
    System.out.println("SuperClass");
  }
}
public class SubClass  extends SuperClass {
  public SubClass()
  {
    System.out.println("SubClass");
  }
}
public static void main(String[] args)
{
  SuperClass cls = new SubClass();
}

出力結果
SuperClass
SubClass

解説
親クラスの型で宣言された変数に対してnewした場合も、親クラスのコンストラクター→子クラスのコンストラクターの順で実行される。



引数付きコンストラクター

public class SuperClass {
  public SuperClass()
  {
    System.out.println("SuperClass");
  }
}
public class SubClass  extends SuperClass {
  public SubClass()
  {
    System.out.println("SubClass");
  }
  public SubClass(String str)
  {
    System.out.println("SubClass:" + str);
  }

}
public static void main(String[] args)
{
  SuperClass cls = new SubClass("VALUE");
}

出力結果
SuperClass
SubClass:VALUE

解説
引数付きコンストラクターを実行した場合もまずは親クラスのコンストラクターが実行される。



親クラスにも引数付きコンストラクター

public class SuperClass {
  public SuperClass()
  {
    System.out.println("SuperClass");
  }
  public SuperClass(String str)
  {
    System.out.println("SuperClass:" + str);
  }
}
public class SubClass  extends SuperClass {
  public SubClass()
  {
    System.out.println("SubClass");
  }
  public SubClass(String str)
  {
    System.out.println("SubClass:" + str);
  }

}
public static void main(String[] args)
{
  SuperClass cls = new SubClass("VALUE");
}

出力結果
SuperClass
SubClass:VALUE

解説
親クラスのコンストラクターは指定しない限り、引数なしの方が実行される。



親クラスの引数付きコンストラクターを指定

public class SuperClass {
  public SuperClass()
  {
    System.out.println("SuperClass");
  }
  public SuperClass(String str)
  {
    System.out.println("SuperClass:" + str);
  }
}
public class SubClass  extends SuperClass {
  public SubClass()
  {
    System.out.println("SubClass");
  }
  public SubClass(String str)
  {
    super(str);
    System.out.println("SubClass:" + str);
  }

}
public static void main(String[] args)
{
  SuperClass cls = new SubClass("VALUE");
}

出力結果
SuperClass:VALUE
SubClass:VALUE

解説
super()メソッドを指定することで、親クラスの引数付きコンストラクターを指定できる。



super()クラスは一番最初に。

public class SuperClass {
  public SuperClass()
  {
    System.out.println("SuperClass");
  }
  public SuperClass(String str)
  {
    System.out.println("SuperClass:" + str);
  }
}
public class SubClass  extends SuperClass {
  public SubClass()
  {
    System.out.println("SubClass");
  }
  public SubClass(String str)
  {
    System.out.println("SubClass:" + str);
    super(str);
  }

}
public static void main(String[] args)
{
  SuperClass cls = new SubClass("VALUE");
}

出力結果
コンパイルエラー

解説
super()メソッドは処理の一番最初に指定する必要がある。一番最初以外の場所で実行しようとするとコンバイルエラー。



親クラスに引数付きコンストラクターしかない場合

public class SuperClass {
  public SuperClass(String str)
  {
    System.out.println("SuperClass:" + str);
  }
}
public class SubClass  extends SuperClass {
  public SubClass()
  {
    System.out.println("SubClass");
  }
  public SubClass(String str)
  {
    super(str);
    System.out.println("SubClass:" + str);
  }

}
public static void main(String[] args)
{
  SuperClass cls = new SubClass("VALUE");
}

出力結果
コンパイルエラー

解説
親クラスに引数付きコンストラクターしかない場合、子クラスのコンストラクターは必ず super(str);を実行する必要がある。
上記の例の場合、10行目に super(str);が存在しないため、コンパイルエラー。



Privateなコンストラクター

public class SuperClass {
  private SuperClass()
  {
    System.out.println("SuperClass");
  }
}
public class SubClass extends SuperClass {
  public SubClass()
  {
    System.out.println("SubClass");
  }
}
public static void main(String[] args)
{
  SuperClass cls = new SuperClass();
}

出力結果
8行目、15行目でコンパイルエラー

解説
アクセス修飾子をprivateにしたコンストラクターを定義しているクラスは、インスタンス化(new)できない。



Protectedなコンストラクター

public class SuperClass {
  protected SuperClass()
  {
    System.out.println("SuperClass");
  }
}
public class SubClass extends SuperClass {
  public SubClass()
  {
    System.out.println("SubClass");
  }
}
public static void main(String[] args)
{
  SuperClass cls = new SuperClass();
}

出力結果
SuperClass

解説
アクセス修飾子をprotectedにしたコンストラクターを定義しているクラスは、サブクラスか同一パッケージからしかインスタンス化(new)できない。
SuperClassが別のパッケージにある場合、15行目でエラーになる。



ご質問、ご意見等ありましたら下記コメントにご投稿お願いいたします。
関連記事
この記事へのリアクション

コメントの投稿

非公開コメント




タグ:技術部Javaコンストラクター資格試験

プロフィール

うみゃー・アパカ

Author:うみゃー・アパカ
UMYA.net公式ブログです。
ツイッター:umya_net


リンクフリーです!
アドレス:http://umyanet.blog.fc2.com/

公式ホームページ

ラインスタンプ配信中!

リンク



スマホアプリ配信中

黄金疾走

スポンサード

人気商品

Powered by amaprop.net