2011-10-29 3 views
1
class Grade { 
public static int f = 2; 

public static void main(String[] args) { 
    for (int f = 0; f < 2; f++) { 
     System.out.println(f); 
    } 
} 
} 

"int f"가 정적 변수 f를 어떻게 오버라이드합니까? static int f가 전체 클래스에서 공유되고 컴파일러가이 변수가 재정의된다는 오류 메시지를 표시하지 않는 이유는 무엇입니까? 정적 f의 사본이되지 않는 이유는 무엇입니까? 나는 자바에서 스코프 블록이 부모 블록의 변수를 상속 받았다고 생각했다.Java의 변수 범위

답변

5

로컬 f의 "그림자"가 외부 범위 f이기 때문입니다. 이것은 로컬에서 정의한 후에 f을 참조 할 때마다 로컬 버전을 나타냄을 의미합니다. 변수 그림자에

위키 백과의 페이지는 자바에서 매우 비슷한 예를 사용

http://en.wikipedia.org/wiki/Variable_shadowing

편집 : Grade.f : 당신이 "외부"f을해야하는 경우가 더 적절한 이름으로 액세스 할 수 있습니다. 정적 변수없이 비슷한 예 : 변수가 정적

public class Grade { 
    public int f=0; 
    public void setF(int f) { 
    this.f = f; // setF(5) will set the “outer” f to 5. 
    } 
} 
+0

감사합니다. 거기에 읽을만한 것이 있습니까? –

+0

그 위키 피 디아 페이지는 꽤 분명해야합니다. 따라서 그림자가 어떻게 작용하는지 (그리고 어디에서) 알 수있는 것 외에는 다른 점이 많지 않습니다. – Mysticial

+0

@ArtemMoskalev Java 언어 관련 공식 소스는 Java Language Specification (일명 JLS)입니다. 귀하의 질문은 §6.3.1을 참조하십시오. http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.3.1 –

0

하더라도, 범위 지정 컴파일러를 알려줍니다 그 내부 변수보다는 더 일반적인 하나 라인이

System.out.println(f); 

작품. 그것은 피할 수있는 것입니다. 이름을 혼동시키는 방식으로 변수 이름을 지정하십시오.

+0

나는 그렇게 생각한다. 그것은 SCJP의 질문에 불과했다 ... 나는 혼란 스러웠다. . –