- •Аннотация
- •Лекция 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. Контрольные вопросы
Стр. 16 из 21 |
Заключение |
System.out.println(b[0][0]);
}
Разберем, что будет происходить в этих двух вариантах. Начнем с того, что в первой строке создается двухмерный массив, состоящий из 2 одномерных, итого 3 объекта. Затем, на следующей строке при клонировании будет создан новый двухмерный массив, содержащий ссылки на те же самые одномерные массивы.
Теперь несложно предсказать результат обоих вариантов. В первом случае в исходном массиве меняется ссылка, хранящаяся в первом элементе, что не принесет никаких изменений для клонированного объекта. На консоли появится 1.
Во втором случае модифицируется существующий массив, что скажется на обоих двумерных массивах. На консоли появится 0.
Обратите внимание, что если из примера убрать условие if-else, так, чтобы отрабатывал первый вариант, а затем последовательно второй, то результатом будет опять 1, поскольку в части второго варианта модифицироваться будет уже новый массив, порожденный в части первого варианта.
Таким образом, в Java предоставляется мощный, эффективный и гибкий механизм клонирования, который легко применять и модифицировать под конкретные нужды. Особенное внимание должно лишь уделяться копированию объектных полей, которые по умолчанию копируются только по ссылке.
5. Заключение
В этой главе были рассмотрено устройство массивов в Java. Подобно массивам в других языках, они представляют собой набор значений одного типа. Основным свойством массива является длина, которая в Java может равняться нулю. В противном случае, массив обладает элементами в количестве, равном длине, к которым можно обратиться, используя индекс, изменяющийся от 0 до величины длины без единицы. Длина задается при создании массива, и не может быть изменена у созданного массива. Однако, она не входит в определение типа, а потому одна переменная может ссылаться на массивы одного типа с различной длиной.
Создать массив можно как с помощью ключевого слова new, поскольку все массивы, включая определенные на основе примитивных значений, имеют объектный тип. Другой способ – воспользоваться инициализатором, и перечислить значения всех элементов. В первом случае элементы принимают значения по умолчанию (0, false, null).
Особым образом в Java устроены многомерные мас сивы. Они, по сути, являются одномерными, основанными на массивах меньшей размерности. Такой подход позволяет единым образом работать с многомерными массивами. Также он позволяет создавать не только «прямоугольные» массивы, но и любой конфигурации.
Хотя массив и является ссылочным типом, работа с ним зачастую имеет некоторые особенности. Рассматриваются правила приведения типа массива. Как для любого объектного типа, приведение к Object является расширяющим. Приведение массивов, основанных на ссылочных типах, во многом подчиняется обычным правилам. А вот примитивные массивы преобразовывать нельзя. С преобразованиями связано и
Программирование на Java
Rendered by www.RenderX.com
Стр. 17 из 21
возникновение ошибки ArrayStoreException, причина которой – невозможность точного отслеживания типов в преобразованном массиве для компилятора.
В заключение рассматриваются последние случаи взаимосвязи типа переменной и ее значения.
Наконец, изучается механизм клонирования, существующий с самых первых версий Java и позволяющий создавать точные копии объектов, если их классы позволяют это, реализую интерфейс Cloneable. Поскольку стандартное клонирование порождает строго один новый объект, это приводит к особым эффектам при работе с объектными полями классов и массивами.
6. Контрольные вопросы
9-1. Массивы каких типов и длин объявляются в следующем коде?
int x[], y[][]; byte[] a, b[][];
String s, s1[], s2={{}, {“a”, “b”}, null};
a.) Ответ:
•переменная x имеет тип int[], y – int[][]. Поскольку массивы не созданы, длины у них нет.
•переменная a имеет тип byte[], b – byte[][][]. Поскольку массивы не созданы, длины у них нет.
•Переменная s не массив, s1 – String[], s2 – String[][]. Длина определена только у s2, она равна 3. Первым элементом этого двухмерного массива является одномерный массив длиной 0, вторым – массив длиной 2, третьим - null.
9-2. Корректен ли следующий код, и если нет, то в каких местах будут возникать ошибки, и какие?
int b[]=new int[5];
for (int i=1; i<=b.length(); i++) { b[i]=Math.sqrt(i);
}
a.) Код некорректен, в нем есть целый ряд ошибок. Во-первых, у массивов нет метода length(), есть только поле length. Во-вторых, в 3-ей строке делается попытка неявного приведения от типа double к int – результат работы метода Math.sqrt приравнивается целочисленной переменной.
Далее, во время исполнения программы будет возникать ошибка некорректного индекса массива. Если применить правильный способ получения длины массива, то на последней итерации цикла будет произведена попытка обратиться к элементу массива с индексом 5, в то
Программирование на Java
Rendered by www.RenderX.com
Стр. 18 из 21 |
Контрольные вопросы |
время как максимально допустимым является значение длины без единицы, то есть 4.
Наконец, перебор массива, начиная с индекса 1, пропускает элемент с индексом 0.
9-3. Может ли массив основываться на абстрактных классах? Интерфейсах? Если да, то какие значение могут принимать его элементы?
a.) Да. Элементы таких массивов будут ссылаться на объекты, порожденные от неабстрактных классов, которые являются наследниками данного абстрактного класса или реализуют данный интерфейс соответственно.
9-4. Как создать массив, эквивалентный объявляемому ниже, но без заведения переменной?
int x[][]=new int[2][3];
a.) Следующим образом:
new int[][]{{0, 0, 0}, {0, 0, 0}}
9-5. Корректен ли следующий код? Если нет, то какие исправления можно предложить?
byte b[]={1, 2, 3}; Object o=b;
o=new String[]{“”, “a”, “b”}; String s[]=o;
a.) Нет. В 4 строке делается попытка неявного сужения типов от Object к String[]. Такое действие нужно делать явно:
String s[]=(String[])o;
9-6. Сколько объектов порождается при инициализации массива new int[3][4]? new int[3][][]?
a.) В первом случае создается 3 одномерных массива длиной 4 и один двумерный массив, то есть всего 4 объекта.
Во втором случае создается только 1 трехмерный массив, все элементы которого null, то есть 1 объект.
9-7. От какого класса наследуются классы массивов? Какие интерфейсы реализуются? Какие элементы они объявляют или переопределяют по сравнению с родительским классом?
a.) Классы наследуются от java.lang.Object.
Реализуют 2 интерфейса – java.lang.Cloneable и java.io.Serializable.
Программирование на Java
Rendered by www.RenderX.com
Стр. 19 из 21
Объявляется новое поле public final int length и переопределяется метод public Object clone().
9-8. Как определить, можно ли преобразовать один тип массива к другому?
a.) Во-первых, оба массива должны быть основаны на ссылочных типах данных.
Во-вторых, чтобы привести массив, основанный на типе A (то есть, A[]) к массиву B[], необходимо, чтобы тип A приводился к типу B.
С учетом того, что типы A и B также могут быть массивами, это правило работает и для многомерных массивов (в этом случае оно должно применяться рекурсивно).
9-9. Хотя примитивные массивы не могут участвовать в преобразованиях, однако массивы int[][] и byte[][] могут рассматриваться как одномерные объектные массивы, основанные на ссылочном типе «одномерный примитивный массив». Могут ли такие типы быть преобразованы из одного в другой?
a.) Нет. Если применять правило из предыдущего вопроса, необходимым условием является приводимость типов int[] и byte[], что неверно по тому же правилу.
9-10. Может ли возникнуть ошибка ArrayStoreException при работе следующих методов?
public void setCars(Car c[]) { c[0]=new Car();
}
public void setCars2(Car c[]) { if (c[0] instanceof Car) {
c[0]=new Car();
}
}
public void setNumbers(int x[]) { x[0]=0;
}
a.) Ошибка может возникнуть в методах setCars и setCars2, если в качестве аргумента передать массив, основанный на классе-наследнике Car. Причем, проверка во втором методе не спасает, так как оператор instanceof вернет true.
В третьем методе ошибки не будет, так как примитивные массивы хранят значения точно того типа, на котором они основаны.
9-11. Можно ли клонировать объекты следующего класса?
public class Point { private int x, y;
Программирование на Java
Rendered by www.RenderX.com
Стр. 20 из 21 |
Контрольные вопросы |
public Point(int nx, int ny) { x=nx;
y=ny;
}
public Object clone() { return new Point(x, y);
}
}
a.) Да, определенный в этом классе метод clone работает безо всяких ошибок. То, что этот класс не реализует интерфейс Cloneable, не позволяет обращаться к методу Object.clone(), однако такая попытка и не производится.
9-12. Сколько объектов может быть создано в процессе выполнения клонирования одного объекта средствами JVM?
a.) Ровно один – сам клон.
9-13. Каков будет результат выполнения следующего кода?
Point p1[][]={null, {new Point(1, 1)}}; Point p2[][] = (Point[][])p1.clone(); p2[0]= new Point[]{new Point(2, 2)}; System.out.println(p1[0][0]);
a.) Не смотря на инициализацию первого элемента клонированного массива, на который ссылается переменная p2, первый элемент исходного массива (p1) остается равным null. Следовательно, попытка обратиться к элементу p1[0][0] приведет к ошибке (NullPointerException).
Программирование на Java
Rendered by www.RenderX.com