2012-11-19 4 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()); 

출력이 있지만, 나의이 생각에 그냥 내가 여기서 무엇을 놓치고, 목록 출력을 생성하지에 추가해야합니까? DemoB의 생성자에서

DemoA object created 
DemoA object created 
DemoB object created 
+1

DemoA (DemoB에서 methodA)에

. –

+0

그래도 인쇄 할 필요가있는 이유는 무엇입니까? 목록에 추가하기 만하면됩니다. – noobprogrammer

답변

2

,

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

당신이 DemoA의 생성자를 호출 super()를 호출합니다. 두 생성자 모두 println 문을 사용하므로 DemoB 객체를 만들 때이 두 행이 인쇄됩니다.

DemoA 객체는

DemoB 객체가

System.out.println("DemoB object created");는 개체를 만들 때 호출되는 생성자 메서드 내부에 있기 때문에 개체를 만들 때이 라인이 인쇄되어

을 만들어 만들었습니다.

+0

DemoA 객체가 생성되어 arraylist에 추가되었지만 인쇄하는 이유는 무엇입니까 ?? – noobprogrammer

+0

'println' 문은 객체를 생성 할 때 호출되는 생성자의 일부이기 때문입니다. –

+0

좋아, 다소 이해가된다. 그렇다면이 동일한 개념이 모든 곳에서 적용된다는 의미인가? 생성자가있는 클래스의 새 객체를 만들면 생성자에 정의 된 모든 명령문을 수행하게됩니까? – noobprogrammer

1

생성자에 print 문이 있습니다. "새로운 DemoA()"를 작성할 때 호출됩니다.

+0

그래도 인쇄 할 필요가있는 이유는 무엇입니까? 그냥 목록에 추가하십시오. – noobprogrammer

0

새 DemoA()를 호출하면 생성 된 DemoA를 생성하는 생성자를 호출하고 새 DemoB를 인스턴스화하면이 생성자에서 (명시 적으로) 호출됩니다 DemoA를 생성 한 다음 DemoB 생성자를 호출하고 생성 된 demoB를 출력하므로 모두가 예상대로입니다.

0

aList.add (새 DemoA());

=> DemoA 오브젝트 (생성자 A)

aList.add 생성 (새 DemoB());

= (DemoA가 DemoB의 상위 클래스이므로 슈퍼()에 의해 호출 생성자 A) 작성> DemoA 객체 => DemoB 객체를 생성 (생성자 B)

우선에서 System.out.println (obj.methodA());

=> methodA

번째에서 System.out.println (DemoA에서 methodA)에 DemoA (OBJ.methodA()); 당신이 자식 개체를 만들 때 부모의 기본 생성자는 항상 호출하기 때문에 => methodA

+0

그래도 인쇄 할 필요가있는 이유는 무엇입니까? 목록에 추가하기 만하면됩니다. – noobprogrammer