Java에 대한 시험을 위해 공부하고 있습니다. 내가 공부하는 동안, 나는 익숙하지 않은 java에서 구문을 발견했다. 중괄호 ({})는 이름이없는 클래스 본문과 달리 정적 키워드가 있습니다. 나는 그들이 "Initializers"라고 불렀다. 아무도 내가 그들 사이의 주요 차이점을 지적하고 그들이 생성자와 어떻게 다른지 도울 수 있습니까? 감사합니다정적 이니셜 라이저 대 인스턴스 이니셜 라이저 대 생성자
답변
주요 차이점은 실행 순서입니다. 내가 예로 설명 할 것, 설명하기 :
public class SomeTest {
static int staticVariable;
int instanceVariable;
// Static initialization block:
static {
System.out.println("Static initialization.");
staticVariable = 5;
}
// Instance initialization block:
{
System.out.println("Instance initialization.");
instanceVariable = 10;
}
// Constructor
public SomeTest() {
System.out.println("Constructor executed.");
}
public static void main(String[] args) {
new SomeTest();
new SomeTest();
}
}
가 출력 될 것입니다 :
Static initalization.
Instance initialization.
Constructor executed.
Instance initialization.
Constructor executed.
간단히 얘기 :
- 정적 초기화 블록을 한 번 클래스에 의해로드 된 실행 JVM.
- 인스턴스 초기화 블록은 개체를 인스턴스화 할 때마다 생성자보다 먼저 실행됩니다.
- 생성자 (분명히)는 개체를 인스턴스화 할 때마다 실행됩니다.
에 대해 물었다. 이것은 좋은 대답입니다. 하지만 그 생성자가 인스턴스 이니셜 라이저보다 훨씬 더 일반적이라는 것을 덧붙이고 싶습니다. 인스턴스 이니셜 라이저의 주요 유스 케이스는 익명의 내부 클래스에서 초기화를 수행하는 것입니다. 이름이 없기 때문에 생성자를 가질 수 없습니다. –
매우 간단하고 멋진 예제 +1 –
생성자는 클래스의 새 인스턴스가 만들어 질 때 한 번 호출됩니다. 생성자에서 초기화 된 값은 인스턴스의 범위에 속합니다. 각 인스턴스는 생성자에서 초기화 된 동일한 필드에 대해 다른 값을 가질 수 있습니다.
정적 초기화는 정적 클래스에서 설치 코드를 실행하고 열거 형에서 데이터 구조를 채우는 데 유용합니다. 클래스가 JVM으로로드되고 클래스 또는 열거 형의 범위 내에 데이터가 존재할 때 위에서부터 차례로 한 번 호출됩니다. 클래스에 대한 모든 참조는 정적 초기화 프로그램에서 초기화 된 필드에 대해 동일한 값을 반환합니다.
중괄호 중괄호는 범위 참조 이름을 가진 익명 코드 블록입니다. 블록 내부에 참조를 작성하면 블록 외부에서 해당 참조의 값을 가져올 수 없습니다. 자신이 필요하다고 생각하면 코드를 더 많은 메소드로 리팩터링하는 데 필요한 신호입니다.
"명명되지 않은 중괄호"는 [인스턴스 이니셜 라이저]라고합니다 (http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.6).) –
이것은 실제로 교과서에서 답을 얻기 위해 필요한 것입니다. 그러나 나는 당신에게 약간의 포인터를 줄 수있다. Java를 프로그래밍 한 지 몇 년이 지났기 때문에 제가 준 정보는 일반적인 것입니다.
일반적으로 중괄호가있는 이름이없는 블록은 익명의 기능입니다. 정적 이니셜 라이저는 해당 클래스의 모든 인스턴스에 대해 전역 인 데이터를 초기화하며 클래스가 처음 참조 될 때 한 번 실행됩니다. 정적 속성이나 메서드를 사용하는 방법에주의해야합니다. 이 정보를 사용하여 텍스트 책에서 정확한 세부 정보를 찾을 수 있습니다.
나는이 책을 추천한다 http://www.apress.com/9781430247647 3 장과 4 장 – Leo
@Reieus 그는 또한 익명의 코드 블록 – jeremyjjbrown