2010-10-05 4 views
3

Я знаю, что в C++ переменных блока область применения, например, следующий код работает в C++Какова область действия переменной java в блоке?

void foo(){ 
    int a = 0; 
    for(int i = 0; i < 10; ++i){ 
     int a = 1; //re-define a here. 
    } 

}

, но этот фрагмент не работает в Java, он сообщает «дублирует локальные переменные а», делает это означает, что переменные java не имеют области BLOCK?

+1

Что вы подразумеваете под "не работает"? Ошибка компилятора или предупреждение, или ...? Пожалуйста, постарайтесь уточнить свои описания. –

+0

. Хорошее расширенное обсуждение об этом можно найти здесь: http://stackoverflow.com/questions/141140/why-does-java-not-have-block-scoped-variable-declarations –

ответ

3

ява переменные имеют блочную сферу, но если вы заметили Int А уже определен в рамках

 { 
    int a = 0; 
     { 
     { 
     } 
     } 




    }

все subscopes в сферу самых верхних фигурных скобок. Следовательно, вы получаете повторяющуюся переменную ошибку.

8

У них есть область охвата. Это означает, что вы не можете использовать их вне блока. Однако Java запрещает скрывать имя во внешнем блоке по имени во внутреннем.

1

Он делает, но он вложен, поэтому «a», который вы определили в foo(), доступен во всех блоках внутри foo.

Вот пример того, что вы ищете:

void foo(){ 
    { 
     int a = 0; 
     // Do something with a 
    } 
    for(int i = 0; i < 10; ++i){ 
     int a = 1; //define a here. 
    } 
} 
2

Предыдущие ответы уже говорилось причину, но я просто хочу, чтобы показать, что это все еще разрешено:

void foo(){ 
    for(int i = 0; i < 10; ++i){ 
     int a = 1; 
    } 
    int a = 0; 
} 

В этом случае a внутри цикла не скрывает внешний a, поэтому он действителен.

Также IMHO тоже должно быть на C++, оно менее запутывает и предотвращает случайное объявление переменной с тем же именем.

4

Section §14.4.2 говорит:

Объем локальной переменной декларации в блоке (§14.2) является остальной частью блока, в котором появляется декларации, начиная с его собственного инициализатором (§ 14.4) и включая любые последующие деклараторы справа в объявлении локальной переменной .

Имя локальной переменной V может не быть повторно объявлен в качестве локальной переменной метод непосредственно вмещающих, блок конструктора или инициализатора в пределах объема V, или ошибки в время компиляции имеет место.

Смежные вопросы