2015-01-24 2 views
5

두 개의 중괄호로만 처리 된 정적은 무엇을 의미합니까? 초급 질문에 사과드립니다. 나는 그것에 대한 튜토리얼을 찾으려고했지만 하나를 찾을 수 없었다. 이렇게 정적 인 : static {}을 사용하면 나에게 명확하지 않습니다. 나는 그것이 다른 사람들에 의해 여기에 사용되는 것을 발견했다 developerWorks. 다중 행 또는 그룹, 수정 자일 수 있다고 생각하고 아래 코드를 시도했지만 다른 유형 수정자는 정적이 아닌 오류를 발생시킵니다.두 개의 중괄호로만 이루어진 정적은 무엇을 의미합니까?

public class MyClass { 
private volatile int v1=0; 
private final int v2=0; 
private static int v3=0; 
static {    <----- No error here. 
    int i1=0; 
    String s1="abc"; 
    double d1=0; 
}; 
final {    <----- Error here. 
    int i2=0; 
    String s2="abc"; 
    double d2=0; 
}; 
volatile {   <----- Error here. 
    int i3=0; 
    String s3="abc"; 
    double d3=0; 
}; 
} 
+0

static initialiser 블록과 함께 정적 키워드없이 {} 만 사용하여 인스턴스 변수를 초기화 할 수도 있습니다. – JamesB

+0

당신이 그것을 사용하는 경우에는 말이되지 않습니다. 정적 이니셜 라이저 블록은 일반적으로 정적 멤버를 초기화하는 데 사용됩니다 (예 :'static int i; static {Obj obj = someObject(); i = obj.generateIValue(); }', 또는 다른 정적 초기화를 수행하십시오. – eis

+0

비슷한 질문 링크를 제공해 줄 수 있습니까? @ 알렉시스 킹. – Student

답변

5

정적 초기화 프로그램 블록으로 클래스의 정적 멤버를 초기화하는 데 사용됩니다. 클래스가 초기화 될 때 실행됩니다.

귀하의 예 : 그것은 그 블록의 실행이 완료 될 때까지 유일한 범위에있는 변수를 선언 이후

static {    
    int i1=0; 
    String s1="abc"; 
    double d1=0; 
}; 

는 이해되지 않는다.

더 의미있는 정적 초기화 블록은 다음과 같습니다 당신이 그들을 선언 할 때 당신은 단순히 그 정적 변수를 초기화 할 수 있기 때문에

static int i1; 
static String s1; 
static double d1; 

static {    
    i1=0; 
    s1="abc"; 
    d1=0; 
}; 

이 예는 여전히 정적 초기화를 사용하여 정당화하지 않습니다. 정적 이니셜 라이저 블록은 정적 변수의 초기화가 더 복잡한 경우에 적합합니다.

+0

하지만! 비슷한 방식으로 휘발성을 사용할 수없는 이유는 무엇입니까? – Student

+0

@javaStudent 당신은 휘발성이 무엇을 압니까? – wvdz

+0

그것은 의미가 없기 때문에. 'static {}'은 정적으로 선언 된 내부 코드를 의미하지는 않지만 클래스가로드 될 때 코드는 실행됩니다. 'volatile {}'은 아무 의미가 없습니다. – m0skit0

관련 문제