코드를 봐
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 앞에있을 것이다.