- •Аннотация
- •Лекция 1. Что такое Java? История создания.
- •1. Что такое Java?
- •2. История создания Java
- •2.1. Сложности внутри Sun Microsystems
- •2.2. Проект Green
- •2.3. Компания FirstPerson
- •2.4. World Wide Web
- •2.5. Возрождение Oak
- •2.6. Java выходит в свет
- •3. История развития Java
- •3.1. Браузеры
- •3.2. Сетевые компьютеры
- •3.3. Платформа Java
- •4. Заключение
- •5. Контрольные вопросы
- •Аннотация
- •1. Основы объектно-ориентированного программирования
- •1.1. Методология процедурно-ориентированного программирования
- •1.2. Методология объектно-ориентированного программирования
- •1.3. Объекты
- •1.3.1. Состояние.
- •1.3.2. Поведение
- •1.3.3. Уникальность
- •1.4. Классы
- •1.4.1. Инкапсуляция
- •1.4.2. Полиморфизм
- •1.5. Типы отношений между классами
- •1.5.1. Агрегация
- •1.5.2. Ассоциация
- •1.5.3. Наследование
- •1.5.4. Метаклассы
- •1.6. Достоинства ООП
- •1.7. Недостатки ООП
- •1.8. Заключение
- •1.9. Контрольные вопросы
- •Аннотация
- •Лекция 3. Лексика языка
- •1. Лексика языка
- •1.1. Кодировка
- •1.2. Анализ программы
- •1.2.1. Пробелы
- •1.2.2. Комментарии
- •1.2.3. Лексемы
- •1.3. Виды лексем
- •1.3.1. Идентификаторы
- •1.3.2. Ключевые слова
- •1.3.3. Литералы
- •1.3.3.1. Целочисленные литералы
- •1.3.3.2. Дробные литералы
- •1.3.3.3. Логические литералы
- •1.3.3.4. Символьные литералы
- •1.3.3.5. Строковые литералы
- •1.3.3.6. Null литерал
- •1.3.3.7. Разделители
- •1.3.3.8. Операторы
- •1.3.3.9. Заключение
- •1.4. Дополнение: Работа с операторами
- •1.4.1. Операторы присваивания и сравнения
- •1.4.2. Арифметические операции
- •1.4.3. Логические операторы
- •1.4.4. Битовые операции
- •1.5. Заключение
- •1.6. Контрольные вопросы
- •Аннотация
- •Лекция 4. Типы данных
- •1. Введение
- •2. Переменные
- •3. Примитивные и ссылочные типы данных
- •3.1. Примитивные типы
- •3.2. Целочисленные типы
- •4. Дробные типы
- •5. Булевский тип
- •6. Ссылочные типы
- •6.1. Объекты и правила работы с ними
- •6.2. Класс Object
- •6.3. Класс String
- •6.4. Класс Class
- •7. Заключение
- •8. Заключение
- •9. Контрольные вопросы
- •Аннотация
- •Лекция 5. Имена. Пакеты
- •1. Введение
- •2. Имена
- •2.1. Простые и составные имена. Элементы.
- •2.2. Имена и идентификаторы
- •2.3. Область видимости (введение)
- •3. Пакеты
- •3.1. Элементы пакета
- •3.2. Платформенная поддержка пакетов
- •3.3. Модуль компиляции
- •3.3.1. Объявление пакета
- •3.3.2. Импорт-выражения
- •3.3.3. Объявление верхнего уровня
- •3.4. Уникальность имен пакетов
- •4. Область видимости имен
- •4.1. "Затеняющее" объявление (Shadowing)
- •4.2. "Заслоняющее" объявление (Obscuring)
- •5. Соглашения по именованию
- •6. Заключение
- •7. Контрольные вопросы
- •Аннотация
- •Лекция 6. Объявление классов
- •1. Введение
- •2. Модификаторы доступа
- •2.1. Предназначение модификаторов доступа
- •2.2. Разграничение доступа в Java
- •3. Объявление классов
- •3.1. Заголовок класса
- •3.2. Тело класса
- •3.3. Объявление полей
- •3.4. Объявление методов
- •3.5. Объявление конструкторов
- •3.6. Инициализаторы
- •4. Дополнительные свойства классов
- •4.1. Метод main
- •4.2. Параметры методов
- •4.3. Перегруженные методы
- •5. Заключение
- •6. Контрольные вопросы
- •Аннотация
- •Лекция 7. Преобразование типов
- •1. Введение
- •2. Виды приведений
- •2.1. Тождественное преобразование
- •2.2. Преобразование примитивных типов (расширение и сужение)
- •2.3. Преобразование ссылочных типов (расширение и сужение)
- •2.4. Преобразование к строке
- •2.5. Запрещенные преобразования
- •3. Применение приведений
- •3.1. Присвоение значений
- •3.2. Вызов метода
- •3.3. Явное приведение
- •3.4. Оператор конкатенации строк
- •3.5. Числовое расширение
- •3.5.1. Унарное числовое расширение
- •3.5.2. Бинарное числовое расширение
- •4. Тип переменной и тип ее значения
- •5. Заключение
- •6. Контрольные вопросы
- •Аннотация
- •1. Введение
- •2. Статические элементы
- •3. Ключевые слова this и super
- •4. Ключевое слово abstract
- •5. Интерфейсы
- •5.1. Объявление интерфейсов
- •5.2. Реализация интерфейса
- •5.3. Применение интерфейсов
- •6. Полиморфизм
- •6.1. Поля
- •6.2. Методы
- •6.3. Полиморфизм и объекты
- •7. Заключение
- •8. Контрольные вопросы
- •Аннотация
- •Лекция 9. Массивы
- •1. Введение
- •2. Массивы, как тип данных в Java
- •2.1. Объявление массивов
- •2.2. Инициализация массивов
- •2.3. Многомерные массивы
- •2.4. Класс массива
- •3. Преобразование типов для массивов
- •3.1. Ошибка ArrayStoreException
- •3.2. Переменные типа массив, и их значения
- •4. Клонирование
- •4.1. Клонирование массивов
- •5. Заключение
- •6. Контрольные вопросы
- •Аннотация
- •Лекция 10. Операторы и структура кода
- •1. Управление ходом программы
- •2. Нормальное и прерванное выполнение операторов
- •3. Блоки и локальные переменные
- •4. Пустой оператор
- •5. Метки
- •6. Оператор if
- •7. Оператор switch
- •8. Управление циклами
- •8.1. Цикл while
- •8.2. Цикл do
- •8.3. Цикл for
- •9. Операторы break и continue
- •9.1. Оператор continue
- •9.2. Оператор break
- •10. Именованные блоки
- •11. Оператор return
- •12. Оператор synchronized
- •13.1. Причины возникновения ошибок
- •13.2. Обработка исключительных ситуаций
- •13.2.1. Конструкция try-catch
- •13.2.2. Конструкция try-catch-finally
- •13.3. Использование оператора throw
- •13.4. Обрабатываемые и необрабатываемые исключения
- •13.5. Создание пользовательских классов исключений
- •13.6. Переопределение методов и исключения
- •13.7. Особые случаи
- •14. Заключение
- •15. Контрольные вопросы
- •Аннотация
- •Лекция 11. Пакет java.awt
- •1. Введение
- •2. Апплеты
- •2.1. Тег HTML <Applet>
- •2.2. Передача параметров
- •2.3. Контекст апплета
- •2.4. Отладочная печать
- •2.5. Порядок инициализации апплета
- •2.6. Перерисовка
- •2.7. Задание размеров графических изображений
- •2.8. Простые методы класса Graphics
- •2.9. Цвет
- •2.9.1. Методы класса Color
- •2.10. Шрифты
- •2.10.1. Использование шрифтов
- •2.10.2. Позиционирование и шрифты: FontMetrics
- •2.10.3. Использование FontMetrics
- •2.10.4. Центрирование текста
- •3. Базовые классы
- •4. Основные компоненты
- •5. Менеджеры компоновки
- •6. Окна
- •7. Меню
- •8. Обработка событий
- •8.1. Рисование "каракулей" в Java
- •8.2. Рисование "каракулей" с использованием встроенных классов
- •9. Заключение
- •10. Контрольные вопросы
- •Аннотация
- •Лекция 12. Потоки выполнения. Синхронизация
- •1. Введение
- •2. Многопоточная архитектура
- •3. Базовые классы для работы с потоками
- •3.1. Класс Thread
- •3.2. Интерфейс Runnable
- •3.3. Работа с приоритетами
- •3.4. Демон-потоки
- •4. Синхронизация
- •4.1. Хранение переменных в памяти
- •4.2. Модификатор volatile
- •4.3. Блокировки
- •5. Методы wait(), notify(), notifyAll() класса Object
- •6. Контрольные вопросы
- •Аннотация
- •Лекция 13. Пакет java.lang.
- •1. Введение
- •2. Object
- •3. Class
- •4. Wrapper Classes
- •4.1. Integer
- •4.2. Character
- •4.3. Boolean
- •4.4. Void
- •5. Math
- •6. Строки
- •6.1. String
- •6.2. StringBuffer
- •7. Системные классы
- •7.1. ClassLoader
- •7.2. SecurityManager - менеджер безопасности
- •7.3. System
- •7.4. Runtime
- •7.5. Process
- •8. Потоки исполнения
- •8.1. Runnable
- •8.2. Thread
- •8.3. ThreadGroup
- •9. Исключения
- •10. Заключение
- •11. Контрольные вопросы
- •Аннотация
- •Лекция 14. Пакет java.util
- •1. Введение
- •2. Работа с датами и временем
- •2.1. Класс Date
- •2.2. Классы Calendar и GregorianCalendar
- •2.3. Класс TimeZone
- •2.4. Класс SimpleTimeZone
- •3. Интерфейс Observer и класс Observable
- •4. Коллекции
- •4.1. Интерфейсы
- •4.1.1. Интерфейс Collection
- •4.1.2. Интерфейс Set
- •4.1.3. Интерфейс List
- •4.1.4. Интерфейс Map
- •4.1.5. Интерфейс SortedSet
- •4.1.6. Интерфейс SortedMap
- •4.1.7. Интерфейс Iterator
- •4.2. Aбстрактные классы используемые при работе с коллекциями.
- •4.3. Конкретные классы коллекций
- •4.4. Класс Collections
- •5. Класс Properties
- •6. Интерфейс Comparator
- •7. Класс Arrays
- •8. Класс StringTokenizer
- •9. Класс BitSet
- •10. Класс Random
- •11. Локализация
- •11.1. Класс Locale
- •11.2. Класс ResourceBundle
- •12. Заключение
- •13. Контрольные вопросы
- •Аннотация
- •Лекция 15. Пакет java.io
- •1. Система ввода/вывода. Потоки данных (stream)
- •1.1. Классы InputStream и OutputStream
- •1.2. Классы-реализации потоков данных
- •1.2.1. Классы ByteArrayInputStream и ByteArrayOutputStream
- •1.2.2. Классы FileInputStream и FileOutputStream
- •1.2.3. PipedInputStream и PipedOutputStream
- •1.2.4. StringBufferInputStream
- •1.2.5. SequenceInputStream
- •1.3. Классы FilterInputStreeam и FilterOutputStream. Их наследники.
- •1.3.1. BufferedInputStream и BufferedOutputStream
- •1.3.2. LineNumberInputStream
- •1.3.3. PushBackInputStream
- •1.3.4. PrintStream
- •1.3.5. DataInputStream и DataOutputStream
- •2. Serialization
- •2.1. Версии классов
- •3. Классы Reader и Writer. Их наследники.
- •4. Класс StreamTokenizer
- •5. Работа с файловой системой.
- •5.1. Класс File
- •5.2. Класс RandomAccessFile
- •6. Заключение
- •7. Контрольные вопросы
- •Аннотация
- •Лекция 16. Введение в сетевые протоколы
- •1. Основы модели OSI
- •2. Physical layer (layer 1)
- •3. Data layer (layer 2)
- •3.1. LLC sublayer.
- •3.2. MAC sublayer.
- •4. Network layer (layer 3)
- •4.1. Class A
- •4.2. Class B
- •4.3. Class CClass DClass E
- •5. Transport layer (layer 4)
- •6. Session layer (layer 5)
- •7. Presentation layer (layer 6)
- •8. Application layer (layer 7)
- •9. Утилиты для работы с сетью
- •9.1. IPCONFIG (IFCONFIG)
- •9.3. Ping
- •9.4. Traceroute
- •9.5. Route
- •9.6. Netstat
- •9.7. Задания для практического занятия
- •10. Пакет java.net
- •11. Заключение
- •12. Контрольные вопросы
Стр. 1 из 33
Лекция 13. Пакет java.lang.
Содержание лекции. |
|
|
1. |
Введение......................................................................................................................... |
2 |
2. |
Object............................................................................................................................... |
3 |
3. |
Class................................................................................................................................. |
7 |
4. |
Wrapper Classes.............................................................................................................. |
9 |
|
4.1. Integer.......................................................................................................................... |
10 |
|
4.2. Character...................................................................................................................... |
12 |
|
4.3. Boolean........................................................................................................................ |
13 |
|
4.4. Void.............................................................................................................................. |
13 |
5. |
Math................................................................................................................................ |
13 |
6. |
Строки............................................................................................................................ |
15 |
|
6.1. String............................................................................................................................ |
15 |
|
6.2. StringBuffer.................................................................................................................. |
18 |
7. |
Системные классы........................................................................................................ |
20 |
|
7.1. ClassLoader................................................................................................................. |
21 |
|
7.2. SecurityManager - менеджер безопасности.............................................................. |
22 |
|
7.3. System......................................................................................................................... |
23 |
|
7.4. Runtime........................................................................................................................ |
24 |
|
7.5. Process........................................................................................................................ |
24 |
8. |
Потоки исполнения....................................................................................................... |
25 |
|
8.1. Runnable ..................................................................................................................... |
25 |
|
8.2. Thread ......................................................................................................................... |
25 |
|
8.3. ThreadGroup................................................................................................................ |
28 |
9. |
Исключения................................................................................................................... |
28 |
10. Заключение................................................................................................................. |
28 |
|
11. Контрольные вопросы................................................................................................ |
29 |
Программирование на Java
Rendered by www.RenderX.com
Стр. 2 из 33 |
Введение |
1. Введение
В состав пакета java.lang входят классы, составляющие основу для всех других - из-за чего он является наиболее важным из всех, входящих в Java API. Каждый класс в Java неявным образом (по умолчанию) импортирует все классы этого пакета - можно не писать import java.lang.*;.
Основу пакета составляют классы:
Object - является корневым в иерархии классов. Если при описании класса не указывается родительский, то им считается класс Object. Все объекты, включая массивы, наследуются от этого класса.
Class - экземпляры этого класса представляют классы и интерфейсы в запущенной Javaпрограмме.
String - представляет средства работы с символьными строками
StringBuffer - используется для работы (создания) строк
Number - абстрактный класс, являющийся суперклассом для классов-объектных оберток числовых примитивных типов Java
Character - объектная обертка для типа char
Booleanобъектная обертка для типа boolean
Math - реализует ряд наиболее известных математических функций
Throwable - базовый класс для объектов, представляющих исключения. Любое исключение, которое может быть брошено и, соответственно, перехвачено блоком catch, должно быть унаследовано от Throwable
Thread - представляет вычислительный поток в Java. Виртуальная машина Java позволяет одновременно выполнять несколько потоков
ThreadGroup - позволяет объединять потоки в группу, и производить действия сразу над всеми потоками в ней. Сущствуют ограничения по безопасности на манипуляции с потоками из других групп. операции над потоком могут проводиться только потоком, относящимся к той же группе.
System - содержит полезные поля и методы для работы системного уровня
Runtime - позволяет приложению взаимодействовать с окружением в котором оно запущено
Process - представляет внешнюю программу, запущенную при помощи Runtime
ClassLoader - отвечает за загрузку классов
SecurityManager - для обеспечения безопасности накладывает ограничения на данную среду выполнения программ
Compiler - используется для поддержки Just-in-Time компиляторов
Интерфейсы:
Cloneable - должен быть реализован объектами, которые планируется клонировать с помощью средств JVM (Object.clone())
Программирование на Java
Rendered by www.RenderX.com
Стр. 3 из 33
Runnable - может использоваться в сочетании с классом Thread, позволяя реализовать метод run(), котрый будет вызван при старте данного потока.
Comparable - позволяет упорядочивать (сортировать, сравнивать) объекты каждого класса, реализующего этот интерфейс.
2. Object
Класс Object является базовым для всех остальных классов. Он определяет методы, которые поддерживаются любым классом в Java.
Это методы:
1.0) public boolean equals(Object obj) - определяет, являются ли объекты одинаковыми. Если оператор == определяет равенство именно объектных ссылок, то метод equals() определяет, содержат ли объекты одинаковую информацию. Реализация этого метода в классе Object такова, что значение true будет возвращено тогда и только тогда, если объектные ссылки переданного объекта и объекта, у которого вызывается метод совпадают, то есть:
public boolean equals(Object obj) { return (this == obj);
}
В классах - наследниках, этот метод при необходимости может быть переопределен, что бы отражать действительное равенство объектов. Например, сравнение объектов-оберток целых чисел (класс Integer), должно по всей логике возвращать значение true, если равны значения int чисел, которые обернуты, даже если различаются объектные ссылки на сами объекты класса-обертки Integer.
Метод equals() может быть переопределен любым способом (например, всегда возвращает false, или, наоборот, - true) - компилятор, конечно же, не будет проводить анализ реализации и давать рекомендации, НО: реализация метода предполагается с учетом следующих правил:
1.рефлексивность: для любой объектной ссылки x, вызов x.equals(x) возвращает true
2.симметричность: для любых объектных ссылок x и y, вызов x.equals(y) возвращает true тогда и только тогда, если вызов y.equals(x) возвращает true
3.транзитивность: для любых объектных ссылок x, y и z, если x.equals(y) возвращает true и y.equals(z) возвращает true, тогда вызов x.equals(z) должен вернуть true
4.непротиворечивость: для любых объектных ссылок x и y, многократные последовательные вызовы x.equals(y) возвращают одно и то же значение (либо всегда true либо всегда false)
5.для любой не равной null объектной ссылки x, вызов x.equals(null) должен вернуть значение false
Пример:
package demo.lang;
Программирование на Java
Rendered by www.RenderX.com
Стр. 4 из 33 |
Object |
public class Rectangle { public int sideA; public int sideB;
public Rectangle(int x, int y) { super();
sideA = x; sideB = y;
}
public boolean equals(Object obj) {
if(!(obj instanceof Rectangle)) return false; Rectangle ref = (Rectangle)obj;
return (((this.sideA==ref.sideA)&&(this.sideB==ref.sideB))||
(this.sideA==ref.sideB)&&(this.sideB==ref.sideA));
}
public static void main(String[] args) { Rectangle r1 = new Rectangle(10,20); Rectangle r2 = new Rectangle(10,10); Rectangle r3 = new Rectangle(20,10);
System.out.println("r1.equals(r1) == " + r1.equals(r1)); System.out.println("r1.equals(r2) == " + r1.equals(r2)); System.out.println("r1.equals(r3) == " + r1.equals(r3)); System.out.println("r2.equals(r3) == " + r2.equals(r3)); System.out.println("r1.equals(null) == " + r1.equals(null));
}
}
Запуск этой программы, очевидно, приведет к выводу на экран следующего:
r1.equals(r1) == true r1.equals(r2) == false r1.equals(r3) == true r2.equals(r3) == false r1.equals(null) == false
В этом примере метод equals() у класса Retangle был переопределен таким образом, что бы прямоугольники были равны, если их можно наложить друг на друга (геометрическое равенство).
1.1) public int hashCode() - возвращает хеш-код (hash code) для объекта. Хеш-код - это целое число, которое с очень большой вероятностью является уникальным для данного объекта. Это значение используется классом Hashtable для хранения с возможностью быстрой выборки объектов(хеш-код используется для группировки объектов, и при поиске объекта достаточно просмотреть только блок, соответствующий его хеш-коду)
Обычно вполне можно пользоваться стандартной реализацией, но если же будет принято решение изменить метод вычисления хеш-кода, то необходимо убедиться, что в этом случае будет возвращаться одно и то же значение для равных между собой объектов. То есть, если x.equals(y) возвращает true, то хеш-коды x и y должны совпадать, то есть вызовы
Программирование на Java
Rendered by www.RenderX.com
Стр. 5 из 33
x.hashCode() и y.hashCode() должны возвращать одно и то же значение. В противном случае Hashtable будет считать объекты различными, не вызывая метод equals()
Формально правила, которым должна следовать реализация метода, формулируется следующим образом:
a)в одном запуске программы, для одного объекта, при вызове метода hashCode(), должно возвращаться одно и то же int значение, если между этими вызовами НЕ были затронуты данные, используемые для проверки объектов на идентичность в методе equals(). Это число НЕ обязано быть одним и тем же при повторном запуске той же программы, даже если все данные будут идентичны
b)если два объекта идентичны, то есть вызов метода equals(Object) возвращает true, тогда вызов метода hashCode() у каждого из этих двух объектов должен возвращать одно и то же значение
c)если два объекта различны, то есть вызов метода equals(Object) возвращает false, тогда различие их хеш-кодов желательно, но НЕ обязательно. Различие в хеш-кодах для НЕ идентичных объектов нужно только для обеспечения хорошей производительности при использовании этих объектов в хеш-таблицах.
В классе Object реализация метода hashCode() использует для получения результата преобразование внутреннего адреса объекта в памяти, поэтому если не перекрывать эту реализацию, то для разных объектов будут возвращены различные значения.
1.2) public String toString() - возвращает строковое представление объекта. В классе Object этот метод реализован следующим образом:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
То есть возвращает строку, содержащую название класса объекта и его хеш-код.
В классах-наследниках этот метод может быть переопределен для получения более наглядного пользовательского представления объекта. Обычно это значения некоторых полей, характеризующих экземпляр. Например, для книги это может быть название, автор и количество страниц:
package demo.lang;
public class Book { private String title; private String author; private int pagesNumber;
public Book(String title, String author, int pagesNumber) { super();
this.title = title; this.author = author; this.pagesNumber = pagesNumber;
}
public static void main(String[] args) {
Программирование на Java
Rendered by www.RenderX.com
Стр. 6 из 33 |
Object |
Book book = new Book("Java2", "Sun", 1000); System.out.println("object is: " + book);
}
public String toString(){
return "Book: " + title + " ( " + author + ", " + pagesNumber + " pages )";
}
}
При запуске этой программы, на экран будет выведено следующее:
object is: Book: Java2 ( Sun, 1000 pages )
То есть, для получения строкового представления объекта book, был вызван его метод toString() (оператор "+" определен для строк таким образом, что все операнды будут сначала приведены к String, для объектов в этом случае вызывается метод toString()).
1.3) wait(), notify(), notifyAll() - эти методы используются для поддержки многопоточности. Они определены с атрибутом final и НЕ могут быть переопределены в классах-наследниках.
1.4) protected void finalize() throws Throwable - этот метод вызывается Java-машиной перед тем, как garbage collection (сборщик мусора) очистит память, занимаемую объектом. Работа сборщика мусора и описание схемы, по которой производится вызов метода finaliuze() приведено в соответствующей главе. Здесь же ограничимся только напоминанием, что объект считается пригодным для сборщика мусора, когда выполняющейся части программы не будет доступно ни одной ссылки на объект. Перед очисткой занимаемой объектом памяти, будет произведен вызов его метода finalize().
Реализация этого метода в классе Object - не производит никаких действий. В классахнаследниках этот метод может быть переопределен для проведения всех необходимых действий по освобождению различных занимаемых ресурсов - закрытия сетевых соединений, файлов и т.д.
1.5) protected native Object clone() throws CloneNotSupportedException - создает копию объекта. Для того, что бы им можно было воспользоваться, объект должен реализовывать интерфейс Cloneable. Этот интерфейс не определяет никаких методов, определение, что класс его реализует - только символизирует, что можно создавать копии объектов этого класса. В классе Object метод clone() реализован таким образом, что будут скопированы только базовые типы и ссылки на объекты. Если же потребуется "глубокое " копирование, то есть скопировать не только ссылки на объекты, но и создать копии объектов - в классахнаследниках метод clone() можно переопределить.
Например, в следующем примере:
package demo.lang;
public class BookStorage implements Cloneable{ public Book[] books;
public BookStorage() { books = new Book[2];
books[0] = new Book("Essential java", "Sun", 500); books[1] = new Book("Professional Java", "Sun", 1000);
}
}
Программирование на Java
Rendered by www.RenderX.com