2011-08-31 7 views
5

중괄호가 Java에서 별도의 로컬 범위를 정의하지 않는 이유는 무엇입니까? 나는 이것이 주요 중괄호 언어 (C, C++, Java, C#)에 공통적 인 기능이라고 기대했다.Java의 로컬 범위

class LocalScopeTester 
{ 
    public static void main(String... args) 
    { 
     Dog mine = new Dog("fido"); 
     if (mine.getName().equals("ace")) 
     { 
      Dog mine = new Dog("spot"); // error: duplicate local 
     } 
     else 
     { 
      Dog mine = new Dog("barkley"); // error: duplicate local 
      { 
       Dog mine = new Dog("boy"); // error: duplicate local 
      } 
     } 
    } 
} 
+0

[가변 범위에 대한 질문에 자바 그림자]의 중복 가능성 (http://stackoverflow.com/questions/4623334/question-about-variable-scope-and-shadowing-in-java) – Thilo

답변

16

그들은 별도의 지역 범위를 정의 할,하지만 당신은 여전히 ​​부모 범위에서 지역 변수 마스크 수 없습니다 (하지만 당신은 물론 마스크 인스턴스 변수의 수 있습니다).

그러나 새 변수를 다른 이름으로 정의 할 수 있으며 범위는 중괄호로 제한됩니다.

3

중괄호는 변수의 범위를 지정하지만 중괄호 안의 모든 것도 중괄호 위로 볼 수 있습니다. 가지고있는 모든 경우에 mine은 이미 fido로 정의되어 있습니다.

좀더 간결하게 설명하십시오. 아이들은 부모에게도 적용됩니다.하지만 그 반대는 아닙니다.

3

그들은 별도의 로컬 범위를 정의합니다. 로컬 변수가 다른 변수를 숨기면 오류가 발생합니다.

블록 내부에 변수를 정의하고 블록 외부에서 액세스하여 실제로 블록으로 범위가 지정되었는지, 해당 블록 만 액세스하는지 확인하십시오.

13

로컬 변수 섀도 잉은 Java에서 의도적으로 금지되어 있습니다 (see this answer).
이것은 버그 감소에 도움이된다는 아이디어입니다.

+1

합리적인 근거가있는 짧은 대답은 선거권을받을 자격이 있습니다. – H2ONaCl

2

블록은 로컬 범위를 정의하지만 외부 로컬 범위의 다른 변수와 같은 이름의 변수를 다시 정의 할 수 없습니다. 만약 그렇다면, 숨겨진 변수에 접근 할 수있는 방법이 없을 것입니다.

+0

+1 "숨겨진 변수에 액세스 할 수 없습니다". 다른 종류의 쉐도 잉에서는 (this.foo와 같이) 주위를 둘러 볼 수 있습니다. – Thilo

2

로컬 범위를 정의합니다 ... 중괄호 안에 선언 된 변수는 중괄호의 범위를가집니다. 그러나 당신이하려는 것은 이미 존재하는 변수를 다시 선언하는 것입니다. 제 의견으로는,이 경우 자바가 틀린 것은 아니지만, C++은 당신이 그것을 할 수있게 해준 것입니다 (나는 여러분이 그것을 비교하고 있다고 가정합니다). 그럼에도 불구하고, 언어가 그것을 허용하더라도, 당신은 왜 그것을 할 것입니까? 잘못된 가독성과 버그의 원인.

-1

Java에서는 잊어 버렸지 만 모든 "블록 구조화 된"언어 (C++뿐만 아니라 Pascal, ADA, C 등)에서 권한이 부여되어 Java가 잘못되었다고 생각합니다. 때로는 둘러싼 블록의 변수를 숨기려고합니다.

+0

메서드 내에서 로컬 변수를 그림자 처리하면 버그가 발생합니다. – dolmen

0

실행하면 변수가 이미 int i=5으로 선언되어 있고 다시 정의 할 수 없다는 오류가 발생합니다. 따라서 부모는 자녀가 가진 것을 결코 가져 가지 않습니다. 부모님이 희생하고 그의 선언 인 int i=5을 삭제하면 어떨까요?

public class Ouch { 
    public static void main(String[] args) { 

     int i=5; 

     for(int i=0;i<5;i++); 
     for(int i=0;i<5;i++); 
    } 
} 

이제 학부모는 선언문을 희생하고 어린이들 모두 즐겁게 행동하며 코드가 성공적으로 실행됩니다.

public class Ouch { 
    public static void main(String[] args) { 

     //int i=5; 

     for(int i=0;i<5;i++); 
     for(int i=0;i<5;i++); 
    } 
}