추상 클래스를 상속 할 때 왜 실행 결과가 기대에 부응하지 않습니다

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.

추천

출처http://43.154.161.224:23101/article/api/json?id=348430&siteId=1