こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

コンストラクタ,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
が追加されると理解していたのですが、結果は、
違っておりました。

どこに誤りがあるのが、数日検討したのですが、分からない状態です。
ご教授の程お願い致します。

投稿日時 - 2009-05-13 15:31:39

QNo.4955472

困ってます

質問者が選んだベストアンサー

interFaceClassSを実装

スーパークラスのshowをオーバーライド

これで説明付くんじゃないかしら。

投稿日時 - 2009-05-13 15:45:37

お礼

早々ご返答ありがとうございます

>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を実装

この結果になるな!と理解できます

上記の流れで間違いないなら、

サブクラスが、スーパークラスのコンストラクを読んだ場合、
サブクラスのメソッドがスーパークラスのコンストラクタに
明記しているメソッドをオーバーライドするとは、
認識していなかった点にありました

投稿日時 - 2009-05-13 18:51:55

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

スーパークラスのメソッドを呼び出したいときは、明示的に

super.show();

と実装しましょう。

投稿日時 - 2009-05-13 19:22:58

お礼

回答して頂きありがとうございます。

ご指摘のとうり、明示的にsuperを実装しようと思います。

投稿日時 - 2009-05-13 19:35:28

あなたにオススメの質問