此代码产生的输出没有意义,可能是由于我缺乏理解。如果我错了,请纠正我
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
答案 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)