

下記プログラムについての質問ですが、Childクラスの6行目のコンストラクタが呼び出されるとき、なぜスーパークラスのコンストラクタの呼び出しが自動的にされないのですか?

**これまでに試したこと:**

  * 解説を読む。
  * Eclipse上で、コードを打つ。

追記  
出力結果は、A B C D と 出力されますが、なぜ出力結果が、A A B C D と出力されないのですか?

[code]

    class Parent {
        public Parent() {
            System.out.println("A");
        }
        public Parent(String val) {
            this();
            System.out.println(val);
        }
    }
    
    class Child extends Parent {
        public Child() {
            super("B");
            System.out.println("C");
        }
        public Child(String val) {
            this();
            System.out.println(val);
        }
    }
    
    public class Main {
        pubic static void main(String[] args) {
            new Child("D");
        }
    }
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/wQcfK.png)](https://i.stack.imgur.com/wQcfK.png)


CC BY-SA 4.0
2020-09-22T11:48:45.273
70604
2020-09-23T00:51:29.480
2020-09-22T23:58:01.847
19110
41424
question
java java8
自動的にSuperが呼び出される時はどういう時か、言語初心者なのでわかりやすく教えてください。


まずご質問の前提として、明示的に`super();`を呼ばない場合は[子クラスにおける暗黙的なコンストラクタ](https://qiita.com/katolisa/items/438a8d720ea5a60b55c4#%E5%AD%90%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E6%9A%97%E9%BB%99%E7%9A%84%E3%81%AA%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF)で強制的に引数のない親コンストラクタが呼ばれます。  
ファビアンさんのご質問は、上記を念頭に置いて「なぜ`Child(String
val)`は`this();`しか呼んでいないのに、引数のない親コンストラクタが暗黙的に呼ばれないのか」という疑問と解釈して回答します。  
確かに、暗黙的なコンストラクタ呼び出しが発生した後に明示的なコンストラクタ呼び出しが発生すると出力結果が「A A B C D」になります。

Oracleドキュメントの[Subclass
Constructors](https://docs.oracle.com/javase/tutorial/java/IandI/super.html)には、暗黙的なコンストラクタ呼び出しが書かれている者の、コンストラクタチェーンによる`super();`の呼び出しについては書かれていないように読めます。  
(私の英語読解力が足りないだけかもしれませんが…)

結局コンストラクタチェーンのどこかで親コンストラクタを呼び出してさえいれば、暗黙的なコンストラクタ呼び出しは発生しない仕組みになっているようです。  
非常に分かりにくい記述ですが、このことはOracleドキュメントの[8.8.7.1. Explicit Constructor
Invocations](https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.7)の末尾に書かれています。(`8.8.8.
Constructor Overloading`節の直前の行です)

> Execution of instance variable initializers and instance initializers is
> performed regardless of whether the superclass constructor invocation
> actually appears as an explicit constructor invocation statement or is
> provided automatically. (An alternate constructor invocation does not
> perform this additional implicit execution.)

親コンストラクタの呼び出し処理は、コンストラクタチェーンによる自動的な提示であってもどこかで`super();`が呼ばれていれば暗黙的な呼び出しは行われないと明示されています。  
この仕様によって出力結果は「A B C D」となります。


CC BY-SA 4.0
2020-09-23T00:51:29.480
70613
2020-09-23T00:51:29.480
9820
70604
answer