Блок — это последовательность операторов, объявлений локальных классов или локальных переменных, заключенных в скобки. Область видимости локальных переменных и классов ограничена блоком, в котором они определены.
Операторы в блоке выполняются слева направо, сверху вниз. Если все операторы (выражения) в блоке выполняются нормально, то и весь блок выполняется нормально. Если какой-либо оператор выражения завершается ненормально, то и весь блок завершается ненормально.
Нельзя объявлять несколько локальных переменных с одинаковыми именами в пределах видимости блока. Приведенный ниже код вызовет ошибку времени компиляции.
public class Test {
public TestO {
}
public static void main(String[] args) {
Testt- new TestO;
int x;
lbl:{
intx- 0;
System.out,println("x = " + x);
} } }
В то же время не следует забывать, что локальные переменные перекрывают видимость переменных-членов. Так, следующий пример отработает нормально.
public class Test { static intx = 5; public TestO {} public static void main(String[] args) {
Testt= new TestO;
nt X = 1;
System.out.println("x - " + x);
} }
Ha консоль будет выведено x = 1.
To же самое правило применимо к параметрам методов.
public class Test { static int x; public TestO {
}
public static void main{Sthng[] args) {
Testt = new TestO;
t.test(5);
System,out.println("Mennber value x = " + x);
}
private void test(int x){ this.x = x + 5;
System.out. printlnC'Local value x = " + x); } }
В результате работы этого примера на консоль будет выведено:
Local value х = 5 Member value х= 10
На следующем примере продемонстрируем, что область видимости локальной переменной ограничена областью видимости блока, или оператора, в пределах которого данная переменная объявлена.
public class Test { static int X = 5; public Test() { }
public static void main(String[] args) { Testt = newTestO;
{
int X = 1;
System.out.printlnC'First block x = " + x); } {
intx = 2;
System.out.printlnC'Second blockx =" + x); }
System.out.print("For cycle x = "); for(int X =0;x<5;x++) {
System.out.print("" + x); } } }
Данный пример откомпилируется без ошибок и на консоль будет выведен следующий результат:
First block X = 1 Second block x =2 For cycle X = 0 1 2 3 4
Следует помнить, что определение локальной переменной есть исполняемый оператор. Если задана инициализация переменой, то выражение полоняется слева направо и его результат присваивается локальной переменной. Использование неинициализированных локальных переменных прешено и вызывает ошибку компиляции.
Следующий пример кода
public class Test { static int X = 5; public TestO {
вызовет ошибку времени компиляции, т.к. возможны условия, при которых переменная х может быть не инициализирована до ее использования (несмотря на то, что в данном случае операторif(y > 3) и следующее за ним выражение х = 1; будут выполняться всегда).