이것은 http://www.programcreek.com/2011/10/java-class-instance-initializers/ 에서 직접 가져온 것입니다 .
1. 실행 순서
다음 수업을 살펴보십시오. 먼저 어느 수업이 먼저 실행되는지 알고 있습니까?
public class Foo {
//instance variable initializer
String s = "abc";
//constructor
public Foo() {
System.out.println("constructor called");
}
//static initializer
static {
System.out.println("static initializer called");
}
//instance initializer
{
System.out.println("instance initializer called");
}
public static void main(String[] args) {
new Foo();
new Foo();
}
}
산출:
정적 이니셜 라이저 호출
인스턴스 이니셜 라이저 호출
생성자 호출
인스턴스 이니셜 라이저 호출
생성자 호출
2. Java 인스턴스 이니셜 라이저는 어떻게 작동합니까?
위의 인스턴스 이니셜 라이저에는 println 문이 포함되어 있습니다. 작동 방식을 이해하기 위해 변수 할당 문으로 취급 할 수 있습니다 (예 :) b = 0
. 이것은 이해하기 더 명확하게 만들 수 있습니다.
대신에
int b = 0
, 당신은 쓸 수 있습니다
int b;
b = 0;
따라서 인스턴스 이니셜 라이저와 인스턴스 변수 이니셜 라이저는 거의 동일합니다.
3. 인스턴스 이니셜 라이저는 언제 유용합니까?
인스턴스 이니셜 라이저를 사용하는 경우는 드물지만 다음과 같은 경우 인스턴스 변수 이니셜 라이저를 대체 할 수 있습니다.
- 이니셜 라이저 코드는 예외를 처리해야합니다
- 인스턴스 변수 이니셜 라이저로 표현할 수없는 계산을 수행하십시오.
물론 이러한 코드는 생성자에서 작성할 수 있습니다. 그러나 클래스에 생성자가 여러 개인 경우 각 생성자에서 코드를 반복해야합니다.
인스턴스 이니셜 라이저를 사용하면 코드를 한 번만 작성할 수 있으며 객체를 생성하는 데 사용 된 생성자에 관계없이 실행됩니다. (이것은 단지 개념 일 뿐이며 자주 사용되지는 않습니다.)
인스턴스 이니셜 라이저가 유용한 또 다른 경우는 생성자를 전혀 선언 할 수없는 익명 내부 클래스입니다. (이것은 로깅 기능을 배치하기에 좋은 장소입니까?)
Derhein에게 감사합니다.
또한 인터페이스 [1]을 구현하는 익명 클래스에는 생성자가 없습니다. 따라서 생성시 모든 종류의 표현식을 실행하려면 인스턴스 이니셜 라이저가 필요합니다.
public static void staticMethod(){}
경우 실행TestStatic.class.getMethod("staticMethod");
합니다. 정적 이니셜 라이저가 호출되지 않습니다. 자세한 정보는 여기 docs.oracle.com/javase/specs/jvms/se10/html/…