- •Аннотация
- •Лекция 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. Контрольные вопросы
Класс RandomAccessFile |
Стр. 29 из 34 |
Можно и удалить файл - для этого предназначены методы delete и deleteOnExit. При вызове метода delete, файл будет удален сразу же, а при вызове deleteOnExit по окончании работы Java-машины(только при корректном завершении работы), при этом отменить запрос не является возможным.
Таким образом класс File дает возможность достаточно полного управления файловой системы.
5.2. Класс RandomAccessFile
Этот класс реализует сразу два интерфейса: DataInput и DataOutput и, соответственно, может производить и запись, и чтение всех примитивных типов Java. Эти операции записи и чтения, как следует из названия, производятся с файлами. При этом эти операции можно производить поочередно, вдобавок произвольным образом перемещаясь по файлу - вызовом метода seek(узнать текущее положение указателя в файле можно вызовом метода getFilePointer) .
При создании объекта этого класса конструктору в качестве параметров нужно передать два параметра: файл, и режим работы. Файл, с которым будет проводиться работа указывается либо с помощью String - название файла, либо объектом File ему соответствующим. Режим работы(mode) - представляет собой объект String, который принимает одно из значений: "r"(чтение) либо "rw"(чтение и запись). При этом, если передать, что mode равно "r" и указать несуществующий файл(либо директорию), будет брошено исключение FileNotFoundException. Если указать, что mode равно "rw" и указать несуществующий файл, он будет незамедлительно создан(или же брошено исключение FileNotFoundException если это невозможно осуществить).
После создания объекта RandomAccessFile, можно воспользоваться методами интерфейсов DataInput и DataOutput для проведения с файлом операций считывания и записи. По окончании работы с файлом, его следует закрыть, вызвав метод close.
6. Заключение
В данной главе Вы ознакомились с таким важным понятием, как потоки данных. Потоки являются очень эффективным способом решения задач по передаче и получению данных независимо от используемых устройств ввода/вывода. Как Вы теперь знаете, именно в пакете java.io содержатся стандартные классы, решающие задачи обмена данными через наиболее распространенные источники (и приемники) данных. Классы этого пакета эффективно решают задачу как широкого спектра источников и получателей данных, так и различных форматов передачи информации.
Были рассмотрены базовые классы байтовых потоков InputStream и OutputStream, а также символьных потоков Reader и Writer. Все классы потоков явным или неявным образом наследуются от этих классов. Были детально рассмотрены классы потоков, реализующих работу с различными источниками данных – массив байт, символьный массив, файл, pipe (“канал”), строки. Показано назначение и способы эффективного использования фильтров,
особое внимание уделено использованию BufferedInputStream и BufferedOutputStream,
указано, какие классы являются не рекомендованными к использованию. Показано как можно записать (считать) в поток (из потока) различные примитивные значения Java –
классы DataInputStream, DataOutputStream (а так же ObjectInputStream, ObjectOutputStream
Программирование на Java
Rendered by www.RenderX.com
Стр. 30 из 34 |
Контрольные вопросы |
и отдельно PrintWriter, BufferedReader). Особое внимание уделено описанию механизма сериализации. Показана возможность чтения данных из потоков с разбиением на токены
(слова) – класс StreamTokenizer.
Так же приведены и описаны классы для работы с файловой системой – классы File и RandomAccessFile.
7. Контрольные вопросы
15-1. Какие источники могут быть использованы классами стандартных входных потоков java в качестве источника данных? Какие могут быть использованы выходными потоками?
a.) Следующие ресурсы могут быть использованы стандартными потоками в качестве источников данных:
•Файл – представляется объектом класса File
•Массив – представляется массивом byte[] или char[]
•Строка – представляется объектом String
•Сетевое соединение – входной поток получается вызовом getInputStream() у объекта класса java.net.Socket
•“Pipe” – получаемые данные передаются из соединенного объекта
PipedOutputStream(PipedWriter)
Выходными потоками могут использоваться эти же самые ресурсы, кроме строк (String). Также, понятно, для сетевого соединения существует различие в получении выходного потока: производится вызовом getOutputStream() у объекта класса Socket.
15-2. Имея два объекта класса File, каким образом будет наиболее корректно узнать, указывают ли они на одну и ту же директорию (и на директорию ли)? Возможно ли только с помощью этих двух объектов удалить директорию? Если да, то как изменится содержимое другого объекта (если они действительно указывают на одну и туже директорию)?
a.) Вызов метода equals() объекта File приведет к лексикографическому сравнению пути файлов. То есть будут сравниваться строки, по которым был создан объект File. Правильным является привести оба объекта к каноническому виду (методы getCanonicalPath() или getCanonicalFile()) и
сравнить эти представления. Проверить, указывает ли объект File на директорию, можно вызовом метода isDirectory(). Удалить файл (равно и директорию) можно вызовом метода delete() у объекта File. При этом директория будет удалена только в том случае, если в ней не содержится ни одног³о файл»а или директории. Если объект File указывает на несуществующий файл, то вызов его метода exist() вернет значение false
– указывающее, что файл не существует на диске. Именно это и произойдет, если директория, на которую указывает некоторый объект File, будет удалена вызовом delete() через другую ссылку File.
Программирование на Java
Rendered by www.RenderX.com
Стр. 31 из 34
15-3. От какого класса наследуются InputStream и OutputStream? Остальные классы потоков ввода/вывода?
a.) Все входные байтовые потоки наследуются(явно или неявно) от InputStream, а все выходные от OutputStream. Сами же абстрактные классы
InputStream и OutputStream унаследованы от Object.
15-4. Если вызвать write(0x01234567) у экземпляра OutputStream, в каком порядке и какие байты будут записаны в выходной поток?
a.) Притом, что метод write() класса OutputStream принимает в качестве параметра значение int, на самом деле в поток будет записан только младший байт – в данном случае 0x67, то есть 16*6+7=103.
15-5. При каких условиях следующий метод вернет значение false?
public static boolean test(InputStream is) throws IOException { int value = is.read();
return value == (value & 0xff);
}
a.) Выражение value == (value & 0xff) принимает значение true только в случае, если в двоичном представлении значение value содержит единицы только в младшем байте (значение 0xff имеет тип int и равно 255, но не –1). Такой результат будет получен в том случае, если считывание из потока произведено корректно – не был достигнут конец потока, и не было брошено исключение IOException.
15-6. Какие классы предоставляют методы для записи в поток двоичного представления значений примитивных типов Java?
a.) Для записи значений примитивных типов Java, предназначен интерфейс DataOutput. В пакете java.io этот интерфейс реализует класс DataOutputStream. Так же, неявно этот интерфейс реализован классом ObjectOutputStream – этот класс реализует интерфейс ObjectOutput, который расширяет интерфейс DataOutput.
15-7. Если необходимо записать (и после считать) несколько строк в файл (из файла), в каком порядке и какие следует настроить фильтры (и для чтения, и для записи)? Какие из них можно пропустить?
a.) Наиболее распространенным способом является следующая последовательность:
new PrintWriter(new BufferedWriter(new FileWriter("file.txt")))
для записи, и, соответственно, для чтения:
new BufferedReader(new FileReader("file.txt"))
При этом BufferedWriter может быть опущен – он нужен только для обеспечения лучшей производительности путем буферизации (если требуется записать лишь несколько строк, этот класс может быть
Программирование на Java
Rendered by www.RenderX.com
Стр. 32 из 34 |
Контрольные вопросы |
действительно лишним). Так же, записать строки можно при желании и используя только лишь FileWriter, а считать - используя FileReader, хотя для удобства желательно воспользоваться классами PrintWriter и BufferedReader (или LineNumberReader – в зависимости от задач).
15-8. Что произойдет при попытке к одному объекту PipedWriter присоединить несколько различных объектов PipedReader? Что произойдет, если несколько раз подряд присоединять один и тот же PipedReader?
a.) К одному объекту PipedWriter может быть присоединен только один объект PipedReader. При попытке присоединить более одного PipedReader, будет брошено исключение new IOException("Already connected") . Это же исключение будет брошено, если подключать более одного раза один и тот же объект PipedReader – метод connect() реализован таким образом,
что исключение new IOException("Already connected") будет брошено при попытке вызвать этот метод, когда либо сам объект PipedWriter либо переданный объект PipedReader уже подключен к некоторому объекту
PipedWriter.
15-9. Значения каких примитивных типов Java могут быть переданы в качестве параметров методу write() класса Writer? Методу print() класса PrintWriter?
a.) В классе Writer метод write() является перегруженным и определен со следующими параметрами:
•write(char cbuf[])
•write(char cbuf[], int off, int len)
•write(int c)
•write(String str)
•write(String str, int off, int len)
То есть, из примитивных типов может быть передан только int (в случае вызова с передачей byte, char или short – будет произведено приведение к int).
Метод print() класса PrintWriter определен со всеми примитивными типами
Java (а так же Object и String).
15-10. Какая кодировка используется классом OutputStreamWriter по умолчанию?
a.) Используемая кодировка зависит от системы, где запущена Java-машина.
15-11. Что будет записано в поток, если вызвать метод print() класса PrintWriter, передав в качестве параметра new File(“d:\\word.txt”) ?
a.) При таком вызове будет вызван метод print(Object obj) и, соответственно, в поток будет записано значение String.valueOf(obj). В свою очередь метод valueOf(Object obj) класса String определен таким образом, что в случае, если переданный объект не равен null, то будет возвращено значение obj.toString() . В данном случае, для объекта File, это будет значение, возвращаемое его методом getPath(), то есть строка, переданная в конструктор – “d:\\word.txt”.
Программирование на Java
Rendered by www.RenderX.com
Стр. 33 из 34
15-12. Какие значения могут быть переданы в конструктор RandomAccessFile для указания режима доступа (чтение/запись)?
a.) Оба конструктора класса RandomAccessFile принимают объект String, указывающий режим доступа к файлу. Значение этой строки может принимать только одно из двух значений – либо “r”(чтение) либо “rw”(чтение и запись). В любом другом случае будет брошено исключение new IllegalArgumentException("mode must be r or rw") (в случае, если переданная строка является null, будет брошено исключение NullPointerException).
15-13. Какое значение следует передать методу seek() объекта RandomAccessFile, чтобы последний байт файла был считан одиночным вызовом read()?
a.) Узнать длину файла, на который указывает объект RandomAccessFile, можно вызовом метода length(). Что бы считать первый байт файла, следует вызвать seek() передав значение 0. соответственно, что бы считать последний байт, нужно методу seek() передать значение randomAccess- File.length()-1 .
15-14. Какие методы объявлены в интерфейсе Serializable?
a.) В интерфейсе java.io.Serializable не объявлено ни одного метода. Классы реализуют этот интерфейс, что бы указать, что объекты этого класса разрешены к сериализации.
15-15. Что произойдет, если записать в файл, используя ObjectOutputStream, значения типов long, int, byte именно в таком порядке, а считать в обратном, используя
DataInputStream?
a.) DataInputStream запишет в поток байтовые представления long, int и byte, то есть сначала будут записаны 8 байт, образующие long, потом 4 байта, образующие int, и, наконец, еще один байт. При считывании, будут произведены обратные действия, то есть: для считывания byte будет считан один байт, для считывания int будут считаны следующие 4 байт и для считывания long будут считаны последние 8 байт. Понятно, что в случае, когда считывание производится не в том порядке, в каком была произведена запись, как в данном случае – чтение будет произведено успешно, но полученные значения byte, int и long могут (точнее - будут) отличаться от тех, которые были записаны.
Программирование на Java
Rendered by www.RenderX.com
Программирование на Java ()
Программирование на Java
Rendered by www.RenderX.com