자바 류 의 초기 화 실행 순서 (계승, static 변수 및 코드 블록, 일반 구성원 변수, 구조 방법 포함)

바 쁘 지 않 을 때 자바 기반 을 보고 순 서 를 초기 화 했 습 니 다. 여 기 는 예전 에는 잘 모 르 겠 지만 지금 은 많이 알 고 있 습 니 다. 당신 도 나 와 같다 면 이 코드 를 통 해 도움 이 될 것 이 라 고 믿 습 니 다.
public class TestCodeExecOrder extends TestCodeExecOrderHost {
	
	static {System.out.println("TestCodeExecOrder static   ");}//(3)     
	
	//(1) (2)          ,        ,      
	private int x = print("TestCodeExecOrderHost xx  ");//(2)      
	{System.out.println(xx2+"TestCodeExecOrderHost       ");}//(1)     
	//private int x = print("TestCodeExecOrderHost xx  ");//(2)      
	
	//(3) (4)          ,        ,      
	private static int xx2 = print("static TestCodeExecOrder.xx2 init");//(4)static    
	
	public TestCodeExecOrder(){
		System.out.println("TestCodeExecOrder  j="+j);
		System.out.println("TestCodeExecOrder  x="+x);
	}
	public static void main(String[] args) {
		System.out.println("TestCodeExecOrder main");
		TestCodeExecOrder t = new TestCodeExecOrder();
	}
}
class TestCodeExecOrderHost{
	private int i = 9;
	public int j;
	
	private static int xx = print("static TestCodeExecOrderHost.xx init");
	{System.out.println(xx+"TestCodeExecOrderHost      ");}
	static {System.out.println("TestCodeExecOrderHost static   ");}
	public TestCodeExecOrderHost(){
		System.out.println("TestCodeExecOrderHost  i="+i+" j="+j);
		j = 10;
	}
	
	public static int print(String s){
		System.out.println(s);
		return 20;
	}
}

 
 
//output  
static TestCodeExecOrderHost.xx init
TestCodeExecOrderHost static   
TestCodeExecOrder static   
static TestCodeExecOrder.xx2 init
TestCodeExecOrder main
20TestCodeExecOrderHost      
TestCodeExecOrderHost  i=9 j=0
TestCodeExecOrderHost xx  
20TestCodeExecOrderHost       
TestCodeExecOrder  j=10
TestCodeExecOrder  x=20

 
 
요약:
주선: 부류 가 있 으 면 부류 부분 을 먼저 가 고 부류 부분 을 먼저 가 십시오.
세분 화:
(0) 다른 모든 일이 발생 하기 전에 대상 에 게 분 배 된 저장 공간 을 바 이 너 리 0 으로 초기 화 합 니 다 (먼저 부모 클래스 의 구성원 변 수 는 기본 값 이 고 하위 클래스 의 구성원 변 수 는 기본 값 입 니 다)
(1) 프로그램 이 실 행 될 때 첫 번 째 일 은 TestCodeExecOrder. main 방법 (static) 에 접근 하려 는 것 입 니 다. 이것 은 TestCodeExecOrder 를 불 러 오 는 컴 파일 코드 입 니 다. 그 를 불 러 오 는 과정 에서 부모 클래스 TestCodeExecOrder Host 가 있 는 것 을 발견 하면 부모 클래스 를 불 러 옵 니 다.
(2) 이 어 부모 클래스 의 static 초기 화 는 즉시 진 행 됩 니 다. 그 다음 에 하위 클래스 의 static 초기 화 (이곳 의 static 은 static 변수 와 static 코드 블록 을 포함 합 니 다. 앞 에 있 는 사람 이 먼저 실행 합 니 다). 이 때 필요 한 클래스 로드 가 끝나 면 대상 을 만 들 수 있 습 니 다.
(3) 이때 대상 의 일반 구성원 변 수 를 초기 화 (할당 할 가치 가 있 고 값 이 없 는 기본 값) (일반 구성원 변 수 는 일반 구성원 변수 와 동적 코드 블록 을 포함 하고 누가 앞 에 있 으 면 먼저 실행) 한 다음 에 부모 류 의 구조 방법 이 실 행 된 다음 에 하위 클래스 의 구조 방법 이다.
본인 이 책 을 읽 은 후의 이해, 잘못된 부분 이 있 으 면 여러분 의 지적 을 환영 합 니 다. 이러한 기본 적 인 집행 순 서 는 실제 프로젝트 의 bug 를 분석 하 는 데 매우 유용 합 니 다.

좋은 웹페이지 즐겨찾기