Управляющие структуры
(продолжение).
Маленькое уточнение к предыдущему выпуску рассылки:
Дело в том, что числовые константы определяемые в Java, имеют
тип. Так, целые числа (101) имеют тип int, целые числа, имеющие тип long
оканчиваются большой буквой L (1000001L), тип float-буквой f (0.1f),
тип double-буквой d (0.00001d). Т.о. надо писать "long l=10001L;" вместо
"long l=10001;" однако, как я уже упоминал выше, в Java есть неявное
преобразование типов, которое как раз используется компилятором в этом
случае. Необходимость использовать "L" возникает лишь в случае, когда
вы вручную хотите задать константу, невмещающуюся в int.
Стандарт, определяющий вещественные константы и действия над ними
называется IEEE 754.
Итак, теперь мы знаем, что программы на Java-это описания классов.
Классы определяют данные и методы. С данными как будто-бы разобрались.
Как же можно в классе описать тело метода? Чисто интуитивно, тело
метода можно понимать как набор управляющих директив Java-машине
(поток управления), перемешанный с объявлениями переменных метода.
Метод определяет зону видимости.
Что такое зона видимости? Зона видимости-это набор идентификаторов
(собственная часть и внешняя, при совпадающих именах собственные
идентификаторы перекрывают внешние). Зона видимости определяется
блоком заключенным в фигурные скобки. Т.о. мы уже столкнулись с двумя
зонами видимости. Одну мы определили при объявлении класса, а вторую-
при объявлении метода. Зона видимости метода и вложенные в нее зоны
видимости называются локальными зонами видимости, в локальных зонах
видимости могут быть объявлены только переменные, они называются
локальными переменными. Объявление локальных переменных ничем не
отличается от объявления переменных класса за исключением двух пунктов:
a) к ним неприменим аттрибут static
b) при обращении к локальным переменным, необходимо либо чтобы
им было что-то предварительно присвоено либо чтобы они были
проинициализированы при объявлении (а компилятор за этим проследит);
class test {
public static void main(String argv[]) {
int a, b, c;
a = 1;
c = a + b;
System.out.println(c);
}
}
/home/andrei/>javac test.java
test.java:5: variable b might not have been initialized
c = a + b;
^
1 error
В то же время как код
class test {
int a, b, c;
public void show() {
a = 1;
c = a + b;
System.out.println(c);
}
}
является вполне рабочим. За замечание b) и пример спасибо
Виталию Бердинских. В первом примере, переменные a,b и c
объявлены локальными в зоне видимости метода main, в то же
время, как во втором, переменные a,b и c принадлежат зоне
видимости класса и инициализируются автоматически. Заметьте,
что если в последнем примере в методе show объявить переменную
b, то возникнет ошибка примера один, т.к. в зоне видимости метода
переменная b экземпляра класса будет перекрыта переменной b
метода.