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

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

ную в конце блока, это совершенно бесполезно, потому что никакой код не будет иметь к ней доступа. Например, этот фрагмент недопустим, потому что переменная count не может использоваться до ее объявления:

// Этот фрагмент неправильный!

count =100; // count нельзя использовать перед ее объявлением!

int count;

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

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

// Демонстрирует время жизни переменной, class LifeTime {

public static void main(String args[]) { int x;

for(x = 0; x < 3; x++) {

int у = -1; //У инициализируется каждый раз при входе в блок System.out.println("у равен: " + у); /'/ всегда выводит -1 у = 100;

System.out.println("у теперь: " + у); } } }

Вывод, генерируемый этой программой:

у равен: -1 у теперь: 100 у равен: -1 у теперь: 100 у равен: -1 у теперь: 100

Видно, что у повторно инициализируется (значением - 1) каждый раз при входе во внутренний цикл for. Даже хотя ей затем присваивается значе­ние 100, это значение теряется.

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

Последний штрих: хотя блоки могут быть вложены, во внутреннем блоке нельзя объявлять переменную с тамим же именем, как во внешней области действия. В этом отношении Java отличается от С и C++. Ниже приведен пример, который пробует объявлять две отдельные переменные с одним и тем же именем. В Java это незаконно. В C/C++ это было бы приемлемо, и две переменные bar были бы различными.

// Эта программа не будет компилироваться, class ScopeErr {

public static void main(String argsf]) { int bar = 1; { // создается новая область действия

int bar = 2; // Ошибка времени выполнения — bar уже определена! } } }

Преобразование и приведение типов

Опытным программистам уже известно, что довольно обычным делом явля­ется присваивание значения одного типа переменной другого типа. Если два типа совместимы, то Java выполнит преобразование автоматически. Напри­мер, всегда возможно назначить int-значение long-переменной. Однако не все типы совместимы и, таким образом, не все преобразования типов не­явно позволены. Например, не определено никакого преобразования из double в byte. К счастью, все еще возможно осуществить преобразование между несовместимыми типами. Чтобы это сделать, следует использовать специальную операцию приведения типов (cast), которая выполняет явное преобразование между несовместимыми типами. Рассмотрим как автомати­ческие преобразования типов, так и приведение типов.

Автоматическое преобразование типов в Java

Когда один тип данных назначается переменной другого типа, будет иметь место автоматическое преобразование типов, если выполняются два следую­щих условия:

O два типа совместимы;

О целевой тип больше чем исходный.

Когда эти два условия выполняются, имеет место расширяющее преобразова­ние (widening conversion). Например, тип int всегда достаточно большой, чтобы содержать все допустимые byte-значения, так что никакой явный оператор приведения не требуется.

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