Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
49
Добавлен:
12.05.2015
Размер:
1.82 Mб
Скачать

Глава 3. Типы данных, переменные и массивы 65_

Здесь объявлены три локальные переменные — а, b и с. Две первые, а и b, инициализированы константами. Однако с инициализирована динамически длиной гипотенузы (используя теорему Пифагора). Программа использует один из встроенных методов Java sqrt(), который является членом класса Math, чтобы вычислить квадратный корень его аргумента. Ключевой момент заключается в том, что выражение инициализации может использовать лю­бой элемент, допустимый во время инициализации, включая вызовы мето­дов, другие переменные или литералы.

Область действия и время жизни переменных

До сих пор все используемые переменные объявлялись в начале метода main(). Однако Java позволяет объявлять переменные в пределах любого блока. Как было объяснено в главе 2, блок начинается с открывающей фи­гурной скобки и оканчивается закрывающей фигурной скобкой. Блок опре­деляет область видимости (действия) имен переменных (scope). Таким обра­зом, каждый раз, когда запускается новый блок, создается новая область видимости. Область видимости определяет ту часть программы, где имена декларированных (в данном блоке) объектов являются "видимыми" из дру­гих частей программы. Эта область определяет также "время (продолжитель­ность) жизни" этих объектов.

Большинство машинных языков определяет две общих категории областей действия — глобальную и локальную. Однако эти традиционные области дей­ствия не совсем согласуются со строгой, объектно-ориентированной мо­делью Java. Хотя можно показать, что относится к глобальной области дей­ствия, но это скорее исключение, а не правило. В Java-программах можно выделить две основных области действия: одна определяется классом, а другая — методом. Однако даже такое различие несколько искусственно. Так как область действия класса (class scope) имеет несколько уникальных свойств и атрибутов, которые не применяются к области действия, опреде­ляемой методом, эта дискуссия имеет некоторый смысл. Из-за этих разли­чий обсуждение области действия класса (и переменных, объявленных в ее пределах) отложено до главы 6, где описаны классы. Пока мы будем рас­сматривать только область действия, определенную в пределах метода.

Область действия, определенная методом, начинается с его открывающей фигурной скобки. Однако, если метод имеет параметры, они также включа­ются в его область действия. Хотя параметры будут рассмотрены более под­робно в главе 5, в данном обсуждении они работают так же, как любая дру­гая переменная метода.

Общее правило: переменные, объявленные внутри области действия, неви­димы (т. е. недоступны) коду, который определен вне этой области. Таким образом, когда вы объявляете переменную в пределах области действия, вы локализуете эту переменную и защищаете ее от неправомочного доступа

66

Часть I. Язык Java

и/или модификации. Действительно, правила области видимости обеспечи­вают основу для инкапсуляции.

Области действия могут быть вложены. Например, каждый раз, когда вы создаете блок кода, образуется новая, вложенная область действия. Когда это происходит, внешняя область действия включает внутреннюю. Это оз­начает, что объекты, объявленные во внешней области, будут видимы и во внутренней. Однако, обратное — не верно. Объекты, объявленные во внут­ренней области действия, не будут видимы во внешней. Чтобы понять эффект вложенных областей действия, рассмотрим следую­щую программу:

// Демонстрирует область действия блока, class Scope {

public static void main(String args[]) {

int x; // известна всему коду внутри main

х = 10;

if(x == 10) { // начало новой области действия int у = 20; // известна только в этом блоке

// здесь известны х и у

System.out.println("х и у: " + х + " " + у);

х = у * 2; } // у = 100; //Ошибка! у здесь не известна

//х здесь еще известна System.out.println("х равно " + х); } }

Как указывают комментарии, переменная х объявлена в начале области дей­ствия main ( ) и доступна для всего последующего кода в main ( ) . В пределах if-блока объявлена переменная у. Так как блок определяет область дейст­вия, переменная у видима только кодам в пределах этого блока. Вот почему закомментирована строка у = 100;, находящаяся вне этого блока. Если вы удалите ведущие символы комментария, произойдет ошибка во время ком­пиляции, потому что у — невидима вне этого блока. Внутри блока if мож­но использовать переменную х, потому что код в блоке (т. е. во вложенной области действия) имеет доступ к переменным, объявленным во включаю­щей области действия.

Внутри блока переменные можно объявлять в любой точке, но область их действия начинается только после того, как они объявлены. Таким образом, если вы определяете переменную в начале метода, она становится доступной всему коду в пределах этого метода. Наоборот, если вы объявляете перемен-

Соседние файлы в папке JavaLit