2014-02-16 2 views
0

상속 및 개체 생성에 대해 혼란스러워하며 아래 예제에서 어떤 개체가 완벽하게 구성되었는지 이해하려고합니다. 나는이 프로그램을 실행하면Java에서 계층 구조 이해

class example 
{ 
    public static void main (String[] args) 
    { 
     System.out.println("starting...") ; 

     A localAinMain = new A() ;        // object created 
     B localBinMain = new B() ;        // object created 
     C localCinMain = new C() ;        // object created 

     System.out.println("...finishing") ; 

     return ; 
    } 
} 

class A 
{ 
    // class fields 
    protected static int objectNo =  0 ; 
    private static C staticCinA = new C() ;     // object created 

    // instance fields 
    public final int serialNo = ++objectNo ; 

    public A() { System.out.println("\tA.A[" + serialNo + "] - ctor\n") ; } 

    static  { System.out.println("\tA  - static initializer\n") ; } 
} 

class B extends A 
{ 
    // class fields 
    private static B staticBinB = new B() ;      // object created 

    // instance fields 
    private A instanceAinB = new A() ;       // object created 

    public B() { System.out.println("\tB.B[" + serialNo + "] - ctor\n") ; } 

    static  { System.out.println("\tB  - static initializer\n") ; } 
} 

class C extends B 
{ 
    // class fields 
    private static A staticAinC = new A() ;      // object created 

    // instance fields 
    private B instanceBinC = new B() ;       // object created 

    public C() { System.out.println("\tC.C[" + serialNo + "] - ctor\n") ; } 

    static  { System.out.println("\tC  - static initializer\n") ; } 
} 

, 나는 누군가가 CC [11]와 AA [11]와 같은 객체 생성 순서를 설명 할 수있는 경우

starting... 
    A.A[1] - ctor 

    A.A[2] - ctor 

    B.B[1] - ctor 

    B  - static initializer 

    A.A[3] - ctor 

    C  - static initializer 

    A.A[4] - ctor 

    A.A[5] - ctor 

    B.B[4] - ctor 

    A.A[6] - ctor 

    A.A[7] - ctor 

    B.B[6] - ctor 

    C.C[4] - ctor 

    A  - static initializer 

    A.A[8] - ctor 

    A.A[9] - ctor 

    A.A[10] - ctor 

    B.B[9] - ctor 

    A.A[11] - ctor 

    A.A[12] - ctor 

    B.B[11] - ctor 

    A.A[13] - ctor 

    A.A[14] - ctor 

    B.B[13] - ctor 

    C.C[11] - ctor 

...finishing 

내가 "localCinMain 될 것 궁금 아래의 출력을 얻을 "하지만 왜 어떤 도움을 주는지 이해하지 못합니다.

답변

1

하위 클래스의 생성자를 호출 할 때 해당 생성자의 첫 번째 호출은 항상 super에 대한 호출이어야합니다. 수퍼 클래스의 생성자를 명시 적으로 호출하지 않으면 암시 적으로 호출이 수행됩니다.

super에 대한이 호출은 항상 다른 것보다 먼저 발생하기 때문에 실행 된 코드의 순서는 항상 super이며 subclass입니다.

슈퍼 클래스를 명시 적으로 호출하는 코드 예제 : 당신은 몇 가지 다른 코드 후이 전화를 걸하려고하면 불법이기 때문에

public class B extends A { 
    public B() { 
     super(); 
     //Code for constructing B. 
    } 
} 

, 당신의 컴파일러가 불평합니다.

귀하의 질문에 대한 답변이 있습니까?

1

Java에서 클래스가 인스턴스화 될 때 수퍼 클래스의 기본 생성자가 체계적으로 호출됩니다. 전체 계층 구조 (Object 클래스로 이동)가 통과됩니다. 이 공식적으로 here 설명되어 있습니다 : 서브 클래스의 생성자를 명시 적으로 또는 암시 적으로, 슈퍼 클래스의 생성자를 호출

경우라는 생성자의 전체 체인이있을 것이라고 생각, 다시의 생성자에 모든 방법을 목적. 사실,이 경우입니다. 이것은 생성자 체인이라고 불리며 긴 클래스 선이있을 때이를 인식해야합니다.

1

모든 파생 클래스 생성자는 자체를 실행하기 전에 기본 클래스 생성자를 호출합니다.

왜? 생성자의 작업은 객체를 올바르게 초기화하는 것입니다. 파생 클래스는 멤버 만 액세스 할 수 있지만 Base 클래스의 속성을 상속합니다. Base 클래스 생성자를 호출하면 객체가 올바르게 생성되었는지 확인할 수 있습니다.

실행 중에 생성자가 호출되는 순서는 다음과 같습니다.
1. 정의 된 변수에 대해 메모리가 할당됩니다.
2. 생성자 (예 : int a = 10) 외부의 초기화 값을 갖는 변수가 초기화됩니다.
3. 생성자가 호출됩니다. 그러나 생성자의 코드는 Base 클래스 생성자가 호출 된 후에 만 ​​(암시 적으로) 실행됩니다.

이제

당신에게 출력을 이해하는 시작을주고,

주에서 프로그램에 도달

"A localAinMain = 새로운 A();" 라인, 무슨 일이 일어나는거야.
1. 클래스 A의 객체에 대한 메모리가 할당되어야합니다.
2. 'ObjectNo'에 공간이 할당되고 C 클래스의 객체에 공간이 할당됩니다.
3. 다음으로 ObjectNo의 초기화가 발생하고 클래스 C의 Object 초기화가 발생합니다. 이제 클래스 C 내에서 객체에 대한 공간이 할당되는 방식과 생성자가 호출되는 방식을 확인하는 비슷한 접근 방식을 따르십시오. 클래스 C의 생성자가 호출 될 때 클래스 C가 클래스의 상속을 받기 때문에 A와 B의 생성자를 호출해야한다는 점을 명심하십시오.

질문이 해결되기를 바랍니다. 저도 학습자이므로 답변을 수정하거나 더 자세히 질문하십시오.