
- •Программирование на 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 вместе
Тема 5.7 Ошибки неоднозначности
Появление универсальных типов стало причиной возникновения новых ошибок, связанных с неоднозначностью. Ошибки неоднозначности возникают тогда, когда в результате стирания два, на первый взгляд различающихся универсальных объявления преобразуются в один тип, вызывая тем самым конфликтную ситуацию.
Листинг 5.8
//Неоднозначность, вызванная стиранием
//перегруженных методов
public class MyGenClass<T, V> {
private T ob1;
private V ob2;
// Два следующих метода конфликтуют друг с другом
// поэтому код не компилируется
public void set(T o) {
ob1 = o;
}
public void set(V o) {
ob2 = o;
}
}
В классе MyGenClass объявлены два универсальных типа: T и V. В классе MyGenClass сделана попытка перегрузки метода set(). Перегруженные методы отличаются типами параметров, в данном случае это T и V. Кажется, что ошибки не должны возникать, так как T и V – различные типы. Однако мы сталкиваемся здесь с двумя проблемами, связанными с неоднозначностью. Во-первых, в классе MyGenClass нет никакой гарантии, что T и V действительно будут различаться. Так, например, не является ошибкой создание объекта MyGenClass с помощью выражения
MyGenClass<String, String> obj = new MyGenClass<String, String>()
В данном случае T и V заменяются String. В результате оба варианта метода set() становятся одинаковыми, что безусловно является ошибкой.
Вторая, более серьезная проблема состоит в том, что в результате стирания оба варианта метода set() преобразуются в следующий вид:
void set(Object о) { // ...
Таким образом, попытка перегрузки в классе MyGenClass в принципе приводит к неоднозначности определений метода set(). Решением данной проблемы является отказ от перегрузки и использование двух различных имен методов.
Тема 5.8 Ограничения универсальных типов
Существует ряд ограничений, которые необходимо учитывать при работе Универсальными типами. К ним относятся создание объектов, тип которых является параметром типа, использование статических членов, генерация исключений и работа с массивами. Рассмотрим их подробнее.
Экземпляр параметра типа создать невозможно.
Листинг 5.9
//Экземпляр T создать невозможно
public class Gen<T> {
private T ob;
public Gen() {
ob = new T(); // Illegal!!!
}
}
В данном случае попытка создания экземпляра класса T приводит к ошибке. Причину этого понять несложно. Поскольку при выполнении программы т не существует, компилятор не знает о том, какого типа объект должен быть сформирован. Как вы помните, в результате стирания все параметры типа удаляются на этапе компиляции.
Статические члены не могут использовать параметры типа, объявленные в содержащем их классе. Все объявления статических членов в приведенном ниже классе недопустимы.
Листинг 5.10
public class Wrong<T> {
// Статическую переменную типа T создать невозможно
private static T ob;
// Статический метод не может использовать T
public static T getob() {
return ob;
}
// Статический метод не может обращаться к объекту
// типа Т
public static void showob() {
System.out.println(ob);
}
}
Несмотря на наличие описанного выше ограничения, допустимо объявление статические универсальные методы, в которых используются собственные параметры типа. Примеры таких объявлений приводились ранее.
Чтобы при работе с универсальными типами использовать массивы, необходимо учитывать два существенных ограничения. Во-первых, невозможно создать экземпляр массива, базовый тип которого определяется параметром типа. Во-вторых, нельзя создать массив универсальных ссылок, тип которых уточнен. Листинг демонстрирует оба случая.
Листинг 5.11
// Универсальные типы и массивы
public class Gen<T extends Number> {
private T ob;
private T vals[]; // Допустимо
public Gen(T o, T[] nums) {
ob = o;
// Следующее выражение недопустимо
// vals = new T[10]; // Невозможно создать массив типа T
// Следующее выражение корректно
vals = nums; // Переменной можно присваивать ссылку на
// существующий массив
}
}
public class GenArray {
public static void main(String args[]) {
Integer n[] = {1, 2, 3, 4, 5};
Gen<Integer> iOb = new Gen<Integer>(50, n);
// Невозможно создать массив универсальных ссылок
// Gen<Integer> gens[] = new Gen<Integer>[10]; // Ошибка!
Gen<?> gens[] = new Gen<?>[10]; // Выражение корректно
}
}
Как видно из кода программы, допустимо создать ссылку на массив типа Т. Демонстрирует следующая строка кода:
T vals[ ]; // Допустимо.
Однако сам массив T сформировать нельзя. По этой причине приведенная ниже строка закомментирована.
// vals = new T[ 10]; // Невозможно создать массив типа Т.
Причина данного ограничения состоит в том, что тип T не существует при выполнении программы, поэтому компилятор не знает, какого типа массив надо в действительности создать.
Однако вы можете передать ссылку на массив конкретного типа конструктору Gen() при создании объекта, а также присвоить это значение переменной vals. Примером может служить следующая строка:
vals = nums; // Допускается присвоение переменной ссылки
// на существующий массив.
Данное решение корректно, поскольку тип массива, передаваемого Gen, известен. При создании объекта его тип совпадает с Т.
В теле метода main() содержится выражение, иллюстрирующее невозможность объявить массив ссылок на уточненный универсальный тип. Строка, приведенная ниже, не будет скомпилирована.
// Gen<Integer> gens[] = new Gen<Integer>[ 10] ; // Ошибка!
Универсальный класс не может расширять класс Throwable. Это означает, что создать универсальный класс исключения невозможно.