> Java > java지도 시간 > Java 상속에서 정적 및 인스턴스 블록의 초기화 순서는 무엇입니까?

Java 상속에서 정적 및 인스턴스 블록의 초기화 순서는 무엇입니까?

Patricia Arquette
풀어 주다: 2024-11-27 07:00:14
원래의
214명이 탐색했습니다.

What's the Initialization Order of Static and Instance Blocks in Java Inheritance?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