자바 에서 대상 을 만 들 때 구성원 변수의 코드 실행 순 서 를 초기 화 합 니 다.

3268 단어 자바구조 기
먼저 하나의 스타일 을 드 립 니 다:
class Template {
    int i;//    
    double d;
    String name= "a name";//     (       )

    //        
    {
        d = 1.0;
    }

    Template(){
        name = "another name";
    }
}

대상 을 만 들 때 대상 의 모든 필드(속성 구성원,즉 클래스 변수)는 위의 Template 클래스 와 같은 기본 값 을 부여 합 니 다.필드 i 가 초기 값 을 주지 않 아 도 합 법 적 입 니 다.템 플 릿 대상 을 만 들 때 i 는 기본 초기 값 0 을 부여 합 니 다.앞에서 말 한 바 와 같이 모든 필드 에 기본 값 이 부여 되 기 때문에 name 필드 에 초기 값 이 부여 되 더 라 도 name 에 초기 값 이 부여 되 기 전에 기본 값 null 이 먼저 부여 되 었 습 니 다.
구조 대상 에서 필드 를 초기 화 할 수 있 는 세 가지 방법 이 있 습 니 다.문 구 를 초기 화 하 는 것(즉,성명 필드 는 할당),블록 을 초기 화 하 는 것,구조 함수 입 니 다.
초기 화 블록 의 위치 와 초기 화 문장의 위치 차이 가 많 지 않 습 니 다.초기 화 블록 의 등장 은 복잡 한 초기 화 어의 수 요 를 만족 시 키 기 위해 서 입 니 다(방법 처럼 초기 화 블록 에 복잡 한 문 구 를 쓸 수 있 습 니 다).
필드 초기 화 순 서 를 실행 하 는 것 은 모든 필드 에 초기 값 을 부여 한 다음 에 초기 화 문 구 를 호출 한 다음 에 초기 화 블록 을 호출 하고 마지막 으로 구조 함 수 를 호출 하 는 것 으로 간단하게 볼 수 있 습 니 다.
다음은 제 가 테스트 한 코드 입 니 다.
public class A{
    String s = "A:statement";
    {
        System.out.println(s);
        s = "A:block";
        System.out.println(s);
        
    }
    A(){
        s =  "A:constructor";
        System.out.println(s);
    }

    public static void main(String[] args){
        new A();
    }
 }

위의 코드 를 실행 하려 고 시도 하면 초기 화 할 때 실 행 된 순 서 를 알 수 있 습 니 다.초기 화 문 구 는 초기 화 블록 보다 구조 함수(기본 값 이 나타 나 지 않 음)보다 먼저 실 행 됩 니 다.
그러나 대상 을 대상 으로 하 는 모델 은 계승 차원 이 있 기 때문에 계승 을 고려 하면 좀 복잡 해 야 한다.
필드 의 초기 화 는 두 단계 로 나 뉘 는데 첫 번 째 단 계 는 모든 필드(계 승 된 필드 포함)에 기본 값 을 부여 하고 두 번 째 단계 로 들 어 갑 니 다.두 번 째 단 계 는 세 단계 로 나 뉜 다.
    1.부모 클래스 의 구조 기 를 호출 합 니 다.
    2.이 필드 의 초기 화 구문 과 초기 화 블록 을 호출 합 니 다.
    3.집행 구조 체
위의 이 말 은 책 에서 따 온 것 으로 이해 하기 어렵 고 개인 적 으로 표현 이 정확 하지 않다 고 생각 합 니 다.
다음은 내 이해 로 초기 화 된 2 단계 의 순 서 를 하나의 모델 로 설명 한다.
 {
         ;
    {
            
    }

        (){
        super(..);//         1
        *       //  (*)            ,       
        *      
               //        3
    }

        2(){
        this(..);
               
    }                     
}

다음 코드 는 제 가 직접 작성 한 것 입 니 다.출력 결 과 를 실행 해 보 세 요.
class A{
    String s = "A:statement";
    {
        System.out.println(s);
        s = "A:block";
        System.out.println(s);
        
    }
    A(){
        s =  "A:constructor";
        System.out.println(s);
    }
 }
 
 class B extends A{
    String s = "B:statement";
    {
        System.out.println(s);
        s = "B:block";
        System.out.println(s);
        
    }
    B(){
        s =  "B:constructor";
        System.out.println(s);
        
    }
}

class C extends B{
    String s = "C:statement";
    {
        System.out.println(s);
        s = "C:block";
        System.out.println(s);
        
    }
    C(){
        s =  "C:constructor";
        System.out.println(s);
    }
}

public class ConstructTest{
    public static void main(String[] args){
        new C();
    }
}

위의 모델 표현의 초기 화 과정 은 재 귀적 호출 과 유사 하 며,결 과 는 최 하층 의 부 류 를 먼저 초기 화 한 다음 에 한 단계 위로 유추 하 는 것 이다.그래서 다음 과 같은 결론 을 내 릴 수 있다.
        하나의 종 류 를 예화 할 때 계승 관계 가 낮은(부모 클래스 에서 하위 클래스 까지)순서 로 필드 를 초기 화 합 니 다.

좋은 웹페이지 즐겨찾기