2012-11-19 81 views
0

由此代碼產生的輸出沒有意義,可能是由於我缺乏理解。糾正我,如果我錯了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 
+1

因爲在創建子對象時始終調用父級默認構造函數。 –

+0

好的,但仍然沒有意義,爲什麼有需要打印出來?只是添加到列表 – noobprogrammer

回答

2

DemoB的構造函數,

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

你叫super()這就要求DemoA構造。由於這兩個構造函數都有println語句,因此在創建DemoB對象時將會打印這兩行。

DemoA對象創建

復員對象創建

在創建對象,因爲System.out.println("DemoB object created");是當你創建對象所調用的方法構造內這些線打印。

+0

準確地說,DemoA對象創建並添加到數組列表,但它爲什麼打印出來? – noobprogrammer

+0

因爲'println'語句是創建對象時調用的構造函數的一部分。 –

+0

好的,有點合理,這是否意味着這個概念適用於任何地方?當我們創建一個具有構造函數的類的新對象時,它將執行構造函數中定義的所有語句? – noobprogrammer

1

在構造函數中有打印語句。當你寫新的DemoA()時,這些被調用「

+0

好的,但仍然沒有意義,因爲你爲什麼需要打印出來?只需添加到列表中。 – noobprogrammer

0

當你調用新的DemoA()時,你調用輸出DemoA Created的構造函數,並且當你實例化一個新的DemoB時,超級構造函數在輸出DemoA Created,然後調用DemoB構造函數並輸出demoB創建的情況下,所有都如預期

0

aList.add(new DemoA());

=> DemoA創建(構造A)

aList.add對象(新復員());

=(通過超級(),因爲DemoA是父類的復員稱爲構造器A)創建> DemoA對象 =>復員對象創建(構造器B)

首先的System.out.println(obj.methodA ());

=>在了methodA DemoA(在了methodA DemoA)

二的System.out.println(OBJ。了methodA());

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

+0

好的,但仍然沒有意義,爲什麼有需要打印出來?只需添加到列表中 – noobprogrammer