클래스 초기화 문제

3848 단어 Blog
정적 변수, 정적 초기화 블록, 변수, 초기화 블록, 구조기의 초기화 순서는 (정적 변수, 정적 초기화 블록) > (변수, 초기화 블록) > 구조기이다.
또한 다음 테스트 코드를 사용하여 이 점을 확인할 수 있습니다.
Java 코드

public class InitialOrderTest {   
  
    //        
    public static String staticField = "    ";   
    //      
    public String field = "  ";   
  
    //          
    static {   
        System.out.println(staticField);   
        System.out.println("      ");   
    }   
  
    //        
    {   
        System.out.println(field);   
        System.out.println("    ");   
    }   
  
    //       
    public InitialOrderTest() {   
        System.out.println("   ");   
    }   
  
    public static void main(String[] args) {   
        new InitialOrderTest();   
    }   
}  

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
정적 변수
정적 초기화 블록
변량
블록 초기화
구조기
이것은 윗글에서 말한 것과 완전히 일치한다.그렇다면 상속에 대해서는 어떻게 될까?우리는 여전히 테스트 코드로 최종 결과를 얻는다.
Java 코드

class Parent {
	//     
	public static String p_StaticField = "  --    ";
	//   
	public String p_Field = "  --  ";

	//       
	static {
		System.out.println(p_StaticField);
		System.out.println("  --      ");
	}

	//     
	{
		System.out.println(p_Field);
		System.out.println("  --    ");
	}

	//    
	public Parent() {
		System.out.println("  --   ");
	}
}

public class SubClass extends Parent {
	//     
	public static String s_StaticField = "  --    ";
	//   
	public String s_Field = "  --  ";
	//       
	static {
		System.out.println(s_StaticField);
		System.out.println("  --      ");
	}
	//     
	{
		System.out.println(s_Field);
		System.out.println("  --    ");
	}

	//    
	public SubClass() {
		System.out.println("  --   ");
	}

	//     
	public static void main(String[] args) {
		new SubClass();
	}
}

위의 코드를 실행하면 결과가 바로 우리의 눈앞에 나타난다.
상위 - 정적 변수
상위 - 정적 초기화 블록
하위 클래스 - 정적 변수
하위 클래스 - 정적 초기화 블록
상위 - 변수
상위 - 블록 초기화
상위 - 구조자
하위 클래스 - 변수
하위 클래스 -- 블록 초기화
하위 클래스 - 구조자
지금은 결과가 이미 자명해졌다.모두가 주의할 수 있는 것은 부류가 완전히 초기화된 후에야 부류의 초기화를 하는 것이 아니라 실제로 부류의 정적 변수와 정적 초기화 블록의 초기화는 부류의 변수, 초기화 블록과 구조기가 초기화되기 전에 완성된 것이다.
그러면 정적 변수와 정적 초기화 블록 사이, 변수와 초기화 블록 사이의 선후 순서는 어떻습니까?정적 변수는 항상 정적 초기화 블록보다 먼저 초기화되고, 변수는 항상 초기화 블록보다 먼저 초기화됩니까?실제로 이것은 그것들이 종류에 나타난 선후 순서에 달려 있다.우리는 정적 변수와 정적 초기화 블록을 예로 들어 설명한다.
마찬가지로 우리는 하나의 종류를 써서 테스트를 진행한다.
Java 코드

public class TestOrder {
	//     
	public static TestA a = new TestA();
	
	//       
	static {
		System.out.println("      ");
	}
	
	//     
	public static TestB b = new TestB();

	public static void main(String[] args) {
		new TestOrder();
	}
}

class TestA {
	public TestA() {
		System.out.println("Test--A");
	}
}

class TestB {
	public TestB() {
		System.out.println("Test--B");
	}
}

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.
Test--A
정적 초기화 블록
Test--B
여러분은 변수 a, 변수 b와 정적 초기화 블록의 앞뒤 위치를 마음대로 바꾸면 출력 결과가 클래스에 나타난 앞뒤 순서에 따라 바뀌는 것을 발견할 수 있습니다. 이것은 정적 변수와 정적 초기화 블록은 그들이 클래스에 정의한 순서에 따라 초기화되었다는 것을 설명합니다.마찬가지로 변수와 초기화 블록도 이 규칙을 따른다.
상속 상황에서 클래스의 초기화 순서를 파악한 후 최종 출력 결과를 어떻게 판단하는가가 쉽게 풀렸다.
사실 내부 클래스와 관련된 초기화 문제도 증가시킬 수 있다.

좋은 웹페이지 즐겨찾기