Брюс Эккель - Философия Java3
- Название:Философия Java3
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Брюс Эккель - Философия Java3 краткое содержание
Философия Java3 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
public class ListCharacters {
public static void main(String[] args) { for(char с = 0, с < 128, С++)
i f(Character.i sLowerCase(c))
System out рппШСзначение- " + (int)c + " символ. " + с).
}
} /* Output-значение 97 символ a значение 98 символ b" значение 99 символ с" значение 100 символ d" значение- 101 символ: е" значение 102 символ, f" значение 103 символ, д" значение 104 символ: h" значение- 105 символ- i значение 106 символ- j
*///:-
Обратите внимание, что переменная i определяется в точке ее использования, в управляющем выражении цикла for, а не в начале блока, обозначенного фигурными скобками. Область действия для i — все выражения, принадлежащие циклу.
В программе также используется класс-«обертка» java.Lang.Character, который не только позволяет представить простейший тип char в виде объекта, но и содержит ряд дополнительных возможностей. В нашем примере используется статический метод этого класса isLowerCase(), который проверяет, является ли некоторая буква строчной.
Традиционные процедурные языки (такие, как С) требовали, чтобы все переменные определялись в начале блока цикла, чтобы компилятор при создании блока мог выделить память под эти переменные. В Java и С++ переменные разрешено объявлять в том месте блока цикла, где это необходимо. Это позволяет программировать в более удобном стиле и упрощает понимание кода.
Оператор-запятая
Ранее в этой главе уже упоминалось о том, что оператор «запятая» (но не запя-та я-разделитель, которая разграничивает определения и аргументы функций) может использоваться в Java только в управляющем выражении цикла for. И в секции инициализации цикла, и в его управляющем выражении можно записать несколько команд, разделенных запятыми; они будут обработаны последовательно.
Оператор «запятая» позволяет определить несколько переменных в цикле for, но все эти переменные должны принадлежать к одному типу:
//. control/CommaOperator.java
public class CommaOperator {
public static void main(String[] args) {
for(int i = 1. j = i + 10, i < 5. i++, j = i * 2) {
System out.printlnC'i = " + i + " j = " + j);
}
}
} /* Output: i = 1 j = 11 i = 2 j = 4 i = 3 j = 6 i = 4 j = 8 *///:-
Определение int в заголовке for относится как к i, так и к j. Инициализацон-ная часть может содержать любое количество определений переменных одного типа. Определение переменных в управляющих выражениях возможно только в цикле for. На другие команды выбора или циклов этот подход не распространяется.
Синтаксис foreach
В Java SE5 появилась новая, более компактная форма for для перебора элементов массивов и контейнеров (см. далее). Эта упрощенная форма, называемая синтаксисом foreach, не требует ручного изменения служебной переменной для перебора последовательности объектов — цикл автоматически представляет очередной элемент.
Следующая программа создает массив float, после чего перебирает все его элементы:
//• control/ForEachFloat.java import java util.*,
public class ForEachFloat {
public static void main(String[] args) { Random rand = new Random(47), float f[] = new float[10], for(int i = 0; i < 10. i++)
f[i] = rand.nextFloatO, for(float x f)
System out println(x).
}
} /* Output
0.72711575
0.39982635
0.5309454
0.0534122
0.16020656
0.57799757
0.18847865
0.4170137
0.51660204
0.73734957 *///.-
Массив заполняется уже знакомым циклом for, потому что для его заполнения должны использоваться индексы. Упрощенный синтаксис используется в следующей команде:
for(float X f)
Эта конструкция определяет переменную х типа float, после чего последовательно присваивает ей элементы f.
Любой метод, возвращающий массив, может использоваться с данной разновидностью for. Например, класс String содержит метод toCharArray(), возвращающий массив char; следовательно, перебор символов строки может осуществляться так:
//: control/ForEachString.java
public class ForEachString {
public static void main(String[] args) {
for(char с : "An African Swallow".toCharArray() ) System.out.print(c + " ");
}
} /* Output:
An African Swallow *///.-
Как будет показано далее, «синтаксис foreach» также работает для любого объекта, поддерживающего интерфейс Iterable.
Многие команды for основаны на переборе серии целочисленных значений:
for (int i = 0; i < 100; i++)
В таких случаях «синтаксис foreach» работать не будет, если только вы предварительно не создадите массив int. Для упрощения этой задачи я включил в библиотеку net.mindview.util.Range метод range(), который автоматически генерирует соответствующий массив:
//: control/ForEachlnt.java
import static net.mindview.util.Range.*,
import static net.mindview.util Print.*;
public class ForEachlnt {
public static void main(String[] args) { for(int i : range(10)) // 0..9
printnbCi +
„ v).
printO;
for(int
i : range(5,
10)) // 5..9
printnb(i +
printO;
for(int
i : range(5.
20. 3)) // 5
printnbCi +
printO:
}
} /* Output: 0 12 3 4 5 6 7 8 9 5 6 7 8 9 5 8 11 14 17 *///:-
Обратите внимание на использование printnb() вместо print(). Метод printnb() не выводит символ новой строки, что позовляет построить строку по фрагментам.
return
Следующая группа ключевых слов обеспечивает безусловный переход , то есть передачу управления без проверки каких-либо условий. К их числу относятся команды return, break и continue, а также конструкция перехода по метке, аналогичная goto в других языках.
У ключевого слова return имеется два предназначения: оно указывает, какое значение возвращается методом (если только он не возвращает тип void), а также используется для немедленного выхода из метода. Метод test() из предыдущего примера можно переписать так, чтобы он воспользовался новыми возможностями:
//: control/IfElse2.java
import static net.mindview.util.Print.*:
public class IfElse2 {
static int test(int testval. int target) { if(testval <@062> target)
return +1; else if(testval < target) return -1;
else
return 0; // Одинаковые значения
}
public static void main(String[] args) { prmt(test(10. 5)); print(test(5. 10)): print(test(5. 5));
}
} /* Output: 1 -1 0
В данном случае секция else не нужна, поскольку работа метода не продолжается после выполнения инструкции return.
Если метод, возвращающий void, не содержит команды return, такая команда неявно выполняется в конце метода. Тем не менее, если метод возвращает любой тип, кроме void, проследите за тем, чтобы каждая логическая ветвь возвращала конкретное значение.
break и continue
В теле любого из циклов вы можете управлять потоком программы, используя специальные ключевые слова break и continue. Команда break завершает цикл, при этом оставшиеся операторы цикла не выполняются. Команда continue останавливает выполнение текущей итерации цикла и переходит к началу цикла, чтобы начать выполнение нового шага.
Следующая программа показывает пример использования команд break и continue внутри циклов for и while:
//: control/BreakAndContinue.java // Применение ключевых слов break и continue import static net.mindview.util.Range.*;
public class BreakAndContinue {
public static void main(String[] args) { for(int i = 0: i < 100; i++) {
if(i == 74) break; // Выход из цикла
if(i % 9 != 0) continue; // Следующая итерация
System.out print(i + " ");
}
System out.printlnO; // Использование foreach: for(int i : range(lOO)) {
if(i == 74) break; // Выход из цикла
if(i % 9 != 0) continue; // Следующая итерация
System.out.print(i + " ");
}
System.out.println(); int i = 0;
// "Бесконечный цикл": while(true) { i++;
int j = i * 27,
if(j == 1269) break; // Выход из цикла
Читать дальшеИнтервал:
Закладка: