자바 의 면접 문제 - 정적 변수 초기 화 과정

출처:http://topic.csdn.net/u/20120222/22/dc082753-6298-4709-ba5a-a6df55c3a207.html
제목 은 다음 과 같다.
public class Test{
    private static Test tester = new Test(); //step 1
    private static int count1;               //step 2
    private static int count2 = 2;           //step 3
    public Test(){                           //step 4
        count1++;
        count2++;
        System.out.println("" + count1 + count2);
    }
    public static Test getTester(){          //step 5
        return tester;
    }
    
    public static void main(String[] args){
       Test.getTester();
    }
}

― 상기 코드 실행 순서 ~ 출력 결과 ~
정 해:
static 대상 의 성질 에 따라 프로그램의 실행 절 차 는: Test tester = null 입 니 다.int count1 = 0; int count2 = 0; tester = new Test();   count1 ++;   count2 ++;   출력 1 1 count 2 = 2;최종 결 과 는 12, 출력 은 1.
----------------------------------------------------------------------
1. JVM 가상 컴퓨터 의 작 동 은 안내 클래스 로 더 (Bootstrap Class Loader) 를 통 해 초기 화 클래스 를 불 러 오 는 것 입 니 다. 이 종 류 는 가상 컴퓨터 의 구체 적 인 실현 에 의 해 지 정 됩 니 다. 즉, 일반적인 의미 의 작 동 클래스 (주 클래스) 입 니 다.그리고 가상 컴퓨터 가 이 종 류 를 연결 하여 Public void main (String []) 방법 을 초기 화하 고 호출 합 니 다.2. 면접 문 제 는 문맥 에 따라 초기 화 류 가 Test 류 라 고 볼 수 있 기 때문에:  a. 먼저 이 종 류 를 불 러 온 다음 에 링크 의 준비 단계 (링크 는 검증, 준비, 참조 세 단계 포함) 에서 모든 클래스 (정적) 변수 에 메모 리 를 할당 하고 기본 값 (Test tester = null) 으로 설정 합 니 다.int count1 = 0; int count2 = 0;)   b. 링크 가 완 료 된 후에 (클래스) 초기 화 를 하고 코드 에서 설명 하 는 순서에 따라 클래스 (정적) 변 수 를 초기 화 합 니 다. 즉, 먼저 호출 하 는 것 입 니 다.
Java code

    
    
    
    
private static Test tester = new Test(); // step 1

  주: 기본 클래스 초기 화 와 < clinit > 에 관 한 세부 사항 을 생략 하 였 습 니 다.
  c. 상기 단계 에서 new 트리거 Test 류 의 실례 화 (대상 생 성) 는 먼저 더미 에 메모 리 를 분배 한 다음 에 대상 변 수 를 초기 값 으로 설정 한 다음 에 < init > 를 호출 합 니 다. 세부 사항 은 생략 합 니 다. 쉽게 말 하면 구조 방법의 호출 을 초래 할 수 있 습 니 다. 즉,:
Java code

    
    
    
    
public Test(){ // step 4 count1 ++ ; count2 ++ ; System.out.println( "" + count1 + count2); }

  이 때 count 1 과 count 2 는 초기 화 되 지 않 았 고 기본 값 0 (링크 준비 단계) 으로 간단하게 설정 되 었 음 이 분명 합 니 다.그래서 인쇄 된 값 은 항상 11 입 니 다.
  d. 다음 에 계속 성명 순서에 따라 초기 화 를 실행 합 니 다. 즉,:
Java code

    
    
    
    
private static int count1; // step 2 private static int count2 = 2 ; // step 3

  e. 초기 화 완료 후 초기 클래스 의 로드 가 완료 되 었 습 니 다. main 방법 으로 이동 하여 실행 합 니 다.
그래서 순서 가 14253 이 고 count 2 와 count 1 이 얼마 든 인쇄 된 것 은 항상 11 이다.순 서 를 바 꾸 면, 예 를 들 면...
Java code

    
    
    
    
count 2 = 2 ; new test();

  그러면 인쇄 결 과 는 13 입 니 다.

좋은 웹페이지 즐겨찾기