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

DemoBs 构造函数中,

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

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

DemoA 对象已创建

DemoB 对象已创建

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

于 2012-11-19T14:40:03.487 回答
1

您的构造函数中有打印语句。当您编写“new DemoA()”时,它们会被调用

于 2012-11-19T14:40:07.130 回答
0

当您调用 new DemoA() 时,您调用输出 DemoA Created 的构造函数,当您实例化新的 DemoB 时,在这种情况下(显式)调用超级构造函数,输出 DemoA Created,然后调用 DemoB 构造函数并输出 demoB created ,所以一切都如预期的那样

于 2012-11-19T14:40:47.790 回答
0

aList.add(new DemoA());

=> DemoA 对象已创建(构造函数 A)

aList.add(new DemoB());

=> DemoA 对象已创建(构造函数 A 由 super() 调用,因为 DemoA 是 DemoB 的父类) => 已创建 DemoB 对象(构造函数 B)

第一个 System.out.println(obj.methodA());

=> DemoA中的methodA(DemoA中的methodA)

第二个 System.out.println(obj.methodA());

=> DemoA中的methodA(DemoB中的methodA)

于 2012-11-19T14:43:39.720 回答