クラス継承時の処理の順番について


クラス継承時の処理の順番について

JavaSilverSE11の勉強中、クラスの継承に関する問題の解説を読んで、よく混乱していたので、ここで自分なりにクラス継承時の処理の順番について調べてまとめてみました。

継承とは何か?

継承とは新しく機能を実装するときに、以前実装した機能と共通する機能を引き継ぐことです。

継承はJavaを中心とするオブジェクト指向の基本的な概念となります。


クラスの継承

既存のクラスをもとに、新しい別のクラスを作成し、既存のクラスにある機能を引き継ぐことです。

クラスの継承により、継承先のクラスは同じプログラムを書く手間が省け、新しい機能(差分の機能)を実装するだけで良くなります。

既存のクラス(継承元のクラス)のことをスーパークラス、

新しく作成したクラス(継承先のクラス)のことをサブクラスといいます。



継承の書き方

class サブクラス名 extends スーパークラス名 { }

・継承先のクラス(サブクラス)には「extends」を記述し、「extends」の後ろに継承元のクラス(スーパークラス)を記述する。

・継承元のクラス(スーパークラス)は一つしか記述できない。

・継承したクラスをさらに継承できる。

クラス継承時の処理の順番をコードを通して紹介

実際にクラス継承時の処理の順番を、メッセージのやり取りを例にコードを通して紹介します。

以下のコードのコメントに処理の順番を割り振っています。

【スーパークラス】

class SuperSample {
        public SuperSample() {
            //[5]SuperSample()メソッドで「1」と出力をし、SuperSampleクラスのSuperSample(String tmp)メソッドに戻る。
            System.out.println("1");
        }
         public SuperSample(String tmp) {
            //[4]thisを使い、SuperSampleクラスのSuperSample()メソッドを呼び出す。
             this();
            //[6]SuperSample(String tmp)メソッドで「2」と出力をし、SubSampleクラスのSubSample()メソッドに戻る。
            System.out.println("tmp");
        }
}

【サブクラス】

class SubSample extends SuperSample {
        public SubSample() {
            //[3]superを使い、SuperSampleクラスのSuperSample(String tmp)メソッドを呼び出す。
            super("2");
            //[7]SubSample()メソッドで「3」と出力をし、SubSampleクラスのSubSample(String tmp)メソッドに戻る。
            System.out.println("3");
        }
         public SubSample(String tmp) {
             //[2]thisを使い、SubSampleクラスのSubSample()メソッドを呼び出す。
             this();
            //[5]SuperSample()メソッドで「1」と出力をし、SuperSampleクラスのSuperSample(String tmp)メソッドに戻る。
            System.out.println("tmp");
        }
}

【エントリーポイント】

class Main {
        public static void main(String[] args) {
            new SubSample("4"); //[1]エントリーポイントからSubSampleクラスのSubSample(String tmp)メソッドを呼び出す。
        }
}

このコードは以下のように出力します。

1
2
3
4

まずこのコードに登場する「this」や「super」について説明します。

「this」はコンストラクタ内から、オーバーロードされた別のコンストラクタを呼び出します。

「super」はコンストラクタ内から、スーパークラスのコンストラクタを呼び出します。

今回記述したエントリーポイントやSubSampleクラスでは「this」や「super」を記述することで明示的にコンストラクタを呼び出しています。



まとめ

上記のコードの処理順はすごくややこしいと思いますが、以下を把握しておくと処理の順番が把握しやすいと思います。

・this();でコンストラクタ内から、オーバーロードされた別の引数のないコンストラクタを呼び出す。

・「super」はコンストラクタ内から、スーパークラスのの引数のないコンストラクタを呼び出す。



参考文献

[https://www.internetacademy.jp/it/programming/java/java-class-inheritance-function.html]
[https://itsakura.com/java-inheritance]