0

このコードから生成された出力は、おそらく私の理解不足のために意味がありません。私が間違っている場合は私を訂正してください

import java.util.*;
class DemoA
{
  public DemoA(){
    System.out.println("DemoA object created");
  }
  public String methodA() {
    return "methodA in DemoA";
  }
}
class DemoB extends DemoA
{
  public DemoB(){
    super();
    System.out.println("DemoB object created");
  }
  public String methodA() {
   return "methodA in subclass (DemoB)";
  }
}
public class ExamQ1b
{
  public static void main(String[] args) {
    ArrayList<DemoA> aList = new ArrayList<DemoA>();
    aList.add(new DemoA());
    aList.add(new DemoB());
    for (DemoA obj: aList)
      System.out.println(obj.methodA());
  }
}

出力は

DemoA object created
DemoA object created
DemoB object created
methodA in DemoA
methodA in subclass (DemoB)

最初は出力がどのように発生するのか理解できませんでしたが、デバッグ機能を使用して、なぜそれがそのように動作しているのかを見つけ、かなり紛らわしい(驚くべきことではありません)ものを発見しました。

これらのコード行が出力を生成しているのはなぜですか?

aList.add(new DemoA());
    aList.add(new DemoB());

上記の行からの出力はこれらですが、私の考えでは、これらはリストに追加するだけで出力は生成されません。ここで何が欠けていますか?

DemoA object created
DemoA object created
DemoB object created
4

4 に答える 4

2

DemoBコンストラクターでは、

  public DemoB(){
    super();
    System.out.println("DemoB object created");
  }

super()のコンストラクターを呼び出す呼び出しますDemoA。両方のコンストラクターにprintlnステートメントがあるため、オブジェクトを作成するときにこれらの2行が出力されDemoBます。

作成されたDemoAオブジェクト

作成されたDemoBオブジェクト

これらの行は、オブジェクトのSystem.out.println("DemoB object created");作成時に呼び出されるコンストラクターメソッド内にあるため、オブジェクトの作成時に出力されます。

于 2012-11-19T14:40:03.487 に答える
1

コンストラクターにprintステートメントがあります。「newDemoA()」を書くと呼び出されます

于 2012-11-19T14:40:07.130 に答える
0

new DemoA()を呼び出すと、DemoA Createdを出力するコンストラクターが呼び出され、新しいDemoBをインスタンス化すると、スーパーコンストラクターが(明示的に)呼び出されます。この場合、DemoA Createdが出力され、DemoBコンストラクターが呼び出されてdemoBcreatedが出力されます。 、すべてが期待どおりです

于 2012-11-19T14:40:47.790 に答える
0

aList.add(new DemoA());

=>作成されたDemoAオブジェクト(コンストラクターA)

aList.add(new DemoB());

=>作成されたDemoAオブジェクト(DemoAはDemoBの親クラスであるため、super()によって呼び出されたContructor A)=>作成されたDemoBオブジェクト(Contructor B)

最初のSystem.out.println(obj.methodA());

=> DemoAのmethodA(DemoAのmethodA)

2番目のSystem.out.println(obj.methodA());

=> DemoAのmethodA(DemoBのmethodA)

于 2012-11-19T14:43:39.720 に答える