계승, 초기 화 및 클래스 로드

자바 의 계승 과 초기 화 및 클래스 의 로드 는 비교적 복잡 한 과정 으로 자바 프로 그래 밍 사상 을 볼 때 책 에서 이 부분 을 이야기 했다.책의 한 예 는 이 문 제 를 매우 분명하게 말 하 는데 코드 는 다음 과 같다.
이 프로그램의 출력 결 과 는 다음 과 같 습 니 다.
static Insect.x initialized static beetle initialized bettle constructor i=9 j=0 Bettle.k initialized k=47 j=39
다음은 프로그램의 실행 과정 을 구체 적 으로 분석 합 니 다.
자바 파일 의 실행 은 우선 클래스 의 로 딩, 즉 main 함 수 를 찾 은 다음 에 관련 클래스 의 로 딩 을 하 는 것 을 알 고 있 습 니 다.이 자바 파일 에 대해 서 는 프로그램 이 처음에 Beetle 의 main 방법 을 찾 은 다음 Beetle 의 class 파일 을 불 러 오 려 고 했 습 니 다. class 파일 을 불 러 오 는 과정 에서 이 Beetle 류 가 다른 종류의 Insect 를 계승 한 것 을 발 견 했 기 때문에 프로그램 은 먼저 Insect 의 class 파일 을 불 러 와 야 합 니 다.이후 자신의 class 파일 을 불 러 옵 니 다.이때 Insect 클래스 가 다른 클래스 를 계승 할 경우 같은 방법 으로 유추 합 니 다.여기 서 클래스 의 로드 과정 을 실 행 했 습 니 다.그러나 불 러 올 때 구체 적 으로 실 행 된 동작 은 무엇 일 까?코드 수정 을 통 해 테스트 할 수 있 습 니 다:
4. 567913. 위의 코드 주석 이 main 방법 을 떨 어 뜨 렸 습 니 다. 어떤 결과 인지 실행 해 보 세 요.
static Insect.x initialized static beetle initialized java.lang.NoSuchMethodError: main Exception in thread "main" 
프로그램 알림 은 main 방법 을 찾 을 수 없다 고 합 니 다. 그것 은 긍정 적 인 것 입 니 다. main 방법 이 주석 되 었 기 때 문 입 니 다.그러나 주의해 야 할 것 은 main 방법 이 없다 는 것 이다. 즉, 프로그램 이 제대로 실행 되 지 않 았 지만 프로그램 이 static Insect. x initialized, static beetle initialized 라 는 두 마디 를 출력 했다 는 것 이다.이해 가 안 되 는 것 같 습 니 다.나 는 main 방법 도 없 는데 어떻게 출력 이 있 을 수 있 습 니까?자세히 분석 해 보 자. 우선 수출 한 이 두 마디 가 어떤 특징 이 있 는 지 살 펴 보 자.좋아, 그들 은 모두 static 로 수식 한 거 야.그리고 그들의 출력 순 서 를 살 펴 보 자. Insect. x 는 먼저 출력 하고 beetle 은 나중에 출력 한다.왜 그 럴 까요?이게 도대체 왜 일 까요?좀 알 것 같 아 요. 맞아요. 괜찮아 요. 바로 위 에서 말 한 클래스 로드 순서 잖 아 요!실 마 리 를 정리 하려 면 먼저 Insect 류 를 불 러 오고 Beetle 류 를 불 러 올 때 무엇 을 합 니까?두 문장 을 출력 했 는데 왜 출력 자 두 문장 입 니까?static 로 꾸 몄 으 니까.프로그램 을 불 러 올 때 static 수식 부분 을 만나면 바로 실행 합 니 다. 즉, static 수식 부분 은 컴 파일 기간 에 실 행 됩 니 다!ok, 드디어 새 를 알 았 다.
이어서 저희 가 분석 을 해 보도 록 하 겠 습 니 다.
bettle constructor i=9 j=0 Bettle.k initialized k=47 j=39
이 문장 들 은 어떻게 출력 합 니까?우선 bettle constructor 입 니 다. 이 점 은 쉽게 이해 할 수 있 습 니 다. 왜냐하면 이것 은 제 가 main 방법 에서 직접 인쇄 한 것 이기 때 문 입 니 다.그리고 i = 9 j = 0 은 어떻게 출력 합 니까?우리 의 소스 프로그램 을 보고 이 문장의 출력 위 치 를 찾 아 보 니 Insect 의 구조 방법 에 있 습 니 다. 즉, Beetle b = new Beetle () 을 사용 하고 있 습 니 다.Beetle 대상 을 설명 할 때 먼저 부모 클래스, 즉 Insect 류 의 구조 방법 을 호출 했 습 니 다. 이때 i 와 j 를 출력 했 습 니 다.i 는 성명 에서 9 로 직접 초기 화 되 었 기 때문에 출력 은 i = 9 입 니 다.j 는 초기 화 되 지 않 았 기 때문에 시스템 을 사용 하여 자동 으로 초기 화 합 니 다: j = 0.그리고 j 의 값 은 j = 39 가 부여 되 었 습 니 다.Insect 의 구조 방법 을 호출 한 후 Beetle 의 구조 방법 을 호출 합 니 다.한편, Bettle 의 구조 방법 에서 k 의 값 을 출력 해 야 하기 때문에 printInit 방법 을 호출 하여 Bettle. k initialized 를 출력 했 고 k 는 47 을 부여 하여 k = 47 을 출력 했 습 니 다. 이때 j 는 앞에서 부여 되 었 기 때문에 j = 39 를 출력 했 습 니 다.이로써 우 리 는 전체 프로그램의 집행 절 차 를 분석 했다.
요약: 프로그램 이 실 행 될 때 먼저 자신의 class 파일 을 불 러 옵 니 다. 이 클래스 가 다른 클래스 를 계승 하면 부모 클래스 의 class 파일 을 불 러 온 다음 에 자신의 class 파일 을 불 러 옵 니 다.클 라 스 파일 을 불 러 올 때 프로그램 에 static 수식 부분 이 있 으 면 바로 실 행 됩 니 다.(static 수식 부분 은 컴 파일 기간 부분) 모든 클래스 의 class 파일 을 불 러 온 후 대상 을 만 들 때 부모 클래스 의 구조 기 를 사용 하여 부모 클래스 의 대상 을 만 든 다음 자신의 구조 기 를 사용 하여 자신의 대상 을 만 듭 니 다.대상 을 만 들 때 각 변 수 는 나타 나 는 순서대로 초기 화 됩 니 다.

좋은 웹페이지 즐겨찾기