みなさんこんばんは、駆け出しエンジニアです。
今日は仕事でした。仕事はまだ研修中なのですが、今日は眠すぎて、お昼の講義の時少しだけ居眠りしてしまいました(汗)寝るつもりはなかったのですが、睡魔と格闘していたら気づいたら少しだけ死んでいました。
講義の内容としては、AOPとThymeleafについて学んできました。
が、本日はSpringについてではなく、Javaについての記事です。
行き帰りの電車の中で、Java SE8 Silver の勉強をしているのですが、結構わからない問題も多く、まだまだだな、と痛感する毎日です。
そんな問題の中で今日印象に残ったのは、継承関係とコンストラクタに関する問題です。
では、こちらのサンプルコードをごらんください。
こちらのコードを実行すると、「AB」と表示されることになります。
その前にまず、継承関係にあるクラスのインスタンス生成時のコンストラクタの動作について押さえたいと思います。
- スーパークラスのインスタンスが持つコンストラクタが先に実行されなければならない。
- サブクラスのコンストラクタには、スーパークラスのコンストラクタを呼び出す「super();」がコンパイラによって先頭行に追加される。
以上の2点を確認した上で、ソースコードを追いかけたいと思います。
サンプルコードでは、mainメソッドで、まず、A型の、Bのインスタンスを生成しています。このコードを見る限り、AもBもコンストラクタを持ちます。
なので、Bをインスタンス化した時、先にBのコンストラクタが先に実行されそうに見えますが、このコードではAのコンストラクタが先に実行されます。
なぜなら、スーパークラスはサブクラスの共通部分を抽出して定義したいわば「基盤」であり、先に基盤を作ってから差分を追加する必要があるからです。
この考え方を実現するため、コンパイラが、サンプルコード十行目に、スーパークラスのコンストラクタを呼び出すコードを自動的に追加します。
public B(){
super(); ⇦コンパイラによって自動的に追加されたコード
System.out.println("B");
}
以上のように追加されたコードが実行されると、Bのコンストラクタに制御が戻り、残りの処理を実行します。
よって、コンソールには「A」「B」と表示されるわけです。
どうやら明後日から関西は梅雨入りのようです。駅まで自転車通勤なので憂鬱ですね…