2017-05-20 1 views
0

다음 코드는 성공적으로 컴파일됩니다. 나의 이해에 따라 변수는 바로 여기정적 초기화 프로그램 이후에 정적 변수 선언

class A { 
static { 
    y=20; 
    z=10; 
} 
static int z; 
static int y=30; 
{ 
    w=10; 
} 
int w; 
public static void main(String args[]){ 
    System.out.println(y); 
} 
} 

일어나고있는 주석을 읽은 후 질문을 수정 무엇 후 사용하기 전에 선언해야합니다. 여기서 출력은 30입니다. 변수 선언이 먼저 발생하면 모든 초기화 문이 모양 순서대로 실행됩니다.

+1

* "내 이해에 따라 변수를 사용하기 전에 변수를 선언해야합니다"* 왜 블록 및 변수의 배치가 중요하다고 생각합니까? – Tom

+2

* 로컬 * 변수는 처음 사용하기 전에 선언해야합니다. 필드가 아니라 너무 ... –

+1

두 링크는 ​​속는 사람으로 작동하지 않지만 필드의 위치가 다를 수 있다고 (암시 적으로) 말합니다 : [인스턴스 변수 선언의 위치] (// stackoverflow.com/q/218573) // [Java best practice - 클래스 변수보다 먼저 생성자를 선언하고 있습니까?] (// stackoverflow.com/q/10264447) – Tom

답변

1

변수가 그들에게

를 사용하기 전에 선언 할 필요가별로 중요하지 않습니다

이것은 부분적으로 만 부분적으로 만 사용됩니다. 방법을 사용하는 경우 다음을 수행하십시오.

System.out.println(i); 
int i = 0; 

분명히 컴파일되지 않습니다.

그러나 클래스 수준에서 변수를 선언 할 때이 규칙은 적용되지 않습니다. 코드에서 w의 선언은 사용 된 후 몇 줄에 작성 되었기 때문에 (w = 10;), 줄 뒤에 int w; 줄이 실행된다는 의미는 아닙니다.

이렇게 생각해보십시오. 컴파일러는 모든 정적 필드의 선언 (클래스 수준 변수)을 먼저 확인한 다음 모든 비 정적 필드를보고 클래스의 코드 블록 (생성자, 메서드 등)을 보게됩니다. 당신의 코드에서 :

class A { 
    static { 
     z=10; 
    } 
    static int z; 
    { 
     w=10; 
    } 
    int w; 
} 

컴파일러는 먼저 z, w 본다. 그런 다음 코드의 다른 부분에서 처음으로 A에 액세스한다고 가정 해 보겠습니다. 이제 정적 블록이 실행됩니다 (z=10;). 다시 A의 새 인스턴스를 만들고 있다고 가정 해 보겠습니다. 이제 w=10;이 실행됩니다.

+0

은 완전성을 위해 질문을 수정했습니다. – wib

+1

@wib 정적 블록 뒤에 'int y = 30;'과 같은 명령문이 실행되기 때문에 발생하는 동작이 있습니다. 따라서 컴파일러는 먼저 선언을보고 정적 블록을 실행 한 다음 'y = 30'부분을 실행합니다. – Sweeper

1

변수는 클래스를로드 할 때 클래스 로더에 의해 선언됩니다.

정적 블록은 그 시간에 멤버 변수를 선언 할 수 있도록 클래스에 액세스 할 때 처음으로 평가됩니다, 그래서 순서는

+0

이 질문을 수정했습니다. 하나의 문장에서 변수가 선언되고 초기화되면 어떻게됩니까? – wib