- ベストアンサー
コンストラクタ,interface,abstractの呼び出し順について
現在、java初心者入門などの本で勉強しております 下記についてご教授お願い致します コンストラクタ、interface、abstractの呼び出し順について質問なのですが、 下記プログラムを実行したところ(同一のパッケージ内に明記) // インターフェイス public interface interFaceClassSS { public void show(); } public interface interFaceClassS { public void show(); } // 抽象クラス public abstract class ClassSSSab { // 共通のメソッドを実装 //個々のメソッド abstract void show(); } // スーパークラス public class ClassSSS extends ClassSSSab{ public ClassSSS(){ System.out.println("ClassSSS"); show(); } public void show(){ System.out.println("ClassSSSabの抽象メソッドを実装"); } } public class ClassSS extends ClassSSS implements interFaceClassSS { public ClassSS() { System.out.println("ClassSS"); show(); } public void show() { System.out.println("interFaceClassSSを実装"); } } // メイン処理 public class ClassS extends ClassSS implements interFaceClassS { public ClassS() { System.out.println("ClassS"); show(); } public static void main(String[] args) { new ClassSSS(); System.out.println(""); new ClassSS(); System.out.println(""); new ClassS(); } public void show() { System.out.println("interFaceClassSを実装"); } } // 結果 ClassSSS ClassSSSabの抽象メソッドを実装 ClassSSS interFaceClassSSを実装 ClassSS interFaceClassSSを実装 ClassSSS interFaceClassSを実装 ClassSS interFaceClassSを実装 ClassS interFaceClassSを実装 の結果となりました。 当方が望む結果は、 ClassSSS ClassSSSabの抽象メソッドを実装 ClassSSS ClassSSSabの抽象メソッドを実装 ClassSS interFaceClassSSを実装 ClassSSS ClassSSSabの抽象メソッドを実装 ClassSS interFaceClassSSを実装 ClassS interFaceClassSを実装 上記となります。 new ClassSSSの処理は当方が望む結果なのですが、 new ClassSSでは、 newClassSSSの結果に ClassSS interFaceClassSS が追加されると理解していたのですが、結果は、 違っておりました。 どこに誤りがあるのが、数日検討したのですが、分からない状態です。 ご教授の程お願い致します。
- みんなの回答 (2)
- 専門家の回答
お礼
早々ご返答ありがとうございます >interFaceClassSを実装 >→ >スーパークラスのshowをオーバーライド interFaceClassSを実装するとのことですが、 ClassSにてinterFaceClassSのshow()メソッドを実装 したコーディングをしていると思っているのですが、 理解不足だと思いますので勉強しなおします。 望む結果の有無よりも、オーバーライドの学習不足だと 思うのですが、処理の流れが下記のとうり だと思うのですが、間違いないでしょうか? 1.new ClassSSSの処理 ClassSSSのコンストラクタ ClassSSSを表示 show()は、ClassSSS.show()を呼び出す 2.new ClassSSの処理 ClassSSSのコンストラクタ ClassSSSを表示 show()は、ClassSSS.show()を呼び出すのではなく、 ClassSS.show()によって、オーバーライドされる ClassSSのコンストクタ classSSを表示 ClassSS.show()を呼び出す 3.new ClassSの処理 2.と同様サブクラスによってshow()がオーバーライドされている 上記だと、 // 結果 ClassSSS ClassSSSabの抽象メソッドを実装 ClassSSS interFaceClassSSを実装 ClassSS interFaceClassSSを実装 ClassSSS interFaceClassSを実装 ClassSS interFaceClassSを実装 ClassS interFaceClassSを実装 この結果になるな!と理解できます 上記の流れで間違いないなら、 サブクラスが、スーパークラスのコンストラクを読んだ場合、 サブクラスのメソッドがスーパークラスのコンストラクタに 明記しているメソッドをオーバーライドするとは、 認識していなかった点にありました