Rylaris :
class C {
public static void main(String[] args){
B test = new B(1);
}
}
abstract class A {
int i = 1;
abstract void test();
public A(){
System.out.println("before test()");
test();
System.out.println("after test");
}
}
class B extends A {
int i = 1;
@Override
void test(){
System.out.println("test()" + i);
}
public B(int i) {
System.out.println("before test()");
test();
System.out.println("after test");
}
}
이 코드를 실행하면, 출력은
before test()
test()0
after test
before test()
test()1
after test
I 출력 결과의 첫 세트는의 시공 방법에서 유래 알고, 나도 몰라
변수 i가 처음으로 0 인 이유지만, 두 번째 시간에 권리입니다.
그들은했다 :
당신의 인스턴스를 생성하는 B
생성자를 사용하여 B(int i)
.
즉, 생성자는 슈퍼 클래스 생성자를 실행하여 시작합니다 public A()
. 이 생성자 호출 test()
에서 재정의되고, B
클래스와 출력 i
클래스의 변수를 B
.
슈퍼 클래스의 생성자의 인스턴스 변수 전에 실행되기 때문에 그 변수는 아직 초기화되지 B
초기화됩니다. 따라서, 여전히 기본 값을 포함합니다 0
.
생성자 후에 public A()
행해진 다 B
의 인스턴스 변수 (그래서 초기화 i
초기화된다 1
)과 B
의 생성자 본체가 실행된다. 그것은 호출 test()
지금 인쇄하는 1
.