
- •Программирование на 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.6 Универсальные интерфейсы
Наряду с универсальными классами и методами существуют также универсальные интерфейсы. Универсальные интерфейсы определяются точно так же, как и универсальные классы. Их использование иллюстрирует следующий пример. В нем создается интерфейс Containment, который может быть реализован классами, хранящими одно или несколько значений. Кроме того, в нем объявлен метод contains(), который определяет, содержится ли указанное значение в текущем объекте.
Листинг 5.7
// Данный интерфейс подразумевает, что
// реализующий его класс содержит одно или несколько значений
public interface Containment<T> {
// Метод contains() проверяет, содержится ли
// некоторый элемент в составе объекта, реализующего Containment
public boolean contains(T o);
}
// Реализация интерфейса Containment с использованием
// массива, предназначенного для хранения значений.
// Любой класс, реализующий универсальный интерфейс,
// также должен быть универсальным
public class MyClass<T> implements Containment<T> {
private T[] arrayRef;
public MyClass(T[] o) {
arrayRef = o;
}
public boolean contains(T o) {
for (T x : arrayRef) {
if (x.equals(o)) {
return true;
}
}
return false;
}
}
public class GenIFDemo {
public static void main(String args[]) {
Integer x[] = {1, 2, 3};
MyClass<Integer> ob = new MyClass<Integer>(x);
if (ob.contains(2)) {
System.out.println("2 is in ob");
} else {
System.out.println("2 is NOT in ob");
}
if (ob.contains(5)) {
System.out.println("5 is in ob");
} else {
System.out.println("5 is NOT in ob");
}
// Следующие строки кода недопустимы, так как ob
// представляет собой вариант Integer
// реализации интерфейса Containment, а 9.25 —
// это значение Double
// if(ob.contains(9.25)) // Illegal!
// System.out.println("9.25 is in ob");
}
}
В основном элементы этой программы просты для восприятия, однако на некоторых ее особенностях следует остановиться. Прежде всего обратите внимание на то, как определен интерфейс Containment,
public interface Containment<T> {
Универсальные интерфейсы объявляются так же, как и универсальные классы. В данном случае параметр типа T задает тип включаемого объекта. Интерфейс Containment реализуется классом MyClass. Определение этого класса выглядит следующим образом:
public class MyClass<T> implements Containment<T> {
Если класс реализует универсальный интерфейс, то он также должен быть универсальным. В нем должен быть объявлен как минимум тот параметр типа, который указан для интерфейса. Например, приведенный ниже вариант объявления класса MyClass недопустим.
public class MyClass implements Containment<T> { // Ошибка!
В данном случае ошибка заключается в том, что в MyClass не объявлен параметр типа, а это значит, что нет возможности передать параметр типа интерфейсу Containment. При этом идентификатор T неизвестен и компилятор генерирует сообщение об ошибке. Класс, реализующий универсальный интерфейс, может не быть универсальным только в одном случае: если при объявлении класса для интерфейса указывается конкретный тип. Подобный вариант объявления класса приведен ниже.
public class MyClass implements Containment<Double> { // 0K
Наверное, вы не удивитесь, узнав, что один или несколько параметров типа для универсального интерфейса могут быть ограничены. Это позволяет указывать, какие типы данных допустимы для интерфейса. Например, если вы хотите запретить передачу Containment значений, не являющихся числовыми, вы можете использовать объявление
public interface Containment<T extends Number> {
Теперь любой класс, реализующий Containment, должен передавать интерфейсу значение типа, удовлетворяющее указанным ограничениям. Например, класс MyClass, реализующий рассмотренный интерфейс, должен объявляться следующим образом:
public class MyClass<T extends Number> implements Containment<T> {
Обратите особое внимание на то, как параметр типа T объявляется в классе Myclass, а затем передается интерфейсу Containment. Поскольку на этот раз интерфейсу Containment требуется тип, расширяющий Number, в классе, peaлизующем интерфейс (в данном случае это MyClass), должны быть определены соответствующие ограничения. Если верхняя граница задана в определении класса, то нет необходимости еще раз указывать ее в выражении implements Более того, если вы попытаетесь сделать это, получите сообщение об ошибке. Например, следующее выражение некорректно и не будет компилироваться:
// Ошибка!
public class MyClass<T extends Number> implements Containment<T extends Number> {
Если параметр типа задан в определении класса, он лишь передается интерфейсу без дальнейшей модификации.
Формат объявления универсального интерфейса выглядит следующим образом:
public interface имя_интерфейса<параметры_типа> { // ...
Здесь параметры типа в составе списка разделяются запятыми. При реализации интерфейса имя класса также должно сопровождаться параметрами типа. Выражение, с помощью которого определяется класс, реализующий интерфейс, показано ниже.
class имя_класса<параметры_типа>
implements имя_интерфейса<параметры_типа> {
Задание:
Разработать очередь в которой можно хранить объекты любых типов. Методами get() и set() можно извлечь и добавить объект. Предусмотреть обработку исключений в случае переполнения и пустой очереди.