슈퍼 클래스 클래스 초기화 이전에 서브 클래스 최종 정적 초기화?

OfirD

이 특정 사례를 언급하는 특정 SO 게시물을 찾을 수 없으므로 예 / 아니오 질문이라고 생각하는 것이 무엇인지 묻고 싶습니다.

다음은 JLS §12.4.2 (Java SE 8), 목록 6-7입니다.

  1. [...] 그런 다음 상수 변수 인 C의 static 필드를 초기화합니다 (§4.12.4, §8.3.2, §9.3.1).
  2. 다음으로, C가 인터페이스가 아닌 클래스이고 해당 수퍼 클래스가 아직 초기화되지 않은 경우 SC를 수퍼 클래스로 설정합니다 [...] 목록의 각 S에 대해 [SC, SI1, ..., SIn], S에 대해이 전체 절차를 반복적으로 수행합니다. 필요한 경우 S를 먼저 확인하고 준비합니다. [...]

내 질문 : 하위 클래스의 최종 정적 변수가 수퍼 클래스의 정적 초기화 전에 초기화된다는 의미입니까 (최종 정적이 선언의 일부로 초기화된다고 가정)?

vsminkov

대답은 그럴 수도 있다는 것입니다. 핵심 부분은 상수 단어 의미입니다.

이 코드를 고려하십시오

class Foo {
    public static final int FOO_VALUE = 1000;

    static {
        System.err.println("FOO Bar.BAR_VALUE=" + Bar.BAR_VALUE);
    }
}

class Bar extends Foo {
    public static final int BAR_VALUE = 2000;

    static {
        System.err.println("BAR Foo.FOO_VALUE=" + Foo.FOO_VALUE);
    }
}

이 프로그램의 출력은 다음과 같습니다.

FOO Bar.BAR_VALUE=2000
BAR Foo.FOO_VALUE=1000

이 경우 Bar정적 최종 변수는 Foo정적 초기화 전에 초기화됩니다. 둘 다 FOO_VALUE하고 BAR_VALUE있습니다 상수를 때문에 javac이 필드를 인라인 할 수 있습니다.

그러나 이런 식으로 최종 변수가 상수가 아닌 척하여 컴파일러를 속일 수 있습니다.

class Foo {
    public static final int FOO_VALUE = Integer.valueOf(1000).intValue();

    static {
        System.err.println("FOO " + Bar.BAR_VALUE);
    }
}

class Bar extends Foo {
    public static final int BAR_VALUE =  Integer.valueOf(2000).intValue();

    static {
        System.err.println("BAR " + Foo.FOO_VALUE);
    }
}

그리고 출력은

FOO Bar.BAR_VALUE=0
BAR Foo.FOO_VALUE=1000

따라서 Foostatic final Bar.BAR_VALUE이 초기화 되기 전에 static initializer가 완료 됩니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

서브 클래스에서 정적 멤버 클래스를 파라미터 화 슈퍼 클래스

분류에서Dev

서브 클래스 초기화시 슈퍼 클래스 변수에 대한 접근성

분류에서Dev

수퍼 클래스에서 서브 클래스의 클래스 인스턴스 변수 초기화

분류에서Dev

파이썬 슈퍼 클래스 초기화 인수

분류에서Dev

클래스 수준에서 정적 NSString 초기화

분류에서Dev

클래스 내에서 QHash 초기화

분류에서Dev

Java에서 클래스 초기화

분류에서Dev

클래스에서 벡터 초기화

분류에서Dev

Python에서 클래스 초기화

분류에서Dev

클래스에서 벡터 초기화

분류에서Dev

다른 클래스에서 개조 클래스 초기화

분류에서Dev

클래스 정의에서 데이터 멤버 초기화

분류에서Dev

정적 클래스 함수에서 정적 클래스 개체를 초기화하는 방법

분류에서Dev

C ++-파생 클래스에서 정적으로 기본 클래스 보호 멤버 변수 초기화

