
- •Программирование на 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.2 Универсальный класс с двумя параметрами типа
В универсальном классе можно задать несколько параметров типа. В этом случае параметры разделяются запятыми. В листинге 5.2 приведен ниже класс TwoGen(модификацией класса Gen) и в нем определены два параметра типа.
Листинг 5.2
// Простой универсальный класс с двумя параметрами типа: T и V
public class TwoGen<T, V> {
private T ob1;
private V ob2;
// Конструктору класса передаются ссылки
// на объекты типов T и V
public TwoGen(T o1, V o2) {
ob1 = o1;
ob2 = o2;
}
// Отображение типов T и V
public void showTypes() {
System.out.println("Type of T is "+ ob1.getClass().getName());
System.out.println("Type of V is "+ ob2.getClass().getName());
}
public T getob1() {
return ob1;
}
public V getob2() {
return ob2;
}
}
// Демонстрация работы класса TwoGen
public class SimpGen {
public static void main(String args[]) {
// В данном случае параметр T заменяется типом Integer,
// а параметр V - типом String
TwoGen<Integer, String> tgObj =
new TwoGen<Integer, String>(88, "Generics");
// Отображение типов
tgObj.showTypes();
// Получение и отображение переменных
int v = tgObj.getob1();
System.out.println("value: " + v);
String str = tgObj.getob2();
System.out.println("value: " + str);
}
}
Обратите внимание на объявление класса TwoGen.
public class TwoGen<T, V> {
Здесь определяются два параметра типа: T и V; они разделяются запятыми. Поскольку в классе используются два параметра типа, при создании объекта надо указывать два передаваемых типа.
TwoGen<Integer, String> tgObj =
new TwoGen<Integer, String>(88, "Generics");
В данном случае Integer заменяет параметр типа T, а String заменяет V. И хотя в данном примере передаваемые типы различаются, в принципе они могут совпадать. Например, следующая строка кода допустима:
TwoGen<String, String> x = new TwoGen<String, String>("A", "B");
В данном случае T и V заменяются типом String. Конечно, если передаваемые типы всегда совпадают, определять два параметра типа нет никакой необходимости.
Тема 5.3 Ограниченные типы
В предыдущих примерах параметры типа могли заменяться любым классом. Такое решение подходит для многих целей, но иногда полезно ограничить допустимый набор передаваемых типов. Предположим, например, что вы хотите создать универсальный класс, который хранил бы числовое значение и мог выполнять различные математические функции, например, вычислять обратное значение или извлекать дробную часть. Предположим, что мы пошли дальше и хотим использовать данный класс для работы с любыми числовыми типами: целочисленными и с плавающей точкой.
Для подобных ситуаций в языке Java предусмотрены ограниченные типы. При объявлении параметра типа вы можете указать так называемую верхнюю границу, т.е. задать суперкласс, который должны наследовать все передаваемые типы. С этой целью было введено выражение extends, определяющее параметр типа так, как показано ниже.
<T extends суперкласс>
С помощью данного выражения компилятору предоставляется информация о том, что T может быть заменен только суперклассом или его подклассами. Таким образом, суперкласс определяет верхнюю границу в иерархии классов в Java.
В листинге 5.3 приведен пример использования ограниченного параметра
Листинг 5.3
public class NumericFns<T extends Number> {
private T num;
public NumericFns(T n) {
num = n;
}
public double reciprocal() {
return 1 / num.doubleValue();
}
public double fraction() {
return num.doubleValue() - num.intValue();
}
}
// Демонстрация работы NumericFns
public class BoundsDemo {
public static void main(String args[]) {
// Применение Integer допустимо, поскольку
// данный класс является подклассом Number
NumericFns<Integer> iOb =new NumericFns<Integer>(5);
System.out.println("Reciprocal of iOb is "+ iOb.reciprocal());
System.out.println("Fractional component of iOb is "+ iOb.fraction());
System.out.println();
// Применение Double также допустимо
NumericFns<Double> dOb =new NumericFns<Double>(5.25);
System.out.println("Reciprocal of dOb is " + dOb.reciprocal());
System.out.println("Fractional component of dOb is "+ dOb.fraction());
// Следующая строка кода не будет компилироваться,
// поскольку String не является подклассом Number
// NumericFns<String> strOb = new NumericFns<String>("Error");
}
}
Заметьте, что теперь для объявления NumericFns используется следующая строка кода:
public class NumericFns<T extends Number> {
Поскольку тип T теперь ограничен классом Number, компилятор Java знает, что все объекты типа T содержат метод doubleValue(), а также другие методы определенные в Number. Это само по себе является огромным преимуществом. Но это еще не все. Данный механизм предотвращает создание объектов NumericFns типов, отличных от числовых. Например, если вы попытаетесь удалить комментарии из строк, расположенных в конце программы, а затем попытаетесь повторно скомпилировать код, вы получите сообщение об ошибке, поскольку String не является подклассом Number.
Задание:
Напишите параметризированный класс с двумя параметрами, ограниченными классом Number и разработайте метод вычисления суммы двух чисел, любых типов, метод сравнивающий поэлементно два массива разных типов, метод определяющий наибольший и наименьший элементы в массивах.