- •Что такое Java?
- •История создания Java
- •Сложности внутри Sun Microsystems
- •Проект Green
- •Компания FirstPerson
- •Возрождение OaK
- •Java выходит в свет
- •История развития Java
- •Браузеры
- •Сетевые компьютеры
- •Платформа Java
- •Основные версии и продукты Java
- •Заключение
- •Методология процедурно-ориентированного программирования
- •Методология объектно-ориентированного программирования
- •Объекты
- •Состояние
- •Поведение
- •Уникальность
- •Инкапсуляция
- •Наследование
- •Полиморфизм
- •Типы отношений между классами
- •Агрегация
- •Ассоциация
- •Наследование
- •Метаклассы
- •Достоинства ооп
- •Недостатки ооп
- •Заключение
- •Кодировка
- •Анализ программы
- •Пробелы
- •Комментарии
- •Лексемы
- •Виды лексем
- •Идентификаторы
- •Ключевые слова
- •Литералы
- •Целочисленные литералы
- •Дробные литералы
- •Логические литералы
- •Символьные литералы
- •Строковые литералы
- •Null-литерал
- •Разделители
- •Операторы
- •Пример программы
- •Дополнение. Работа с операторами
- •Операторы присваивания и сравнения
- •Арифметические операции
- •Логические операторы
- •Битовые операции
- •Заключение
- •Введение
- •Имена Простые и составные имена. Элементы
- •Имена и идентификаторы
- •Область видимости (введение)
- •Элементы пакета
- •Платформенная поддержка пакетов
- •Модуль компиляции
- •Объявление пакета
- •Импорт-выражения
- •Объявление верхнего уровня
- •Уникальность имен пакетов
- •Область видимости имен
- •"Затеняющее" объявление (Shadowing)
- •"Заслоняющее" объявление (Obscuring)
- •Соглашения по именованию
- •Заключение
- •Введение
- •Модификаторы доступа
- •Предназначение модификаторов доступа
- •Разграничение доступа в Java
- •Объявление классов
- •Заголовок класса
- •Тело класса
- •Объявление полей
- •Объявление методов
- •Объявление конструкторов
- •Инициализаторы
- •Дополнительные свойства классов
- •Метод main
- •Параметры методов
- •Перегруженные методы
- •Заключение
- •Введение
- •Виды приведений
- •Тождественное преобразование
- •Преобразование примитивных типов (расширение и сужение)
- •Преобразование ссылочных типов (расширение и сужение)
- •Преобразование к строке
- •Запрещенные преобразования
- •Применение приведений
- •Присвоение значений
- •Вызов метода
- •Унарное числовое расширение
- •Бинарное числовое расширение
- •Явное приведение
- •Оператор конкатенации строк
- •Числовое расширение
- •Тип переменной и тип ее значения
- •Заключение
- •Статические элементы
- •Ключевые слова this и super
- •Ключевое слово abstract
- •Интерфейсы
- •Объявление интерфейсов
- •Реализация интерфейса
- •Применение интерфейсов
- •Полиморфизм
- •Полиморфизм и объекты
- •Заключение
- •Массивы как тип данных в Java
- •Объявление массивов
- •Инициализация массивов
- •Многомерные массивы
- •Класс массива
- •Преобразование типов для массивов
- •Ошибка ArrayStoreException
- •Переменные типа массив и их значения
- •Клонирование
- •Клонирование массивов
- •Заключение
- •Управление ходом программы
- •Нормальное и прерванное выполнение операторов
- •Блоки и локальные переменные
- •Пустой оператор
- •Оператор if
- •Оператор switch
- •Управление циклами
- •Цикл while
- •Цикл do
- •Цикл for
- •Операторы break и continue
- •Оператор continue
- •Оператор break
- •Именованные блоки
- •Оператор return
- •Оператор synchronized
- •Ошибки при работе программы. Исключения (Exceptions)
- •Причины возникновения ошибок
- •Обработка исключительных ситуаций Конструкция try-catch
- •Конструкция try-catch-finally
- •Использование оператора throw
- •Проверяемые и непроверяемые исключения
- •Создание пользовательских классов исключений
- •Переопределение методов и исключения
- •Особые случаи
- •Заключение
- •Введение
- •Дерево компонентов
- •Положение
- •Видимость
- •Доступность
- •Алгоритм отрисовки
- •Методы класса Graphics для отрисовки
- •Состояние Graphics
- •Clip (ограничитель)
- •Методы repaint и update
- •Прорисовка контейнера
- •Наследники класса Component
- •Класс Canvas
- •Класс Label
- •Класс Button
- •Классы Checkbox и CheckboxGroup
- •Классы Choice и List
- •Классы TextComponent, TextField, TextArea
- •Класс Scrollbar
- •Наследники Container
- •Класс Panel
- •Класс ScrollPane
- •Класс Window
- •Классы Frame и Dialog
- •Класс FileDialog
- •Обработка пользовательских событий
- •Событие ActionEvent
- •События awt
- •Обработка событий с помощью внутренних классов
- •Пример приложения, использующего модель событий
- •Апплеты
- •Жизненный цикл апплета
- •Передача параметров
- •Интерфейс AppletContext
- •Менеджеры компоновки
- •Класс FlowLayout
- •Класс BorderLayout
- •Класс GridLayout
- •Класс CardLayout
- •Заключение
- •Введение
- •Многопоточная архитектура
- •Базовые классы для работы с потоками Класс Thread
- •Интерфейс Runnable
- •Работа с приоритетами
- •Демон-потоки
- •Синхронизация
- •Хранение переменных в памяти
- •Модификатор volatile
- •Блокировки
- •Методы wait(), notify(), notifyAll() класса Object
- •Заключение
- •Введение
- •Классы-обертки
- •Системные классы
- •SecurityManager – менеджер безопасности
- •Потоки исполнения
- •Исключения
- •Заключение
- •Работа с датами и временем Класс Date
- •Классы Calendar и GregorianCalendar
- •Метод set(int field,int value).
- •Метод add(int field,int delta).
- •Метод roll(int field,int delta).
- •Класс TimeZone
- •Класс SimpleTimeZone
- •Интерфейс Observer и класс Observable
- •Коллекции
- •Интерфейсы Интерфейс Collection
- •Интерфейс Set
- •Интерфейс List
- •Интерфейс Map
- •Интерфейс SortedSet
- •Интерфейс SortedMap
- •Интерфейс Iterator
- •Aбстрактные классы, используемые при работе с коллекциями
- •Конкретные классы коллекций
- •Класс Collections
- •Класс Properties
- •Интерфейс Comparator
- •Класс Arrays
- •Класс StringTokenizer
- •Класс BitSet
- •Класс Random
- •Локализация Класс Locale
- •Класс ResourceBundle
- •Классы ListResourceBundle и PropertiesResourceBundle
- •Заключение
- •Система ввода/вывода. Потоки данных (stream)
- •Классы InputStream и OutputStream
- •Классы-реализации потоков данных Классы ByteArrayInputStream и ByteArrayOutputStream
- •Классы FileInputStream и FileOutputStream
- •Классы FilterInputStream и FilterOutputStream и их наследники
- •Сериализация объектов (serialization)
- •Стандартная сериализация
- •Восстановление состояния
- •Граф сериализации
- •Расширение стандартной сериализации
- •Классы Reader и Writer и их наследники
- •Класс StreamTokenizer
- •Работа с файловой системой Класс File
- •Класс RandomAccessFile
- •Заключение
- •Основы модели osi
- •Класс a
- •Класс b
- •Класс c
- •Подсети. Маска подсети
- •Протоколы arp, rarp
- •Утилиты для работы с сетью
- •Пакет java.Net
- •Заключение
Заключение
В этой лекции мы рассказали о том, какая непростая ситуация сложилась в корпорации Sun в эпоху развития персональных компьютеров в конце 1990 года. Патрик Нотон в своем письме сумел выявить истинные причины такого положения и обозначить истинные цели для создания успешного продукта. Благодаря этому при поддержке Джеймса Гослинга начался проект Green. Одним из продуктов, созданных в рамках этого проекта, стала совершенно новая платформа OaK. Для ее продвижения Sun учредила дочернюю компанию FirstPerson, но настоящий успех пришел, когда платформу, переименовав в Java, сориентировали на применение в Internet.
Глобальная сеть появилась в апреле 1993 года с выходом первого браузера Mosaic 1.0 и завоевывала пользовательскую аудиторию с поразительной скоростью. Первым примером Java -приложений стали апплеты, запускаемые при помощи специально созданного браузера HotJava. Наконец, после почти четырехлетней истории создания и развития, Java была официально представлена миру. Благодаря подписанию лицензионного соглашения с Netscape, это событие стало поистине триумфальным.
Были рассмотрены различные варианты применения Java. Отдельно был описан язык Java Script, который, несмотря на сходство в названии, имеет не так много общего с Java. Подробно рассмотрены отличительные особенности Java. Описаны базовые продукты от Sun: JDK и JRE. Кратко освещена история развития версий платформы Java, включая добавляемые технологии и продукты.
Лекция 2. Основы объектно-ориентированного программирования
Методология процедурно-ориентированного программирования
Появление первых электронных вычислительных машин, или компьютеров, ознаменовало новый этап в развитии техники вычислений. Казалось, достаточно разработать последовательность элементарных действий, каждое из которых можно преобразовать в понятные компьютеру инструкции, и любая вычислительная задача будет решена. Эта идея оказалась настолько жизнеспособной, что долгое время доминировала над всем процессом разработки программ. Появились специализированные языки программирования, созданные для разработки программ, предназначенных для решения вычислительных задач. Примерами таких языков могут служить FOCAL (FOrmula CALculator) и FORTRAN (FORmula TRANslator).
Основой такой методологии разработки программ являлась процедурная, или алгоритмическая, организация структуры программного кода. Это было настолько естественно для решения вычислительных задач, что целесообразность такого подхода ни у кого не вызывала сомнений. Исходным в данной методологии было понятие алгоритма. Алгоритм - это способ решения вычислительных и других задач, точно описывающий определенную последовательность действий, которые необходимо выполнить для достижения заданной цели. Примерами алгоритмов являются хорошо известные правила нахождения корней квадратного уравнения или системы линейных уравнений.
При увеличении объемов программ для упрощения их разработки появилась необходимость разбивать большие задачи на подзадачи. В языках программирования возникло и закрепилось новое понятие процедуры. Использование процедур позволило разбивать большие задачи на подзадачи и таким образом упростило написание больших программ. Кроме того, процедурный подход позволил уменьшить объем программного кода за счет написания часто используемых кусков кода в виде процедур и их применения в различных частях программы.
Как и алгоритм, процедура представляет собой законченную последовательность действий или операций, направленных на решение отдельной задачи. В языках программирования появилась специальная синтаксическая конструкция, которая также получила название процедуры. Например, на языке Pascal описание процедуры выглядит следующим образом:
Procedure printGreeting(name: String)
Begin
Write("Hello, ");
WriteLn(name);
End;
Назначение данной процедуры - вывести на экран приветствие Hello, Name, где Name передается в процедуру в качестве входного параметра.
Со временем вычислительные задачи становились все сложнее, а значит, и решающие их программы увеличивались в размерах. Их разработка превратилась в серьезную проблему. Когда программа становится все больше, ее приходится разделять на все более мелкие фрагменты. Основой для такого разбиения как раз и стала процедурная декомпозиция, при которой отдельные части программы, или модули, представляли собой совокупность процедур для решения одной или нескольких задач. Одна из основных особенностей процедурного программирования заключается в том, что оно позволило создавать библиотеки подпрограмм (процедур), которые можно было бы использовать повторно в различных проектах или в рамках одного проекта. При процедурном подходе для визуального представления алгоритма выполнения программы применяется так называемая блок-схема . Соответствующая система графических обозначений была зафиксирована в ГОСТ 19.701-90. Пример блок-схемы изображен на рисунке 2.1
Рис. 2.1. Пример блок-схемы.
Появление и интенсивное использование условных операторов и оператора безусловного перехода стало предметом острых дискуссий среди специалистов по программированию. Дело в том, что бесконтрольное применение в программе оператора безусловного перехода goto может заметно осложнить понимание кода. Такие запутанные программы сравнивали с порцией спагетти (bowl of spaghetti), имея в виду многочисленные переходы от одного фрагмента программы к другому, или, что еще хуже, возврат от конечных операторов программы к начальным. Ситуация казалась настолько драматичной, что многие предлагали исключить оператор goto из языков программирования. Именно с этого времени отсутствие безусловных переходов стали считать хорошим стилем программирования.
Дальнейшее увеличение программных систем способствовало формированию новой точки зрения на процесс разработки программ и написания программных кодов, которая получила название методологии структурного программирования. Ее основой является процедурная декомпозиция предметной области решаемой задачи и организация отдельных модулей в виде совокупности процедур. В рамках этой методологии получило развитие нисходящее проектирование программ, или проектирование "сверху вниз". Пик популярности идей структурного программирования приходится на конец 70-х - начало 80-х годов.
В этот период основным показателем сложности разработки программы считался ее размер. Вполне серьезно обсуждались такие оценки сложности программ, как количество строк программного кода. Правда, при этом делались некоторые предположения относительно синтаксиса самих строк, которые должны были соответствовать определенным требованиям. Например, каждая строка кода должна была содержать не более одного оператора. Общая трудоемкость разработки программ оценивалась специальной единицей измерения - "человеко-месяц", или "человеко-год". А профессионализм программиста напрямую связывался с количеством строк программного кода, который он мог написать и отладить в течение, скажем, месяца.
