🎯

【Java】クラス解説31・superの使い方2

2024/02/04に公開

superの使い方2

サブクラスからスーパークラスのコンストラクタを呼び出すsuper()を記述しない場合と、明示的に記述する場合で、呼び出されるスーパークラスのコンストラクタが異なる場合があります。

super()を記述しないコード例1

public class Main {
    public static void main(String[] args) {
        // サブクラスのデフォルトコンストラクタ呼び出し
        Fuzi f1 = new Fuzi();
    }
}

class MyClass {
    // スーパークラスのデフォルトコンストラクタ
    public MyClass() {
        System.out.println("スーパークラスのデフォルトコンストラクタ");
    }
    // スーパークラスの引数のあるコンストラクタ
    public MyClass(String s) {
        System.out.println("スーパークラスの引数のあるコンストラクタ");
    }
}

class Fuzi extends MyClass {
    // サブクラスのデフォルトコンストラクタ
    public Fuzi() {
        System.out.println("サブクラスのデフォルトコンストラクタ");
    }
    // サブクラスの引数のあるコンストラクタ
    public Fuzi(String s) {
        System.out.println("サブクラスの引数のあるコンストラクタ");
    }
}

出力結果とコンストラクタの流れ

標準出力の出力結果は、下記の順番通りになります。

  1. スーパークラスのデフォルトコンストラクタ
  2. サブクラスのデフォルトコンストラクタ

MainクラスのFuzi f1 = new Fuzi()から始まり、どのような流れで上記の出力結果になるかを解説します。

補足

下記のように、サブクラスのデフォルトコンストラクタの定義自体を省略しても、サブクラスにsuper()が暗黙的に挿入され、スーパークラスのデフォルトコンストラクタが呼び出されます。

public class Main {
    public static void main(String[] args) {
        // サブクラスのデフォルトコンストラクタ呼び出し
        Fuzi f1 = new Fuzi();
    }
}

class MyClass {
    // スーパークラスのデフォルトコンストラクタ
    public MyClass() {
        System.out.println("スーパークラスのデフォルトコンストラクタ");
    }
}

class Fuzi extends MyClass {
    // サブクラスのデフォルトコンストラクタの定義も省略
}

// 出力結果 -> スーパークラスのデフォルトコンストラクタ

super()を記述しないコード例2

public class Main {
    public static void main(String[] args) {
        // サブクラスの引数のあるコンストラクタ呼び出し
        Fuzi f2 = new Fuzi("f");
    }
}

class MyClass {
    // スーパークラスのデフォルトコンストラクタ
    public MyClass() {
        System.out.println("スーパークラスのデフォルトコンストラクタ");
    }
    // スーパークラスの引数のあるコンストラクタ
    public MyClass(String s) {
        System.out.println("スーパークラスの引数のあるコンストラクタ");
    }
}

class Fuzi extends MyClass {
    // サブクラスのデフォルトコンストラクタ
    public Fuzi() {
        System.out.println("サブクラスのデフォルトコンストラクタ");
    }
    // サブクラスの引数のあるコンストラクタ
    public Fuzi(String s) {
        System.out.println("サブクラスの引数のあるコンストラクタ");
    }
}

出力結果とコンストラクタの流れ

標準出力の出力結果は、下記の順番通りになります。

  1. スーパークラスのデフォルトコンストラクタ
  2. サブクラスの引数のあるコンストラクタ

MainクラスのFuzi f2 = new Fuzi("f")から始まり、どのような流れで上記の出力結果になるかを解説します。


super()を明示的に記述するコード例

上記の「最初にサブクラスの引数のあるコンストラクタが呼び出されている」時に、スーパークラスのコンストラクタが引数のある方を呼び出すコードを下記に記述します。

public class Main {
    public static void main(String[] args) {
        // サブクラスの引数のあるコンストラクタ呼び出し
        Fuzi f2 = new Fuzi("f");
    }
}

class MyClass {
    // スーパークラスのデフォルトコンストラクタ
    public MyClass() {
        System.out.println("スーパークラスのデフォルトコンストラクタ");
    }
    // スーパークラスの引数のあるコンストラクタ
    public MyClass(String s) {
        System.out.println("スーパークラスの引数のあるコンストラクタ");
    }
}

class Fuzi extends MyClass {
    // サブクラスのデフォルトコンストラクタ
    public Fuzi() {
        System.out.println("サブクラスのデフォルトコンストラクタ");
    }
    // サブクラスの引数のあるコンストラクタ
    public Fuzi(String s) {
        // super()の明示的な記述
        // 引数があるスーパークラスのコンストラクタ呼び出し
        super(s);
        System.out.println("サブクラスの引数のあるコンストラクタ");
    }
}

出力結果とコンストラクタの流れ

標準出力の出力結果は、下記の順番通りになります。

  1. スーパークラスの引数のあるコンストラクタ
  2. サブクラスの引数のあるコンストラクタ

MainクラスのFuzi f2 = new Fuzi("f")から始まり、どのような流れで上記の出力結果になるかを解説します。


まとめ

Discussion