Java에서 정적 및 인스턴스 블록의 초기화 순서
Java에서 여러 클래스를 작업할 때 정적 및 인스턴스의 실행 순서 이해 초기화 블록이 중요해집니다. 클래스 내에서 이러한 블록은 나타나는 순서대로 실행되는 것으로 알려져 있지만 클래스 전반에 걸쳐 해당 동작에 대해서는 여전히 불확실성이 남아 있습니다.
이 동작을 시연하려면 다음 코드를 고려하세요.
package pkg; public class LoadTest { public static void main(String[] args) { System.out.println("START"); new Child(); System.out.println("END"); } } class Parent extends Grandparent { // Instance init block { System.out.println("instance - parent"); } // Constructor public Parent() { System.out.println("constructor - parent"); } // Static init block static { System.out.println("static - parent"); } } class Grandparent { // Static init block static { System.out.println("static - grandparent"); } // Instance init block { System.out.println("instance - grandparent"); } // Constructor public Grandparent() { System.out.println("constructor - grandparent"); } } class Child extends Parent { // Constructor public Child() { System.out.println("constructor - child"); } // Static init block static { System.out.println("static - child"); } // Instance init block { System.out.println("instance - child"); } }
예상대로 이 코드의 출력은 정적 블록이 인스턴스 블록보다 먼저 실행된다는 가정과 일치합니다.
START static - grandparent static - parent static - child instance - grandparent constructor - grandparent instance - parent constructor - parent instance - child constructor - child END
그러나 이 관찰만으로는 부모 클래스와 자식 클래스 간의 초기화 순서를 명확히 하지 않습니다. 이 측면을 더 자세히 살펴보려면 다음과 같은 사용되지 않은 클래스를 코드에 추가하는 것을 고려해 보십시오.
class IAmAClassThatIsNeverUsed { // Constructor public IAmAClassThatIsNeverUsed() { System.out.println("constructor - IAACTINU"); } // Instance init block { System.out.println("instance - IAACTINU"); } // Static init block static { System.out.println("static - IAACTINU"); } }
놀랍게도 수정된 코드는 여전히 원본 코드와 동일한 출력을 생성합니다. 이는 정적 및 인스턴스 초기화 블록이 다음 순서로 실행됨을 의미합니다.
이 동작은 섹션 12.4 및 12.5에서 자세한 설명을 제공하는 JLS(Java 언어 사양)에 부합합니다.
위 내용은 Java 상속에서 정적 및 인스턴스 블록의 초기화 순서는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!