분류에서Dev

서브 클래스 초기화 패턴

분류에서Dev

C ++ 클래스에서 사용자 정의 배열 초기화?

분류에서Dev

클래스 정적 유형 초기화

분류에서Dev

정적 클래스 멤버 초기화

분류에서Dev

Matlab의 슈퍼 클래스에서 객체 클래스 가져 오기

분류에서Dev

Java에서 생성자의 기본값으로 하위 클래스를 재정의하는 슈퍼 클래스

분류에서Dev

C ++ 클래스에서 서로 동일한 정적 값 초기화

분류에서Dev

템플릿 클래스 내에서 정적 멤버의 지연 초기화

분류에서Dev

개인 생성자가있는 클래스에서 정적 변수 초기화

분류에서Dev

클래스 범위에서 정적 개체 선언 및 초기화

분류에서Dev

구조체 내에서 정적 constexpr 변수 및 클래스 초기화

분류에서Dev

cdn 종속성이로드되기 전에 JS 클래스 정적 멤버 초기화가 발생합니다.

분류에서Dev

특정 서브 클래스를 슈퍼 클래스의 일부 기능을 제공 할 수있는 구체적인 방법이 있습니까?

분류에서Dev

자바는 모든 서브 클래스 멤버를 설정하는 기본 슈퍼 클래스를 구현

분류에서Dev

슈퍼 클래스에서 호출 객체 가져 오기

Related 관련 기사

  1. 1

    서브 클래스에서 정적 멤버 클래스를 파라미터 화 슈퍼 클래스

  2. 2

    서브 클래스 초기화시 슈퍼 클래스 변수에 대한 접근성

  3. 3

    수퍼 클래스에서 서브 클래스의 클래스 인스턴스 변수 초기화

  4. 4

    파이썬 슈퍼 클래스 초기화 인수

  5. 5

    클래스 수준에서 정적 NSString 초기화

  6. 6

    클래스 내에서 QHash 초기화

  7. 7

    Java에서 클래스 초기화

  8. 8

    클래스에서 벡터 초기화

  9. 9

    Python에서 클래스 초기화

  10. 10

    클래스에서 벡터 초기화

  11. 11

    다른 클래스에서 개조 클래스 초기화

  12. 12

    클래스 정의에서 데이터 멤버 초기화

  13. 13

    정적 클래스 함수에서 정적 클래스 개체를 초기화하는 방법

  14. 14

    C ++-파생 클래스에서 정적으로 기본 클래스 보호 멤버 변수 초기화

  15. 15

    서브 클래스 초기화 패턴

  16. 16

    C ++ 클래스에서 사용자 정의 배열 초기화?

  17. 17

    클래스 정적 유형 초기화

  18. 18

    정적 클래스 멤버 초기화

  19. 19

    Matlab의 슈퍼 클래스에서 객체 클래스 가져 오기

  20. 20

    Java에서 생성자의 기본값으로 하위 클래스를 재정의하는 슈퍼 클래스

  21. 21

    C ++ 클래스에서 서로 동일한 정적 값 초기화

  22. 22

    템플릿 클래스 내에서 정적 멤버의 지연 초기화

  23. 23

    개인 생성자가있는 클래스에서 정적 변수 초기화

  24. 24

    클래스 범위에서 정적 개체 선언 및 초기화

  25. 25

    구조체 내에서 정적 constexpr 변수 및 클래스 초기화

  26. 26

    cdn 종속성이로드되기 전에 JS 클래스 정적 멤버 초기화가 발생합니다.

  27. 27

    특정 서브 클래스를 슈퍼 클래스의 일부 기능을 제공 할 수있는 구체적인 방법이 있습니까?

  28. 28

    자바는 모든 서브 클래스 멤버를 설정하는 기본 슈퍼 클래스를 구현

  29. 29

    슈퍼 클래스에서 호출 객체 가져 오기

뜨겁다태그

보관