자바 의 각 구성원 변수 초기 화 프로 세 스

4438 단어 Java
0. 머리말
최근 Thinking in 자바 를 보고 있 습 니 다. 클래스 의 각 멤버 초기 화 에 대해 관심 이 없 었 습 니 다. 여기에 기록 하 십시오. 오류 가 있 으 면 지적 하 십시오.
1. 계승 과 초기 화
계승 을 포함 한 초기 화 전 과정 을 이해 하여 발생 하 는 모든 것 에 대해 전면적 인 파악 을 하 는 것 이 유익 하 다.
자바 에 서 는 모든 종류의 컴 파일 코드 가 독립 된 파일 (즉 클 라 스 파일) 에 존재 합 니 다. 이 파일 은 프로그램 코드 를 사용 해 야 불 러 옵 니 다.일반적으로 "클래스 의 코드 는 처음 사용 할 때 만 불 러 옵 니 다". 이것 은 보통 다음 두 가지 상황 을 포함 합 니 다.
  • 클래스 의 첫 번 째 대상 을 만 들 때
  • static 방법 이나 필드 에 접근 할 때
  • 메모: 클래스 를 처음 사용 할 때 도 static 초기 화가 발생 하 는 곳 입 니 다. 모든 대상 과 코드 는 쓰기 순서에 따라 초기 화 되 며, static 로 정 의 된 필드 는 한 번 만 초기 화 됩 니 다.
    쓸데없는 말 은 그만 하고 상세 하 게 는 다음 과 같다.
    public class Base {
        //static  
        private static int I1 = printInt("Init I1");
        //    
        private int i = 11;
        protected int j;
        public Base(){
            System.out.println("Base constructor");
            System.out.println("i="+i+" j="+j);
            j = 40;
        }
        static int printInt(String str) {
            System.out.println(str);
            return 10;
        }
    }
    public class Son extends Base{
        private static int I2 = printInt("Init I2");
        public Son() {
            System.out.println("Son constructor");
            System.out.println("I2="+I2+" j= "+j);
        }
        public static void main(String[] args) {
            Son son = new Son();
        }
    }

    이 코드 를 보고 출력 이 뭐라고 생각 하 세 요?
    먼저 답 을 주 고 분석 하 겠 습 니 다.
    Init I1
    Init I2
    Base constructor
    i=11 j=0
    Son constructor
    I2=10 j= 40
    

    분석:
    프로그램 은 먼저 Son 류 의 main 방법 에 착안 하여 로 더 를 시작 하고 Son 컴 파일 코드 (즉 class 파일) 를 찾 습 니 다.로 딩 중 Son 과 부모 클래스 Base 를 발견 하고 Base 의 컴 파일 코드 (Base 와 부모 클래스 가 있 으 면 계속 위로 실행) 를 계속 불 러 옵 니 다. 그 다음 에 기본 클래스 의 static 필드 가 초기 화 되 었 습 니 다. 하위 클래스 는 기본 클래스 의 구성원 이 올 바 르 게 초기 화 될 수 있 기 때문에 발생 했 습 니 다 Init I1. 그리고 Son, Son 류 의 static 필드 로 내 려 가 초기 화 되 었 습 니 다.그래서 Init I2 이 발생 했 습 니 다. 이 모든 필요 한 클래스 로 딩 이 완료 되면 대상 을 초기 화 할 수 있 습 니 다.Son son = new Son() 이 코드 를 보고 Son 의 구조 기 를 호출 하려 고 합 니 다. 우 리 는 계승 관계 에서 하위 구조 기 에서 슈퍼 () 를 호출 할 것 이라는 것 을 알 고 있 습 니 다. 물론 여 기 는 암시 적 호출 입 니 다.이렇게 하면 다시 부모 클래스 로 돌아 갑 니 다. 그러나 구조 기 를 완성 하기 전에 부모 클래스 (Base) 의 모든 일반 필드 (즉, static 필드 가 아 닌) 가 자신의 초기 화 를 완성 하기 때문에 출력 i=11 j=0 을 볼 수 있 습 니 다. 이 어 하위 클래스 (Son) 에 와 서 부모 클래스 의 실행 과정 과 마찬가지 로 일반 필드 의 초기 화 를 먼저 완성 한 다음 구조 기 방법 을 호출 합 니 다.
    많은 말 을 했 는데 전체적인 절 차 는 다음 과 같다.
  • 프로그램 입구 부터 이 종 류 를 불 러 옵 니 다 (여 기 는 Z 류 로 설정). 계승 관계 가 있 으 면 루트 클래스 (여기 서 A 류 를 가정 합 니 다) 까지 재 귀 합 니 다.
  • A 류 의 static 필드 초기 화 를 완료 하고 Z 류 를 만 날 때 까지 아래로 돌아 갑 니 다.
  • A 류 의 일반 도 메 인 초기 화 를 완성 하고 A 류 의 구조 기 를 완성 하 며 Z 류 를 만 날 때 까지 아래로 돌아 갑 니 다.
  • 좋은 웹페이지 즐겨찾기