final 변수의 초기화를 깊이 이해하다

2920 단어
final 변수의 초기화 위치는 첫째, 그 정의처이다. 즉,final 변수를 정의할 때 직접 값을 부여하는 것이다.
둘째는 구조 함수에 있다.그리고 자바에서 1.1 이전에는 정의할 때만 값을 줄 수 있었다.
세 번째는 코드 블록에서 {} 또는static{}
 
  
public class InitOrder {
    {
        System.out.println("before---field");
        //System.out.println("d1="+d1);
        d1 = 3;
        //System.out.println("d1="+d1);
    }
    static {
        System.out.println("before---static field");
        //System.out.println("d2="+d2);
        d2 = 3;
        //System.out.println("d2="+d2);
    }
    final int a1 = 1;
    final int b1;
    final int c1;
    final int d1;
    //final int e1;
    static final int a2 = 1;
    //static final int b2;
    static final int c2;
    static final int d2;
    //static final int e2;

    {
        System.out.println("after---field");
        //System.out.println("c1="+c1);
        c1 = 4;
        System.out.println("c1="+c1);
        //e2 =3;
    }
    static {
        System.out.println("after---static field");
        //System.out.println("c2="+c2);
        c2 = 4;
        System.out.println("c2="+c2);
        //e1 = 3;
    }
    public InitOrder() {
        b1 = 2;
        //b2 = 2;
    }
    public static void main(String[] args) {
        InitOrder order = new InitOrder();
        System.out.println("c1="+order.c1);
        System.out.println("c2="+order.c2);
        System.out.println("d1="+order.d1);
        System.out.println("d2="+order.d2);
    }
}

설명: 위의 모든 주석은 구문 오류로 출력된 결과입니다.
before---static field
after---static field
c2=4
before---field
after---field
c1=4
c1=4
c2=4
d1=3
d2=3
결과 분석: 1.a1에 비해 a2는 기본적으로 문제가 없고 정의할 때 초기화됩니다
2. b1과 비교하면 b2는 구조 함수에서 초기화되고 b1은 문제가 없다. b2는 문제가 있다. 이것은 구조 함수의 호출이 정적 변수의 뒤에 있고 b2는 정적이기 때문에 오류가 발생할 수 있다.
3. c1과 비교하면 d1은 초기화에 문제가 없고 문제가 있는 것은 출력 문장을 사용하는 것이다.d1이 초기화 코드 블록에서 어디에 출력 문구를 추가하든지 오류가 발생할 수 있습니다. 이것은 d1이 있는 초기화 코드 블록의 위치가 변수 d1이 정의한 앞에 있기 때문입니다. 그러나 자바에서 변수의 초기화 순서는 자바에서 변수의 초기화 순서를 볼 수 있습니다. 일반 변수와 초기화 코드 블록의 초기화 순서는 위치의 선후에 따라 출력이 d1 변수를 사용했기 때문에 오류가 발생했습니다. 그러나 저는 잘 모르겠습니다.왜 여기서 d1을 초기화하면 오류가 발생하지 않으며main 함수에서도 호출할 수 있습니다. 이것도 자바 가상기를 보러 가야 합니까?c1이 뒤에 출력 문장을 추가하는 데 문제가 없습니다.앞에 문제가 있으면 이해하기 쉬운데, 바로 이전에 초기화되지 않았다.
4. c2, d2는 3과 같은 이치
5. e1을 정적 코드 블록에 넣으면 분명히 안 된다. 정적 코드 블록이 가장 먼저 불러오기 때문에 e1은 아직 추가하지 않았다.
6.e2에 대해서도 일반 코드 블록의 불러오는 것이 정적 변수보다 늦기 때문에 안 된다.

좋은 웹페이지 즐겨찾기