
- •Программирование на 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 вместе
3.16.3 Использование ссылок на интерфейсы
Возможно, вы удивитесь, узнав, что при написании программ разрешается создавать переменные, тип которых определяется именами интерфейсов. Другими словами, вы можете создать ссылку на интерфейс. Такая переменная может ссылаться на любой объект, реализующий интерфейс. Если вызвать метод посредством ссылки на интерфейс, управление получит вариант метода, реализованный объектом, на который в данный момент ссылается переменная. Этот процесс аналогичен использованию ссылки на суперкласс для доступа к экземпляру подкласса.
Ниже приведен пример, демонстрирующий использование ссылки на интерфейс. Посредством такой ссылки будет вызываться метод area() реализованный в классах Circle и Square(листинг 3.26).
Листинг 3.26
//Интерфейс Area
public interface Area {
public void area();
}
// Класс Circle реализует метод интерфейса
public class Circle implements Area{
private int radius;
public Circle(int radius) {
this.radius = radius;
}
@Override
public void area() {
System.out.println("Площадь круга "+Math.PI*Math.pow(radius, 2));
}
}
// Класс Square реализует метод интерфейса
public class Square implements Area {
private int a;
public Square(int a) {
this.a = a;
}
@Override
public void area() {
System.out.println("Площадь квадрата " + a * a);
}
}
// Класс Main демонстрирует использование ссылок на интерфейс
public class Main {
public static void main(String[] args) {
Area s = new Square(5);
Area c = new Circle(10);
s.area();
c.area();
}
}
В результате работы данной программы получим:
Площадь квадрата 25
Площадь круга 314.1592653589793
В методе main() при объявлении переменной с указан тип Area, соответствующий имени интерфейса. Это означает, что в данной переменной может храниться ссылка на любой объект, реализующий Area. Переменная, ссылающаяся на интерфейс, имеет сведения только о методах, объявленных в этом интерфейсе. Таким образом, переменная с не может быть использована для доступа к переменным и методам, содержащимся в составе объекта, но не объявленным в интерфейсе.
Можно создать массив ссылок на интерфейс. Измененный класс Main показан в листинге 3.27.
Листинг 3.27
public class Main {
public static void main(String[] args) {
Area mas[] = new Area[4];
mas[0] = new Circle(5);
mas[1] = new Circle(10);
mas[2] = new Square(5);
mas[3] = new Square(10);
for (Area area : mas) {
area.area();
}
}
}
В результате работы данной программы получим:
Площадь круга 78.53981633974483
Площадь круга 314.1592653589793
Площадь квадрата 25
Площадь квадрата 100
3.16.4 Переменные в составе интерфейсов
Как было сказано ранее, в составе интерфейсов могут объявляться переменные, но они считаются public, static и final. На первый взгляд может показаться, что такие переменные найдут лишь ограниченное применение, но это не так. В больших программах часто используются константы, описывающие размеры Массивов, граничные значения, специальные наборы битов и многие другие величины. Поскольку для больших программ обычно создается несколько исходных файлов, нужен удобный способ, позволяющий обеспечить доступ к константам любого файла. В языке Java решить эту задачу помогают интерфейсы.
Для того чтобы определить набор разделяемых констант, надо лишь создать интерфейс, в котором не описывались бы методы, а только содержались требуемые константы. Каждый класс, которому нужны данные константы, должен "реализовать" интерфейс. В результате константы становятся доступными. Ниже приведен простой пример использования подобного подхода.
Листинг 3.28
// Интерфейс, определяющий константы
public interface ConstInterface {
public int MIN=0;
public int MAX=10;
public String ERROR=" Вы вышли за границы диапазона["+MIN+","+MAX+"]!";
}
//Демонстрация использования констант
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
int x = (int) (Math.random() * 20 - 5);
if (x < ConstInterface.MIN || x > ConstInterface.MAX) {
System.out.println("x = " + x + ConstInterface.ERROR);
} else {
System.out.println("x = " + x);
}
}
}
}
В результате работы данной программы получим:
x = -4 Вы вышли за границы диапазона[0,10]!
x = 10
x = 3
x = 9
x = 14 Вы вышли за границы диапазона[0,10]!
x = 6
x = -2 Вы вышли за границы диапазона[0,10]!
x = -1 Вы вышли за границы диапазона[0,10]!
x = 2
x = 4