[Java 학습 노트] 클래스 초기 화 실행 순서

4351 단어 컴퓨터 기반
인터넷 에서 많은 사람들 이 이 책 을 추천 하 는 것 을 보고 자바 에 입문 했다.결 과 는 보면 볼 수록 화가 나 고, 가 는 길에 C + + 를 어 지 럽 히 고, 들 어 올 리 는 이른바 자바 의 장점 도 볼 수록 폐물 이다.C + + 에 두 었 더 니 무슨 일 들 이 이렇게 많아?글 쎄 요. 작 가 는 자바 의 기본 지식 을 잘못 알 고 있 습 니 다. 제 가 실험 을 하지 않 으 면 아직 모 릅 니 다.다행히 나 는 실물 책 을 사지 않 았 다. 그렇지 않 았 다 면 벌써 불 에 탔 을 것 이다.
먼저 클래스 가 JVM 에 불 러 올 지 여부 에 대한 질문: 1. 클래스 의 정적 구성원 이나 정적 함수 가 접근 할 때 클래스 와 기본 클래스 가 불 러 옵 니 다.2. 클래스 가 첫 번 째 로 예화 되 기 전에 클래스 와 그 기본 클래스 가 실 립 니 다.이 이외 의 행 위 는 클래스 의 마 운 트 를 일 으 키 지 않 습 니 다.
클래스 가 불 러 올 때 정적 부분의 초기 화 순 서 는 다음 과 같 습 니 다. 1. 모든 정적 구성원 과 정적 방법 에 메모 리 를 할당 하고 정적 구성원 을 0 또는 null 로 설정 합 니 다.2. 기본 클래스 가 존재 하고 기본 클래스 가 불 러 오지 않 으 면 기본 클래스 에 대해 이 절 차 를 수행 합 니 다.3. 쓰기 순서에 따라 정적 구성원 에 게 초기 값 을 부여 합 니 다.4. 정적 코드 블록 을 실행 합 니 다.
그 다음 에 실례 화 할 때의 초기 화 과정 입 니 다. 1. 클래스 의 모든 구성원 에 게 메모 리 를 분배 하고 값 을 0 또는 null 로 설정 합 니 다.2. 기본 클래스 가 존재 하면 첫 번 째 단계 로 돌아 가 기본 클래스 의 초기 화 를 실행 합 니 다.3. 쓰기 순서에 따라 클래스 의 비정 상 구성원 에 게 초기 값 을 부여 합 니 다.4. 비정 상 코드 블록 을 실행 합 니 다.5. 구조 함 수 를 집행 한다.
기본 클래스 의 정적 방법 은 덮어 쓰 지 않 고 정적 방법 이 덮어 쓰 이지 않 습 니 다.
다음은 실험 코드 입 니 다.
class InitTestBase{
    static String name = getName();
    static String getName() { return "InitTestBase"; }
    static {
        System.out.println("InitTestBase loaded.");
        System.out.println("Static InitTestBase.name = " + name);
    }
    protected String state = "Base Initialized";
    {
        Overrided("InitTestBase");
    }
    void Overrided(String parent){
        System.out.println("InitTestBase.state = \""+state+"\""
                + ", invoked by " + parent);
    }
    InitTestBase(){
        System.out.println("InitTestBase() invoked.");
    }
}

class InitTest extends InitTestBase{
    static String name = getName();
    static String getName() { return "InitTest"; }
    static {
        System.out.println("InitTest loaded.");
        System.out.println("Static InitTest.name = " + name);
    }
    void Overrided(String parent){
        System.out.println("InitTest.state = \""+state+"\""
                + ", invoked by " + parent);
    }
    protected String state = "Initialized";
    {
        Overrided("InitTest");
    }
    InitTest(){
        System.out.println("InitTest() invoked.");
    }
}

public class Main{
    static{
        System.out.println("Main loaded.");
    }
    public static void main(String[] args) {
        System.out.println("main() invoked.");
        new InitTest();
    }
}

실행 결 과 는 다음 과 같 습 니 다.
Main loaded.
main() invoked.
InitTestBase loaded.
Static InitTestBase.name = InitTestBase
InitTest loaded.
Static InitTest.name = InitTest
InitTest.state = "null", invoked by InitTestBase
InitTestBase() invoked.
InitTest.state = "Initialized", invoked by InitTest
InitTest() invoked.

좋은 웹페이지 즐겨찾기