ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

現在、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
が追加されると理解していたのですが、結果は、
違っておりました。

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

このQ&Aに関連する最新のQ&A

A 回答 (2件)

interFaceClassSを実装



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

これで説明付くんじゃないかしら。
    • good
    • 0
この回答へのお礼

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

>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

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



super.show();

と実装しましょう。
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2009/05/13 19:35

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q抽象クラスをJUNITでテストする方法

抽象クラス内に実装メソッドと抽象メソッドがある場合に、
そのクラスをJUNITでテストしたいと思っています。
通常のクラスであれば、そのクラスに対するテストクラスを
作成して、テストクラス内でテスト対象クラスをnewして
テストケースを記述していくと思いますが、
上記のような抽象クラスの場合は、
どういった形でテストクラスを作成すれば良いのでしょうか?
抽象クラスはnewできないので、
抽象クラスを実装したクラスをまず作成して
そのクラスに対するテストクラスを作成するのでしょうか?
お薦めの方法や一般的な方法があれば教えてください。

以上、よろしくお願い致しますm(__)m

【環境】
JDK1.4.2
JUNIT3.8.1

Aベストアンサー

こんにちは。
一般的な方法かどうかは分かりませんが、私が実際にプロジェクトで実施した方法は、
・テスト用に抽象クラスを継承したクラスを作成
・そのクラスに対するテストクラスを作成
でした。

抽象クラスの実装メソッドは、抽象クラスのテストとした方がいいと思います。
実装クラスで行おうとすると、複数の実装クラスがあるときにどの実装クラスでテストをするべきかコントロールする必要があります。
その結果、テストが漏れていた、といった苦い経験があったためです。

あとは命名ルールを決めておけばよいと思います。

 テスト対象クラス=AbstractSample

だったら、

 テスト用の実装クラス=ConcreteSample
 テストクラス=AbstractSampleTest

というような感じですね。


人気Q&Aランキング