다음과 같이 코드 코드를 복사합니다 .
공개 클래스 Test4 {
@시험
공개 무효 테스트(){
자식 자식 = 새 자식();
}
}
클래스 부모{
public static String parentStaticField = "상위 클래스 정적 변수";
public String parentNormalField = "상위 클래스 일반 변수";
정적 {
System.out.println(parentStaticField);
System.out.println("상위 클래스 정적 블록");
}
{
System.out.println(parentNormalField);
System.out.println("상위 클래스 일반 블록");
}
공개 부모(){
System.out.println("부모 클래스 생성자");
}
}
클래스 자식이 부모를 확장함{
public static String childStaticField = "하위 클래스 정적 변수";
public String childNormalField = "하위 클래스 일반 변수";
정적 {
System.out.println(childStaticField);
System.out.println("하위 클래스 정적 블록");
}
{
System.out.println(childNormalField);
System.out.println("하위 클래스 일반 블록");
}
공개 자식(){
System.out.println("하위 클래스 생성자");
}
}
산출:
다음과 같이 코드 코드를 복사합니다 .
상위 클래스 정적 변수
상위 클래스 정적 블록
서브클래스 정적 변수
서브클래스 정적 블록
상위 클래스 일반 변수
상위 클래스 일반 블록
상위 클래스 생성자
서브클래스 일반 변수
서브클래스 일반 블록
서브클래스 생성자
실행 프로세스:
1. 새 하위 항목을 실행할 때 로더는 컴파일된 하위 클래스(즉, child.class 파일)의 코드를 찾습니다. 로드 프로세스 중에 로더는 기본 클래스가 있음을 확인하고 기본 클래스를 다시 로드합니다. 이 프로세스는 기본 클래스 개체 생성 여부에 관계없이 항상 발생합니다. 기본 클래스에 다른 기본 클래스가 있는 경우 두 번째 기본 클래스도 로드됩니다.
2. 루트 기본 클래스의 정적 초기화를 수행한 후 다음 파생 클래스의 정적 초기화 등을 수행합니다. 파생 클래스의 "정적 초기화"는 기본 클래스 멤버의 올바른 초기화에 따라 달라질 수 있으므로 이 순서는 매우 중요합니다.
3. 필요한 모든 클래스가 로드되면 하위 클래스 개체를 만듭니다.
4. 하위 클래스에 상위 클래스가 있으면 상위 클래스의 생성자가 호출됩니다. super를 사용하여 호출할 생성자를 지정할 수 있습니다.
기본 클래스의 생성 프로세스 및 생성 순서는 파생 클래스의 생성 프로세스 및 생성 순서와 동일합니다. 먼저 기본 클래스의 각 변수가 리터럴 순서로 초기화된 다음 기본 클래스의 나머지 생성자가 실행됩니다.
5. 선언된 순서대로 서브클래스 멤버 데이터를 초기화하고 나머지 서브클래스 생성자를 실행합니다.