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

※カテゴリー【技術部】は技術者向けの記事となります。
※当記事はJava7をベースにしております。異なるバージョンでは挙動が違う可能性がありますのでご注意ください。
![]() |
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行目でエラーになる。 ご質問、ご意見等ありましたら下記コメントにご投稿お願いいたします。
- 関連記事
-
- 【技術部】 Pythonで東証のホームページから売残情報を抽出する 第2回 - Excelファイルの取得
- 【技術部】 Pythonで東証のホームページから売残情報を抽出する 第1回 - 概要説明
- 【技術部】Javaの仕様を総点検!!~ コンストラクター編 ~ 【試験勉強のお供に】
- 【技術部】Javaの仕様を総点検!!~ ポリモーフィズム編 ~ 【試験勉強のお供に】
- 【技術部】Javaの仕様を総点検!!~ 継承、実装編 ~ 【試験勉強のお供に】
- この記事へのリアクション
コメントの投稿
タグ:技術部Javaコンストラクター資格試験