Arraylist输出不符合预期

时间:2012-11-19 14:37:21

标签: java arraylist

此代码产生的输出没有意义,可能是由于我缺乏理解。如果我错了,请纠正我

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 个答案:

答案 0 :(得分:2)

DemoB的构造函数中,

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

你拨打super()来调用DemoA的构造函数。由于两个构造函数都有println个语句,因此在创建DemoB对象时将打印这两行。

  

创建了DemoA对象

     

创建了DemoB对象

创建对象时会打印这些行,因为System.out.println("DemoB object created");位于创建对象时调用的构造函数方法内。

答案 1 :(得分:1)

您的构造函数中有print语句。当你写“new DemoA()”

时会被调用

答案 2 :(得分:0)

当你调用新的DemoA()时,你调用正在输出DemoA Created的构造函数,当你实例化一个新的DemoB时,在这种情况下调用(显式)超级构造函数,它输出DemoA Created,然后调用DemoB构造函数,输出demoB,因此所有都是预期的

答案 3 :(得分:0)

aList.add(new DemoA());

=&GT;创建了DemoA对象(构造函数A)

aList.add(new DemoB());

=&GT;创建了DemoA对象(由super()调用的构造函数A,因为DemoA是DemoB的父类) =&GT;创建了DemoB对象(Contructor B)

First System.out.println(obj.methodA());

=&GT; DemoA中的methodA(DemoA中的methodA)

Second System.out.println(obj.methodA());

=&GT; DemoA中的methodA(DemoB中的methodA)