- •Аннотация
- •Лекция 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. Контрольные вопросы
Стр. 20 из 33 |
Системные классы |
При передаче экземпляра класса в качестве параметра в метод StringBuffer, так же следует помнить об отличии String и StringBuffer.
public class Test {
public static void main(String[] args) { Test t = new Test();
StringBuffer sb = new StringBuffer("aaa"); System.out.println("Before = " + sb); t.doTest(sb);
System.out.println("After = " + sb);
}
void doTest(StringBuffer theSb){ theSb.append("-bbb");
}
}
В результате на экран будет выведено следующее:
Before = aaa
After = aaa-bbb
Т.к. все объекты передаются по ссылке, в методе doTest, при выполнении операций с theSB, будет модифицирован объект, на который ссылается sb. Следует еще раз напомнить, что для String переопределен оператор +, т.е. если + применить экземплярам класса String то будет осуществлена конкатенация строк и, если один из операндов не принадлежит к классу String, то он будет неявно приведен к этому типу. Примитивные типы будут преобразованы в String, как это произошло бы вызовом метода String.valueOf().
Например
System.out.println("1" + 5) выведет на консоль 15
System.out.println(1+ 5) выведет на консоль 6
7. Системные классы
Следующие классы, которые стоит рассмотреть, отвечают за выполнение хода программы, это
ClassLoader - загрузчик классов. Содержит методы, необходимые для динамической загрузки новых классов
SecurityManager - менеджер безопасности. Содержит различные методы проверки, допустима ли запрашиваемая операция.
System - содержит набор статических методов, применимых к среде, в которой выполняется приложение. Многие из них присутствуют так же в классе Runtime.
Программирование на Java
Rendered by www.RenderX.com
ClassLoader |
Стр. 21 из 33 |
Runtime - позволяет приложению взаимодействовать с окружением в котором оно запущено. Каждому приложению соответствует один экземпляр Runtime.
Process - представляет внешнюю программу, запущенную при помощи Runtime
7.1. ClassLoader
Это абстрактный класс, ответственный за загрузку классов. По имени класса он находит либо генерирует данные, которые составляют определение класса. Обычно для этого используется следующая стратегия: название класса преобразуется в название файла - "class file", из которого и считывается вся необходимая информация.
Каждый объект Class содержит ссылку на объект ClassLoader, посредством которого он был загружен.
Для изменения способа загрузки классов, можно реализовать свой загрузчик классов, унаследовав его от ClassLoader. Так, хотя обычно классы загружаются из файлов, однако бывают и другие ситуации. Например, классы могут загружаться через сетевое соединение. Метод defineClass() преобразует массив байт в экземпляр класса Class. Экземпляры полученного таким образом класса могут быть получены, используя метод newInstance() у объекта Class. Методы объектов, полученных с помощью загрузчика классов, могут ссылаться на другие, доступные в запущенном приложении классы. Для получения классов, на которые можно ссылаться, вызывается метод loadClass у загрузчика классов.
Для иллюстрации использования загрузчика классов, приведем пример, как может выглядеть простая реализация загрузчика классов, использующего сетевое соединение:
class NetworkClassLoader extends ClassLoader { String host;
int port;
public NetworkClassLoader(String host, int port) { this.host = host;
this.port = port;
}
public Class findClass(String className) { byte[] bytes = loadClassData(className);
return defineClass(className, bytes, 0, bytes.length)
}
private byte[] loadClassData(String className) { byte[] result = null;
// open connection, load the class data return result;
}
}
В этом примере только показано, что подкласс загрузчика классов доложен определить и реализовать методы findClass() и loadClassData() для загрузки классов. Когда набор байт, образующих класс, загружен, необходимо использовать метод defineClass() для создания класса. Для простоты, в примере приведен только шаблонный код без реализации получения байт из сетевого соединения.
Программирование на Java
Rendered by www.RenderX.com
Стр. 22 из 33 |
Системные классы |
Для получения экземпляров классов, загруженных с помощью этого загрузчика, можно написать код, аналогичный следующему:
try{
ClassLoader loader = new NetworkClassLoader(host, port); Object main = loader.loadClass("Main").newInstance(); }catch(ClassNotFoundException e){
e.printStackTrace(); }catch(InstantiationException e){ e.printStackTrace(); }catch(IllegalAccessException e){ e.printStackTrace();
}
Если такой класс не будет найден - будет брошено исключение ClassNotFoundException, если класс будет найден, но произойдет какая-либо ошибка при создании объекта этого класса - будет брошено исключение InstantiationException, и, наконец, если у вызывающего потока не имеется достаточно прав для создания экземпляров этого класса (что будет проверено менеджером безопасности), будет брошено исключение IllegalAccessException.
7.2. SecurityManager - менеджер безопасности
С помощью этого класса приложения могут перед выполнением потенциально опасных операций, определить, является ли операция таковой и может ли она быть выполнена в данном контексте.
Класс SecurityManager содержит много методов с именами, начинающимися с приставки check . Эти методы вызываются различными из библиотек Java перед тем как в них будут выполнены потенциально опасные операции. Типичный такой вызов выглядит примерно следующим образом:
SecurityManager security = System.getSecurityManager(); if(security != null){
security.checkX(…);
}
Где X - какой-либо запрос на доступ: Access, Read, Write, Connect, Delete, Exec, Listen и
так далее.
Предотвращение вызова производится путем бросания исключения - SecurityException, если вызов операции НЕ разрешен ( кроме метода checkTopLevelWindow, который возвращает boolean значение ).
Для установки менеджера безопасности в качестве текущего, вызывается метод setSecurityManager() в классе System. Соответственно, для его получения, нужно вызвать метод getSecurityManager().
В большинстве случаев, если приложение запускается локально - будут разрешены все действия. В основном менеджер безопасности проявляет себя при работе с апплетами - загруженными из сети.
Программирование на Java
Rendered by www.RenderX.com
System |
Стр. 23 из 33 |
7.3. System
Содержит набор полезных статических методов и полей. Экземпляр этого класса НЕ может быть получен. Среди прочих полезных средств, предоставляемых этим классом, особо стоит отметить потоки стандартных ввода и вывода, поток для вывода ошибок; доступ к внешне определенным свойствам; возможность загрузки файлов и библиотек; утилиту для быстрого копирования порций массивов.
Конечно, наиболее широко используемым является стандартный вывод, доступный через переменную System.out. стандартный вывод можно перенаправить в другой поток (файл, массив байт и т.д., главное, что бы это был объект PrintStream):
public static void main(String[] args) { System.out.println("Study Java");
try{
PrintStream print = new PrintStream(new FileOutputStream("d:\\file2.txt"));
System.setOut(print); System.out.println("Study well"); }catch(FileNotFoundException e){ e.printStackTrace();
}
}
При запуске этого кода, на экран будет выведено только
Study Java
И в файл "d:\file2.txt" будет записано
Study well
Абсолютно аналогично могут быть перенаправлены стандартный ввод System.in вызовом
System.setIn(InputStream) и System.err - вызовом System.setErr(PrintStream).
Следующие методы класса System позволяют работать с некоторыми параметрами системы:
public static void runFinalizersOnExit(boolean value) - выставляет, будет ли производиться вызов метода finalize() у всех объектов (у кого еще не вызывался), когда выполнение программы будет окончено
public static native long currentTimeMillis() - возвращает текущее время. Это время представляется как количество миллисекунд, прошедших с 1-го января 1970 года
public static String getProperty(String key) - возвращает значение свойства с названием key.
Что бы получить все свойства, какие определены в системе, можно воспользоваться методом
public static java.util.Properties getProperties() - возвращает объект java.util.Properties, в
котором содержатся значения всех определенных системных свойств.
Программирование на Java
Rendered by www.RenderX.com