기능이 초기화

코드를 봐

class Parent {
    int i = 1;
    Parent() {
        System.out.println(i);
        int x = getValue();
        System.out.println(x);
    }
    {
        i = 2;
    }//这个叫构造块
    protected int getValue() {
        return i;
    }
}

class Son extends Parent {
    int j = 1;
    Son() {j = 2;}
    protected int getValue() {return j;}
}
class Test {
    public static void main(String[] args) {
        Son son = new Son();
        System.out.println(son.getValue());
    }
}

나는 위의 코드 출력이 1,1,2-이다 생각했다.
그 이유는 : 새로운 아들이 먼저 부모, 부모 내가 처음에 1을 할당합니다 초기화 한 후 생성자, 출력 1을 실행할 때 다음 내려 가서 계속 1, 출력 1, 2를 얻을 수 그리고 마지막으로 내가 할당 getvalue. 이어서 son.getValue () 시간, J = 2이 생성자 실행되는 제 것이다. 따라서, 최종 출력 2.

부모 빌딩 블록을 실행 초기화 할 때, 2가 할당되고, 그 후 2 출력한다 호출 getvalue 아들이 때, J = 0에는 초기화 J 없을 때 다음 호출 getvalue하지만 현실이다. 마지막 통화 son.getValue () 시간, 아들이 초기화되어, 출력 2 .. 그래서 보통의 결과는 2,0,2입니다.

자식 클래스는 부모 클래스보다 우선 있다면, 생성자, 메소드는 서브 클래스도 호출 : 여기 지식 사각 지대에 관해서는 말을하는 것입니다.

코드 조각이있다

// 程序B
public class MagimaTest {
    public static void main(String[] args) {
        magimaFunction();
    }
    static MagimaTest st = new MagimaTest();
    static {
        System.out.println("1");
    }
    {
        System.out.println("2");
    }
    MagimaTest() {
        System.out.println("3");
        System.out.println("a=" + a + ",b=" + b);
    }
    public static void magimaFunction() {
        System.out.println("4");
    }
    int a = 110;
    static int b = 112;
}

I 출력이 생각했다
. (1)
4.
3.
A = 0, B = 112

그러나 실제로는이다
2
. 3
A = 110, B = 0
(1).
(4).

주를 수행하기 전에, 당신은 MagimaTest 클래스를 초기화해야합니다.
정적 MagimaTest 세인트 = 새로운 MagimaTest ()를 수행하기 위해 ,
다음 생성자가 실행되지만, 생성자 전에 시작하기 전에 실행된다. 이 때, 2는 출력
초기화
A = 110, B가 초기화되지 않았을 때 생성자가 실행된다. 출력 (3), A = 110, B = 0
이어서 성 부재 변수 초기화 정적 한 다음 완료된다. 1. 출력은
다음 나 정적 변수 초기화 계속
마지막 통화 magimaFunction 출력 4.

정적 MagimaTest 세인트 = 새로운 MagimaTest ()를 수행이면 정적 초기화되지 않은 다음의 제 1 구성 단계를 완료 MagimaTest. 따라서 할당은 B 앞에있을 것이다.

추천

출처blog.csdn.net/huqianlei/article/details/91488254