자바 클래스 구성원 의 초기 화 순서

3983 단어 자바F#
초기 화 순 서 는 먼저'정적'입 니 다.(앞의 대상 생 성 과정 으로 초기 화 되 지 않 았 다 면)다음'정적'입 니 다.
구체 적 인 생 성 과정:
1.클래스 대상 을 처음 만 들 때 나 이러한 정적 방법/정적 도 메 인 이 처음 방문 되 었 을 때 자바 해석 기 는 이러한 클래스 의 경 로 를 찾 아 클 라 스 파일 을 찾 아야 합 니 다.
2.그리고 이 class(class 대상 만 들 기)를 불 러 옵 니 다.정적 초기 화 에 관 한 동작 은 모두 실 행 됩 니 다.정적 초기 화 는 Class 대상 이 처음 불 러 올 때 만 실 행 됩 니 다.
  초기 화 동작
static int n1 = f(1);
static{
   n3 = f(3);
   //                   ,       n3,             
   System.out.println("println");
}
static int n2 = f(2);
static int n3;
static int f(int i){
   System.out.println("n"+i);
   return i;
}
 
대상 을 만 들 거나 이러한 정적 도 메 인/정적 방법 에 접근 하여 인쇄 합 니 다.
n1
n3
println
n2
3.new 연산 자 를 사용 하여 대상 을 만 들 때 먼저 만 들 대상 에 게 충분 한 저장 공간 을 배정 합 니 다.
4.이 저장 공간 은 0 으로 삭 제 됩 니 다.이 는 클래스 의 모든 기본 형식 데 이 터 를 기본 값(수치 와 문 자 는 0,불 은 false)으로 자동 으로 설정 하고 인용 은 null 로 설정 합 니 다.
5.도 메 인(비 정적 도 메 인)정의 에 나타 나 는 모든 초기 화 동작 을 나타 나 는 순서대로 실행 합 니 다.
6.실행 구조 기.
아래 의 예 를 실행 하면 모두 명확 해진 다.
public class MembersInitializeSequence {
   
    public static void main(String[] args){
        Bowl.f();
        System.out.println("     Bowl  ");
        new Bowl();
        System.out.println("      Bowl  ");
        new Bowl();
    }
}

class Cup {
    Cup(int i){
        System.out.println("new Cup("+i+")");
    }
}

class Bowl{
    Cup c1;
    Cup c2 = new Cup(2);
    {
        c1 = new Cup(1);
    }
    static{
        c4 = new Cup(4);
        System.out.println("Bowl     ,             ,       ");
    }
    static Cup c3 = new Cup(3);
    static Cup c4;
    Bowl(){
        System.out.println("new Bowl()");
    }

    static void f(){
        System.out.println("Bowl      f()   ");
    }
}
 
클래스 가 계승 되 었 을 때 초기 화 된 순서:
1.초기 화 자 류,클래스 로 더 를 불 러 올 때 다른 클래스 를 계승 한 것 을 발견 할 수 있 습 니 다.클래스 로 더 는 먼저 부모 클래스 를 불 러 와 야 합 니 다.그래서 부모 클래스 를 불 러 오기 시 작 했 습 니 다.부모 클래스 의 정적 부분 은 순서대로 불 러 옵 니 다.이후 하위 클래스 의 정적 부분 이 불 러 옵 니 다.이러한 순 서 는 하위 클래스 의 정적 도 메 인 이 부모 클래스 의 정적 도 메 인 에 의존 할 수 있 음 을 고려 하 는 것 이다.
2.부모 클래스 의 비정 상 부분 이 불 러 옵 니 다.
3.하위 클래스 가 지정 한 부모 클래스 의 구조 기;
4.하위 클래스 의 비정 상 부분 이 불 러 오기;
5.하위 구조 기의 나머지 부분.
여러 차원 의 계승 관 계 는 순서 도 마찬가지다.
 
예컨대
public class MembersInitializeSequenceEx {
    public static void main(String[] args){
//        new Cat();
        new Tiger();
    }
}
class Cat{
    int c1 = f1(1);
    int f1(int i){
        System.out.println("Cat unstatic "+i);
        return i;
    }
    {
        System.out.println("Cat unstatic block");
    }
    static int c2 = f2(2);
    static int f2(int i){
        System.out.println("Cat static "+i);
        return i;
    }
    static{
        System.out.println("Cat static block");
    }
    public Cat(){
        System.out.println("new Cat()");
    }
}
class Tiger extends Cat{
    int c3 = f1(3);
    @Override
    int f1(int i){
        System.out.println("Tiger unstatic "+i);
        return i;
    }
    {
        System.out.println("Tiger unstatic block");
    }
    static int c4 = f2(4);
    static int f2(int i){
        System.out.println("Tiger static "+i);
        return i;
    }
    static{
        System.out.println("Tiger static block");
    }
    public Tiger(){
        super();
        System.out.println("new Tiger()");
    }
}

좋은 웹페이지 즐겨찾기