
- •Программирование на Java
- •Глава 1 Введение в java. Основы языка.
- •Тема 1.1 Язык программирования java.
- •Тема 1.2 Состав пакета Java2.
- •Тема 1.3 Настройка среды окружения.
- •Тема 1.4 Структура Java-программы.
- •Тема 1.5 Набор текста, запуск и компиляция простейшей программы.
- •Тема 1.6 Подробное рассмотрение кода простейшей программы.
- •Тема 1.7. Создание программы в разных средах разработки.
- •Тема 1.8 Лексические основы языка
- •Тема 1.9 Элементарные типы данных.
- •Тема 1.10 Преобразование типов.
- •Арифметические операции
- •Операции сравнения
- •Тема 1.11 Кoнсольный ввод с помощью класса java.Util.Scanner
- •Тема 1.12 Классы-оболочки
- •Тема 1.13 Автоупакока и автораспаковка.
- •Тема 1.14 Операторы
- •1.14.1 Блок
- •1.14.2 Условный оператор if
- •1.14.4 Оператор цикла while
- •1.14.5 Оператор цикла do-while
- •1.14.6 Оператор цикла for
- •1.14.7 Оператор continue и метки
- •1.14.8 Оператор break
- •1.14.9 Оператор варианта switch
- •Тема 1.15 Статический импорт
- •Тема 1.16 Класс Math
- •Задания
- •Тема 1.17 Псевдослучайные числа
- •Тема 1.18 Генерация случайных чисел
- •Тема 1.19 Массивы в Java
- •1.19.1 Объявление и заполнение массива
- •1.19.2 Сортировка массива
- •Сортировка выбором
- •Сортировка методом пузырька
- •1.19.3 Многомерные массивы
- •Задания
- •1.19.4 Нерегулярные массивы
- •Глава 2 классы
- •Тема 2.1 Основы классов
- •Тема 2.2 Общая форма класса
- •Тема 2.3 Объявление объектов
- •Тема 2.4 Более подробное рассмотрение операции new
- •Тема 2.5 Присваивание переменных объектных ссылок
- •Тема 2.6 Знакомство с методами
- •Тема 2.7 Возвращение значения из метода
- •Тема 2.8 Добавление метода, принимающего параметры
- •Тема 2.9 Конструкторы
- •Тема 2.10 Сборка мусора
- •Тема 2.11 Перегрузка методов
- •Тема 2.12 Перегрузка конструкторов
- •Тема 2.13 Использование объектов в качестве параметров
- •Тема 2.14 Более пристальный взгляд на передачу аргументов
- •Тема 2.16 Рекурсия
- •Тема 2.17 Введение в управление доступом
- •Тема 2.18 Ключевое слово static
- •Тема 2.19 Ключевое слово final
- •Тема 2.20 Аргументы переменной длины
- •Тема 2.21 Строки и числа
- •Тема 2.22 Нумерованные типы
- •Глава 3 наследование и интерфейсы
- •Тема 3.1 Основы наследования
- •Тема 3.2 Наследование и доступ к членам класса
- •Тема 3.3 Конструкторы и наследование
- •Тема 3.4 Использование ключевого слова super для вызова конструктора суперкласса
- •Тема 3.5 Использование ключевого слова super для доступа к членам суперкласса
- •Тема 3.6 Многоуровневая иерархия
- •Тема 3.7 Когда вызываются конструкторы
- •Тема 3.8 Объекты подклассов и ссылки на суперклассы
- •Тема 3.9 Переопределение методов
- •Тема 3.10 Переопределение методов и поддержка полиморфизма
- •Тема 3.11 Использование абстрактных классов
- •Тема 3.12 Использование ключевого слова final
- •Тема 3.13 Предотвращение переопределения методов
- •Тема 3.14 Предотвращение наследования
- •Тема 3.15 Класс Object
- •Тема 3.16 Интерфейсы
- •3.16.1 Объявление интерфейса.
- •3.16.2 Реализация интерфейсов
- •3.16.3 Использование ссылок на интерфейсы
- •3.16.4 Переменные в составе интерфейсов
- •3.16.5 Наследование интерфейсов
- •Тема 3.17 Пакеты и ограничение доступа
- •Тема 3.18 Внутренние классы
- •3.18.1 Внутренние (inner) классы
- •3.18.2 Вложенные (nested) классы
- •3.18.3 Анонимные (anonymous) классы
- •Глава 4 Обработка исключительных ситуаций
- •Тема 4.1 Исключения в Java
- •Тема 4.2 Типы исключений
- •Тема 4.3 Неперехваченные исключения
- •Тема 4.4 Ключевые слова try и catch
- •Тема 4.6 Ключевое слово throw
- •Тема 4.7 Ключевое слово throws
- •Тема 4.8 Ключевое слово finally
- •Ошибка при выполнении метода1 java.Lang.ArithmeticException: Demo
- •Тема 4.9 Потомки Exception или написание своих классов ошибок
- •Глава 5 Универсальные типы. КоллекциИ
- •Тема 5.1 Общие сведения об универсальных типах
- •Тема 5.2 Универсальный класс с двумя параметрами типа
- •Тема 5.3 Ограниченные типы
- •Тема 5.4 Использование групповых параметров
- •Тема 5.5 Универсальные методы
- •Тема 5.6 Универсальные интерфейсы
- •Тема 5.7 Ошибки неоднозначности
- •Тема 5.8 Ограничения универсальных типов
- •Тема 5.9 Краткий обзор коллекций
- •5.9.1 Класс ArrayList
- •5.9.2 Класс LinkedList
- •5.9.3 Класс HashSet
- •5.9.4 Класс TreeSet
- •5.9.5 Доступ к коллекции через итератор
- •5.9.6 Алгоритмы коллекций
- •Глава 6 jdbc (Java DataBase Connectivity) Тема 6.1 Драйверы, соединения и запросы
- •Тема 6.2 Простое соединение и простой запрос
- •Тема 6.2 Класс ResultSet
- •Тема 6.3 Метаданные
- •Тема 6.4 Подготовленные запросы
- •Глава 7 Swing и пользовательский интерфейс
- •Тема 7.1 Общие сведения о swing
- •Тема 7.2 Архитектура mvc
- •Тема 7.3 Контейнер и компоненты
- •Тема 7.4 Простая программа, использующая средства Swing
- •Тема 7.5 Поддержка событий
- •Тема 7.6 Использование кнопок и обработка событий
- •Тема 7.7 Краткие сведения о диспетчерах компоновки
- •Тема 7.8 Пример использования jdbc и swing вместе
1.14.1 Блок
Блок может содержать в себе нуль или несколько операторов с целью их использования как одного оператора в тех местах, где по правилам языка можно записать только один оператор. Например, {х=5; у=6;}. Можно записать и пустой блок –{}.
Блоки операторов часто используются для ограничения области действия переменных и просто для улучшения читаемости текста программы.
1.14.2 Условный оператор if
Условный оператор в Java записывается так:
if (логВыр) оператор1; else оператор2;
и действует следующим образом. Сначала вычисляется логическое выражение логВыр. Если результат true, то выполняется оператор1 и на этом выполнение условного оператора завершается, оператор2 не выполняется, далее будет выполняться следующий за if оператор. Если результат false, то действует оператор2, при этом оператор1 вообще не выполняется.
Условный оператор может быть сокращенным:
if (логВыр) оператор;
и в случае false не выполняется ничего.
Синтаксис языка не позволяет записывать несколько операторов ни в ветви if, ни в ветви else. При необходимости составляется блок операторов в фигурных скобках. Рекомендуется всегда использовать фигурные скобки и размещать оператор на нескольких строках с отступами, как показано в следующем примере:
if (а < х) {
х = а + b;
} else {
х = а – b;
}
Это облегчает добавление операторов в каждую ветвь при изменении алгоритма. Очень часто одним из операторов является снова условный оператор, например:
if (n == 0) {
sign = 0;
} else if (n < 0) {
sign = -1;
} else {
sign = 1;
}
При этом может возникнуть такая ситуация:
int ind = 5, х = 100;
if (ind >= 10)
if (ind <= 20)
x = 0;
else x = 1;
Сохранит переменная х значение 100 или станет равной 0? Здесь необходимо волевое решение, и общее для большинства языков, в том числе и Java, правило таково: ветвь else относится к ближайшему слева условию if, не имеющему своей ветви else. Поэтому в нашем примере переменная х останется равной 100.
Изменить этот порядок можно с помощью блока:
if (ind > 10) {
if (ind < 20)
x = 0;
}else
x = 1;
Вообще не стоит увлекаться сложными вложенными условными операторами, т.к. проверки условий занимают много времени. По возможности лучше использовать логические операции, например, в данном примере лучше написать следующее:
if (ind >= 10 && ind <= 20) {
х = 0;
} else {
х = 1;
}
Задания:
Определить, какое значение будет в переменной dd
1).
int dd, k1 = 3,k2 = 5, k3 = 7;
if (k1 > 1) {
if (k2 != 3) {
dd = 4;
} else {
dd = 3;
}
} else {
dd = 2;
2).
int dd, k1 = 3,k2 = 5, k3 = 7;
if (k1>10) dd=1;
else if (k1 % 3 == 1) dd=2;
else if (k2 % 5 == 1) dd=3;
else if (k3 % 3 == 2) dd=4;
else dd=5;
3).
int dd, k1 = 3,k2 = 5, k3 = 7;
if (k1>10) dd=1;
else if (true) dd=2;
else if (k2 % 5 == 1) dd=3;
else if (k3 % 3 == 2) dd=4;
else dd=5;
4).
int dd, k1 = 6,k2 = 10, k3 = 21;
if (k1>k2) dd=1;
else if (k1>k3) dd=2;
else if (k1+k2>k3) dd=3;
else dd=4;
5).
int dd=0;
int k=44;
if (k % 2 == 0) dd=dd+1;
if (k % 3 == 1) dd=dd+2;
if (k % 5 == 4) dd=dd+5;
if (k % 6 == 4) dd=dd+9;
6).
int dd=0;
int k1=6; int k2=10; int k3=21;
if (k1>k2 || k3>k2) dd=dd+1;
if (k1 <k3&& k2!=10) dd=dd+2;
else dd=dd+3;
if (k1 % 5 == 4) dd=dd+5;
if (k2% 6 != 4) dd=dd+9;
1.14.3 if-else и ?
Оператор ? называется тернарным оператором, поскольку он обрабатывает три операнда. Этот оператор записывается в следующем форме:
выражение_1 ? выражение_2 : выражение_3;
где первое выражение должно быть логическим, т.е. возвращать тип boolean а второе и третье выражения, разделяемые двоеточием, могут быть любого за исключением void. Необходимо только, чтобы тип второго и третьего выражения совпадал.
Значение выражения ? определяется следующим образом. Сначала вычисляется первое выражение. Если оно возвращает значение true, то вычисляется второе выражение и значение, возвращаемое им, становится значением всего выражения? Если значение первого выражения – false, то вычисляется третье выражение, которое становится значением всего выражения ?. Рассмотрим пример, в котором вычисляется абсолютное значение val и присваивается переменной absval:
absval = val < 0 ? -val : val; // Получение абсолютного значения val.
где переменной absval присваивается значение val, если переменная val больше или равна нулю. Если значение val отрицательное, то переменной absval присваивается значение val со знаком "минус" (что в результате даст положительную величину). Код, решающий ту же самую задачу, но использующий структуру if-else, будет выглядеть следующим образом:
if(val < 0) absval = -val;
else absval = val;
Рассмотрим еще один пример использования оператора ?. В листинге 1.18 выполняется деление двух чисел, но не допускается деление на нуль.
Листинг 1.18
// Использование оператора ? для предотвращения деления на нуль
public class NoZeroDiv {
public static void main(String args[]) {
int result;
for (int i = -5; i < 6; i++) {
result = i != 0 ? 100 / i : 0;
if (i != 0) {
System.out.println("100 / " + i + " is " + result);
} else {
System.out.println("i = " + result);
}
}
}
}
Обратите внимание на следующую строку кода:
result = i != 0 ? 100 / i : 0;
где переменной result присваивается результат деления 100 на i. Однако деление выполняется только в том случае, если значение переменной i не равно нулю. В противном случае переменной result присваивается нулевое значение.
Выражение, возвращаемое оператором ?, не обязательно присваивать переменной. Вы можете применить его, например, в качестве параметра при вызове метода. Если же все три выражения имеют тип boolean, то само выражение ? может быть использовано в качестве условия для цикла или оператора if. Ниже приведена предыдущая программа, код которой несколько видоизменен(листинг 1.19). Она генерирует те же данные, которые были представлены ранее.
Листинг 1.19
// Использование оператора ? для предотвращения деления на нуль
public class NoZeroDiv {
public static void main(String args[]) {
for (int i = -5; i < 6; i++) {
if (i != 0 ? true : false) {
System.out.println("100 / " + i + " is " + 100 / i);
}
}
}
}
Обратите внимание на выражение if. Если значение переменной i равно нулю, то выражение ? возвращает значение false, что предотвращает деление на нуль, и результат не отображается. В противном случае осуществляется обычное деление.