Java Arraylist输出不符合预期
这段代码产生的输出没有意义,可能是因为我缺乏理解。如果我错了,请纠正我Java Arraylist输出不符合预期,java,arraylist,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(){
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());
}
}
起初,我不理解输出是如何产生的,但后来我使用了调试功能,发现了为什么它会以这种方式运行,并发现了一些相当混乱(并不令人惊讶)的东西
为什么这些代码行会产生输出
aList.add(new DemoA());
aList.add(new DemoB());
上面几行的输出就是这些,但在我看来,这些应该只是添加到列表中,而不是产生任何输出,我在这里缺少什么
DemoA object created
DemoA object created
DemoB object created
在
demo
s构造函数中
public DemoB(){
super();
System.out.println("DemoB object created");
}
您可以调用super()
,它调用DemoA
的构造函数。由于两个构造函数都有println
语句,因此在创建DemoB
对象时将打印这两行
演示创建的对象
演示已创建的对象
创建对象时会打印这些行,因为
System.out.println(“DemoB object created”)
位于创建对象时调用的构造函数方法中。在demo
s构造函数中
public DemoB(){
super();
System.out.println("DemoB object created");
}
您可以调用super()
,它调用DemoA
的构造函数。由于两个构造函数都有println
语句,因此在创建DemoB
对象时将打印这两行
演示创建的对象
演示已创建的对象
创建对象时会打印这些行,因为
System.out.println(“DemoB object created”)
位于创建对象时调用的构造函数方法中。在构造函数中有print语句。当您编写“new DemoA()”时,会调用这些函数。您的构造函数中有print语句。当您编写“new DemoA()”时会调用这些函数当您调用new DemoA()时会调用正在输出DemoA Created的构造函数,当您实例化一个新DemoB时,会(显式)调用超级构造函数,在这种情况下会输出DemoA Created,然后调用DemoB构造函数并输出DemoB Created,因此,当您调用new DemoA()时,调用输出DemoA Created的构造函数,当您实例化一个新DemoB时,超级构造函数(显式地)被调用。在这种情况下,超级构造函数输出DemoA Created,然后调用DemoB构造函数并输出DemoB Created,因此一切都是按预期进行的(新DemoA())
=>演示已创建的对象(构造函数A)
aList.add(newdemo())
=>DemoA对象已创建(由于DemoA是DemoB的父类,因此super()调用构造函数A)
=>已创建演示对象(构造函数B)
第一个System.out.println(obj.methodA())
=>演示中的methodA(演示中的methodA)
第二个System.out.println(obj.methodA())
=>演示中的methodA(演示中的methodA)aList.add(new DemoA())
=>演示已创建的对象(构造函数A)
aList.add(newdemo())
=>DemoA对象已创建(由于DemoA是DemoB的父类,因此super()调用构造函数A)
=>已创建演示对象(构造函数B)
第一个System.out.println(obj.methodA())
=>演示中的methodA(演示中的methodA)
第二个System.out.println(obj.methodA())
=>演示中的methodA(演示中的methodA)因为创建子对象时总是调用父默认构造函数。好的,但仍然没有意义,因为为什么需要打印出来?只需添加到列表中,因为创建子对象时总是调用父默认构造函数。好的,但是仍然没有意义,因为为什么需要打印出来?只是添加到列表Ok,但是仍然没有意义,因为你为什么需要打印出来?只是添加到列表。Ok,但是仍然没有意义,因为你为什么需要打印出来?只是添加到列表。Ok,但是仍然没有意义,因为为什么需要打印出来?只是添加到列表Ok,但是仍然没有意义,因为为什么需要打印出来只需将创建并添加到arraylist的对象添加到列表中即可,但为什么要将其打印出来?因为
println
语句是在创建对象时调用的构造函数的一部分。好吧,这有点道理,那么这是否意味着相同的概念适用于所有地方?当我们创建具有构造函数的类的新对象将执行构造函数中定义的所有语句?是的,每当使用new YourClass()创建其中一个对象时,构造函数中包含的所有代码都将运行
。确切地说,DemoA是一个创建并添加到arraylist中的对象,但它为什么要打印出来?因为println
语句是在创建对象时调用的构造函数的一部分。好吧,这有点道理,那么这是否意味着相同的概念适用于任何地方?当我们创建一个具有构造函数它将执行构造函数中定义的所有语句?是的,每当您使用newyourclass()
创建其中一个对象时,构造函数中包含的所有代码都将运行。