Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Shpory_java

.docx
Скачиваний:
11
Добавлен:
16.04.2015
Размер:
68.16 Кб
Скачать

1) Пять признаков сложной системы

Система, состоящая из множества взаимодейств. составляющих (подсистем), вследствие чего сложная система приобретает новые свойства, которые отсутствуют на подсистемном уровне и не могут быть сведены к свойствам подсистемного уровня.

  • Сложные системы часто являются иерархическими и состоят из взаимозависимых подсистем, которые в свою очередь также могут быть разделены на подсистемы, и т.д., вплоть до самого низкого уровня

  • Выбор, какие компоненты в данной системе считаются элементарными, относительно произволен и в большой степени оставляется на усмотрение исследователя

  • Внутрикомпонентная связь обычно сильнее, чем связь между компонентами

  • Иерархические системы обычно состоят из немногих типов подсистем, по-разному скомбинированных и организованных

  • Любая работающая сложная система является результатом развития работавшей более простой системы... Сложная система, спроектированная "с нуля", никогда не заработает. Следует начинать с работающей простой системы

5) Составные части объектного подхода: инкапсуляция

Инкапсуляция - это процесс отделения друг от друга элементов объекта, определяющих его устройство и поведение; инкапсуляция служит для того, чтобы изолировать контрактные обязательства абстракции от их реализации.

На самом деле, абстракция объекта всегда предшествует его реализации. А после того, как решение о реализации принято, оно должно трактоваться как секрет абстракции, скрытый от большинства клиентов.

Никакая часть сложной системы не должна зависеть от внутреннего устройства какой-либо другой части. В то время, как абстракция "помогает людям думать о том, что они делают", инкапсуляция "позволяет легко перестраивать программы".

Чаще всего инкапсуляция выполняется посредством скрытия информации, то есть маскировкой всех внутренних деталей, не влияющих на внешнее поведение. Обычно скрываются и внутренняя структура объекта и реализация его методов.

Инкапсуляция, таким образом, определяет четкие границы между различными абстракциями.

2) Алгоритмическая декомпозиция и объектно-ориентированная декомпозиция

Алгоритмическая декомпозиция. Большинство из нас формально обучено структурному проектированию "сверху вниз", и мы воспринимаем декомпозицию как обычное разделение алгоритмов, где каждый модуль системы выполняет один из этапов общего процесса.

Объектно-ориентированная декомпозиция. Выберем в качестве критерия декомпозиции принадлежность ее элементов к различным абстракциям данной проблемной области. Декомпозиция основана на объектах, а не на алгоритмах.

Какая декомпозиция сложной системы правильнее - по алгоритмам или по объектам? В этом вопросе есть подвох, и правильный ответ на него: важны оба аспекта. Разделение по алгоритмам концентрирует внимание на порядке происходящих событий, а разделение по объектам придает особое значение агентам, которые являются либо объектами, либо субъектами действия.

Однако объектная декомпозиция имеет несколько чрезвычайно важных преимуществ перед алгоритмической. Объектная декомпозиция уменьшает размер программных систем за счет повторного использования общих механизмов. Объектно-ориентированные системы более гибки и проще эволюционируют со временем.  

6) Составные части объектного подхода: модульность

Модульность - это свойство системы, которая была разложена на внутренне связные, но слабо связанные между собой модули.

Разделение программы на модули до некоторой степени позволяет уменьшить ее сложность.

Модульность - это разделение программы на фрагменты, которые компилируются по отдельности, но могут устанавливать связи с другими модулями. Связи между модулями - это их представления друг о друге.

Для небольших задач допустимо описание всех классов и объектов в одном модуле. Однако для большинства программ (кроме самых тривиальных) лучшим решением будет сгруппировать в отдельный модуль логически связанные классы и объекты, оставив открытыми те элементы, которые совершенно необходимо видеть другим модулям.

Таким образом, принципы абстрагирования, инкапсуляции и модульности являются взаимодополняющими. Объект логически определяет границы определенной абстракции, а инкапсуляция и модульность делают их физически незыблемыми.

3) Основные положения объектной модели

Основными принципами объектной модели являются: абстрагирование, инкапсуляция, модульность, иерархичность, типизация, параллелизм и персистентность. Каждый из этих принципов сам по себе не нов, но в объектной модели они впервые применены в совокупности.

4 поколения языков программирования:

Первое поколение (1954-1958)

FORTRAN I, ALGOL-58, Flowmatic

  1. Второе поколение (1959-1961)

  2. FORTRAN II, ALGOL-60

  3. Третье поколение (1962-1970)

  4. ALGOL-68, Pascal, Simula

  5. Потерянное поколение (1970-1980)

  6. Много создано, мало выжило

Объектно-ориентированное программирование(ООП,OOP) - это методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.

Объектно-ориентированное проектирование(ООП,OOD)- это методология проектирования, соединяющая в себе процесс объектной декомпозиции и приемы представления логической и физической, а также статической и динамической моделей проектируемой системы.

Объектно-ориентированный анализ (ООА)- это методология, при которой требования к системе воспринимаются с точки зрения классов и объектов, выявленных в предметной области.

На результатах ООА формируются модели, на которых основывается OOПроект; OOПроект в свою очередь создает фундамент для окончательной реализации системы с использованием методологии OOП.

7) Составные части объектного подхода: иерархия

Всегда число абстракций в системе намного превышает наши умственные возможности. Инкапсуляция позволяет в какой-то степени устранить это препятствие, убрав из поля зрения внутреннее содержание абстракций. Модульность также упрощает задачу, объединяя логически связанные абстракции в группы. Но этого оказывается недостаточно.

Значительное упрощение в понимании сложных задач достигается за счет образования из абстракций иерархической структуры.

Иерархия - это упорядочение абстракций, расположение их по уровням.

Основными видами иерархических структур применительно к сложным системам являются структура классов (иерархия "is-a") и структура объектов (иерархия "part of").

Примеры иерархии: одиночное наследование.

4) Составные части объектного подхода: абстрагирование

Абстрагирование является одним из основных методов, используемых для решения сложных задач.

Абстракция выделяет существенные характеристики некоторого объекта, отличающие его от всех других видов объектов и, таким образом, четко определяет его концептуальные границы с точки зрения наблюдателя.

Барьер абстракции - разделение смысла и реализации.

Принцип наименьшего удивления, согласно которому абстракция должна охватывать все поведение объекта, но не больше и не меньше.

Выбор правильного набора абстракций для заданной предметной области представляет собой главную задачу объектно-ориентированного проектирования.

Существует целый спектр абстракций, начиная с объектов, которые почти точно соответствуют реалиям предметной области, и кончая объектами, не имеющими право на существование.

Абстракция сущности Объект представляет собой полезную модель некой сущности в предметной области

Абстракция поведения Объект состоит из обобщенного множества операций

Абстракция виртуальной машины Объект группирует операции, которые либо вместе используются более высоким уровнем управления, либо сами используют некоторый набор операций более низкого уровня

Произвольная абстракция Объект включает в себя набор операций, не имеющих друг с другом ничего общего

Клиентом называется любой объект, использующий ресурсы другого объекта (называемого сервером).

Полный набор операций, которые клиент может осуществлять над другим объектом - протокол.

Центральной идеей абстракции является понятие инварианта. Инвариант - это некоторое логическое условие, значение которого (истина или ложь) должно сохраняться.

8) Составные части объектного подхода: контроль типов

Тип - точная характеристика свойств, включающая структуру и поведение, относящееся к некоторой совокупности объектов.

Типизация - это способ защититься от использования объектов одного класса вместо другого, или по крайней мере управлять таким использованием.

Идея согласования типов занимает в понятии типизации центральное место. Например, возьмем физические единицы измерения. Деля расстояние на время, мы ожидаем получить скорость, а не вес. В умножении температуры на силу смысла нет, а в умножении расстояния на силу - есть. Все это примеры сильной типизации, когда прикладная область накладывает правила и ограничения на использование и сочетание абстракций.

9) Составные части объектного подхода: параллелизм

Есть задачи, в которых автоматические системы должны обрабатывать много событий одновременно.

Параллелизм - это свойство, отличающее активные объекты от пассивных.

Многие современные операционные системы предусматривают прямую поддержку параллелизма, и это обстоятельство очень благоприятно сказывается на возможности обеспечения параллелизма в объектно-ориентированных системах.

В то время, как объектно-ориентированное программирование основано на абстракции, инкапсуляции и наследовании, параллелизм главное внимание уделяет абстрагированию и синхронизации процессов. Каждый объект (полученный из абстракции реального мира) может представлять собой отдельный поток управления (абстракцию процесса). Такой объект называется активным.

Для систем, построенных на основе OOD, мир может быть представлен, как совокупность взаимодействующих объектов, часть из которых является активной и выступает в роли независимых вычислительных центров.

13) Объекты как автоматы. Индивидуальность

Можно сказать, что объекты могут быть активными и пассивными. Активный объект имеет свой поток управления, а пассивный - нет. Активный объект в общем случае автономен, то есть он может проявлять свое поведение без воздействия со стороны других объектов. Пассивный объект, напротив, может изменять свое состояние только под воздействием других объектов. Таким образом, активные объекты системы - источники управляющих воздействий. Если система имеет несколько потоков управления, то и активных объектов может быть несколько. В последовательных системах обычно в каждый момент времени существует только один активный объект, например, главное окно, диспетчер которого ловит и обрабатывает все сообщения. В таком случае остальные объекты пассивны: их поведение проявляется, когда к ним обращается активный объект.

Идентичность - это такое свойство объекта, которое отличает его от всех других объектов.

10) Составные части объектного подхода: персистентность

Любой программный объект существует в памяти и живет во времени.

Языки программирования, как правило, не поддерживают понятия сохраняемости; примечательным исключением является Smalltalk, в котором есть протоколы для сохранения объектов на диске и загрузки с диска. Однако, записывать объекты в неструктурированные файлы - это все-таки наивный подход, пригодный только для небольших систем. Как правило, сохраняемость достигается применением (немногочисленных) коммерческих OODB.

Сохраняемость - способность объекта существовать во времени, переживая породивший его процесс, и (или) в пространстве, перемещаясь из своего первоначального адресного пространства.

или

Способность объекта преодолевать временные рамки, т.е. продолжать сущ. после уничтожения создателя.

14) Отношения между объектами: связи, видимость

Отношения двух любых объектов основываются на операциях, которые можно выполнять, и об ожидаемом поведении.

Связь - физическое или концептуальное соединение между объектами. Другими словами, связь - это специфическое сопоставление, через которое клиент запрашивает услугу у объекта-сервера или через которое один объект находит путь к другому.

Участвуя в связи, объект может выполнять одну из следующих трех ролей:

Актер Объект может воздействовать на другие объекты, но сам никогда не подвергается воздействию других объектов; в определенном смысле это соответствует понятию активный объект.

Сервер Объект может только подвергаться воздействию со стороны других объектов, но он никогда не выступает в роли воздействующего объекта.

Агент Такой объект может выступать как в активной, так и в пассивной роли. Как правило, объект-агент создается для выполнения операций в интересах какого-либо объекта-актера.

Иногда в процессе проектирования полезно явно определить видимость объектов. Существуют четыре основных способа сделать так, чтобы объект X (клиент) видел объект Y (сервер):

• сервер является глобальным;

• сервер передается клиенту в качестве параметра операции;

• сервер является частью клиента в смысле классов;

• сервер локально объявляется в области видимости клиента.

11) Природа объектов: состояние, поведение

Объект представляет собой конкретный опознаваемый предмет, единицу или сущность (реальную или абстрактную), имеющую четко определенное функциональное назначение в данной предметной области.

Структура и поведение схожих объектов определяет общий для них класс.

С точки зрения восприятия человеком объектом может быть:

• осязаемый и (или) видимый предмет;

• нечто, воспринимаемое мышлением;

• нечто, на что направлена мысль или действие.

Состояние объекта характеризуется перечнем (обычно статическим) всех свойств данного объекта и текущими (обычно динамическими) значениями каждого из этих свойств.

Поведение - это то, как объект действует и реагирует; поведение выражается в терминах состояния объекта и передачи сообщений.

!!!Состояние объекта представляет суммарный результат его поведения.

15) Отношения между объектами: синхронизация, агрегация

Когда один объект посылает по связи сообщение другому, связанному с ним, они, как говорят, синхронизируются. В строго последовательном приложении синхронизация объектов и состоит в запуске метода.

Если же активный объект имеет связь с пассивным, возможны следующие три подхода к синхронизации:

• Последовательный - действие пассивного объекта обеспечивается в присутствии только одного активного процесса.

• Защищенный - действие пассивного объекта обеспечивается в присутствии многих потоков управления, но активные клиенты должны договориться и обеспечить взаимное исключение.

• Синхронный - действие пассивного объекта обеспечивается в присутствии многих потоков управления.

В то время, как связи обозначают равноправные или "клиент-серверные" отношения между объектами, агрегация описывает отношения целого и части.

Агрегация может означать физическое вхождение одного объекта в другой, но не обязательно. Самолет состоит из крыльев, двигателей, шасси и прочих частей. С другой стороны, отношения акционера с его акциями - это агрегация, которая не предусматривает физического включения.

12) Природа объектов: операции, роли, обязанности

Операция - это услуга, которую класс может предоставить своим клиентам. На практике типичный клиент совершает над объектами операции пяти видов. Ниже приведены три наиболее распространенные операции:

Модификатор Операция, которая изменяет состояние объекта

Селектор Операция, считывающая состояние объекта, но не меняющая состояния

Итератор Операция, позволяющая организовать доступ ко всем частям объекта в строго определенной последовательности

Две операции являются универсальными:

Конструктор Операция создания объекта и/или его инициализации

Деструктор Операция, освобождающая состояние объекта и/или разрушающая сам объект

Роль - это маска, которую носит объект; она определяет контракт абстракции с ее клиентами.

Ответственности объекта имеют две стороны - знания, которые объект поддерживает, и действия, которые объект может исполнить. Они выражают смысл его предназначения и место в системе. Ответственность понимается как совокупность всех услуг и всех контрактных обязательств объекта.

16) Природа класса: интерфейс и реализация

Класс - это некое множество объектов, имеющих общую структуру и общее поведение.

Любой конкретный объект является просто экземпляром класса.

Главное в интерфейсе - объявление операций, поддерживаемых экземплярами класса. К нему можно добавить объявления других классов, переменных, констант и исключительных ситуаций, уточняющих абстракцию, которую класс должен выражать. Напротив, реализация класса никому, кроме него самого, не интересна. По большей части реализация состоит в определении операций, объявленных в интерфейсе класса.

Мы можем разделить интерфейс класса на три части:

• открытую (public) - видимую всем клиентам;

• защищенную (protected) - видимую самому классу, его подклассам и друзьям (friends);

• закрытую (private) - видимую только самому классу и его друзьям.

17) Отношения между классами: ассоциация

Отношения между классами могут означать одно из двух. Во-первых, у них может быть что-то общее. Например, и маргаритки, и розы - это разновидности цветов: и те, и другие имеют ярко окрашенные лепестки, испускают аромат и так далее. Во-вторых, может быть какая-то семантическая связь. Например, красные розы больше похожи на желтые розы, чем на маргаритки.

Известны три основных типа отношений между классами. Во-первых, это отношение "обобщение/специализация" (общее и частное), известное как "is-a". Розы суть цветы, что значит: розы являются специализированным частным случаем, подклассом более общего класса "цветы". Во вторых, это отношение "целое/ часть", известное как "part of". Так, лепестки являются частью цветов. В-третьих, это семантические, смысловые отношения, ассоциации. Например, божьи коровки ассоциируются с цветами - хотя, казалось бы, что у них общего. Или вот: розы и свечи - и то, и другое можно использовать для украшения стола.

Ассоциация - смысловая связь.

важно различать три случая ассоциации:

• "один-к-одному"

• "один-ко-многим"

• "многие-ко-многим"

24) Абстрактные методы и классы. Полиморфизм

Метод будет абстрактным, когда мы записываем только заголовок метода и ставим после закрывающей список параметров скобки точку с запятой. Также необходимо указать компилятору модификатор abstract.

Если класс содержит хоть один абстрактный метод, то создать его экземпляры, а тем более использовать их, не удастся. Такой класс становится абстрактным, что обязательно надо указать модификатором abstract.

Как же использовать абстрактные классы? Только порождая от них подклассы, в которых переопределены абстрактные методы.

ключевая особенность полиморфизма – наследники могут изменить родительское поведение, даже если обращение к ним производится по ссылке родительского типа. Хотя старый метод снаружи недоступен, внутри класса-наследника к нему можно обратиться с помощью super.

Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций».

18) Отношения между классами: наследование

Попросту говоря, наследование - это такое отношение между классами, когда один класс повторяет структуру и поведение другого класса (одиночное наследование) или других (множественное наследование) классов. Класс, структура и поведение которого наследуются, называется суперклассом.

Наследование устанавливает между классами иерархию общего и частного.

В подклассе структура и поведение исходного суперкласса дополняются и переопределяются.

Подкласс обычно расширяет или ограничивает существующую структуру и поведение своего суперкласса.

Одиночное наследование

Подкласс имеет ровно один суперкласс.

Множественное наследование

При множественном наследовании часто используется прием создания примесей (mixin). Идея примесей происходит из языка Flavors: можно комбинировать (смешивать) небольшие классы, чтобы строить классы с более сложным поведением. 

23) Перегрузка методов. Переопределение методов

При перегрузке методов создается несколько методов с одинаковыми именами, но разными сигнатурами. Сигнатура метода состоит из типа результата, возвращаемого методом, имени метода и списка аргументов. Поскольку имя общее, разные варианты метода могут отличаться типом возвращаемого результата и(или) списком аргументов. Технически речь идет о разных методах, но поскольку все они имеют одинаковые названия, обычно говорят об одном методе.

Общепринятым является принцип, согласно которого перегруженные версии метода должны реализовывать один общий алгоритм. В этом смысле неприемлема ситуация, когда одна версия метода, например, выводит сообщение со значением аргумента, а другая выполняет поиск наибольшего значения среди переданных методы аргументов.

Если в подклассе описан метод с сигнатурой, совпадающей с сигнатурой метода, наследуемого из суперкласса, то метод подкласса замещает метод суперкласса.

Между переопределением и перегрузкой методов существует принципиальное различие. При перегрузке методы имеют одинаковые названия, но разные сигнатуры. При переопределении совпадают не только названия методов, но и полностью сигнатуры (тип результата, имя и список аргументов).

19) Отношения между классами: агрегация, зависимости

Отношение агрегации между классами имеет непосредственное отношение к агрегации между их экземплярами.

Агрегация является направленной, как и всякое отношение "целое/часть".

Конечно, агрегация не требует обязательного физического включения, ни по значению, ни по ссылке.

Любой объект является экземпляром какого-либо класса. Что будет, если мы попробуем и с самими классами обращаться как с объектами? Для этого нам надо ответить на вопрос, что же такое класс класса? Ответ - это метакласс. Иными словами, метакласс - это класс, экземпляры которого суть классы. Метаклассы венчают объектную модель в чисто объектно-ориентированных языках.

21) Качество классов и объектов

Для оценки качества классов и объектов, выделяемых в системе, можно предложить следующие пять критериев:

• зацепление;

• связность;

• достаточность;

• полнота;

• примитивность.

Зацепление - степень глубины связей между отдельными модулями.

Связность - это степень взаимодействия между элементами отдельного модуля.

К идеям зацепления и связности тесно примыкают понятия достаточности, полноты и примитивности. Под достаточностью подразумевается наличие в классе или модуле всего необходимого для реализации логичного и эффективного поведения.

Под полнотой подразумевается наличие в интерфейсной части класса всех характеристик абстракции.

Примитивными являются только такие операции, которые требуют доступа к внутренней реализации абстракции, к структуре данных.

20) Взаимосвязь классов и объектов

Классы и объекты - это отдельные, но тесно связанные понятия. В частности, каждый объект является экземпляром какого-либо класса; класс может порождать любое число объектов.

На этапе анализа и ранних стадиях проектирования решаются две основные задачи:

• Выявление классов и объектов, составляющих словарь предметной области.

• Построение структур, обеспечивающих взаимодействие объектов, при котором выполняются требования задачи.

В первом случае говорят о ключевых абстракциях задачи (совокупность классов и объектов), во втором - о механизмах реализации (совокупность структур).

22) Классы и объекты, поля и методы в языке Java

Каждый объект определяется некоторым общим шаблоном, который называется классом.

Класс содержит поля и методы. Поля — это совокупность именованных данных стандартных типов или именованных ссылок на объекты классов. Эта совокупность будет присутствовать в каждом объекте класса, т.е. будет его «собственностью». Значения этих полей определяют состояние конкретного объекта.

Методы выполняют допустимые действия над данными, принадлежащими объекту. Некоторые методы — конструкторы — имеют специальное назначение. Они применяются при создании нового объекта для назначения начальных значений его полей.

25) Окончательные члены и классы. Класс Object

Пометив метод модификатором final, можно запретить его переопределение в подклассах. Вы можете быть уверены, что метод выполняет те действия, которые вы задали. Именно так определены математические функции в классе Math. Мы уверены, что метод Math.cos(x) вычисляет именно косинус числа х.

Если же пометить модификатором final весь класс, то его вообще нельзя будет расширить.

Для переменных модификатор final имеет совершенно другой смысл. Если пометить модификатором final описание переменной, то её значение (а оно должно быть обязательно задано или здесь же, или в блоке инициализации или в конструкторе) нельзя изменить ни в подклассах, ни в самом классе. Переменная превращается в константу.

На самой вершине иерархии классов стоит класс object.

Если при описании класс мы не указывает никакое расширение, т.е. не пишем слово extends и имя класса за ним, то Java считает этот класс расширением класса Object.

Методы equals() и toString()

26) Конструкторы класса. Операция new

В операции new, определяющей экземпляры класса, повторяется имя класса со скобками. Это похоже на обращение к методу, имя которого полностью совпадает с именем класса, который называется конструктором класса.

Особенности конструктора:

 Конструктор имеется в любом классе. Даже если вы его не написали, компилятор Java сам создаст конструктор по умолчанию, который, впрочем, пуст, он не делает ничего, кроме вызова конструктора суперкласса

 Конструктор выполняется автоматически при создании экземпляра класса, после распределения памяти и обнуления полей, но до начала использования создаваемого объекта

 Конструктор не возвращает никакого значения. Поэтому в его описании не пишется даже слово void, но можно задать один из модификаторов public, protected или private

 Конструктор не является методом, он даже не считается членом класса. Поэтому его нельзя наследовать или переопределить в подклассе

Операция с одни операндом, обозначаемая словом new, применяется для выделения памяти массивам и объектам.

В первом случае в качестве операнда указывается тип элементов массива и количество его элементов в квадратных скобках.

Во втором случае операндом служит конструктор класса. Если конструктора в классе нет, то вызывается конструктор по умолчанию.

Числовые поля класса получают нулевые значения, логические поля – значение false, ссылки – значение null.

27) Статические члены класса. Метод main().

Иногда надо определить поле, общее для всего класса, изменение которого в одном экземпляре влечет изменение того же поля во всех экземплярах.

К статическим переменным можно обращаться с именем класса, а не только с именем экземпляра, причем это можно сделать, даже если не создан ни одни экземпляр класса.

Для работы с такими статическими переменными обычно создаются статические методы, помеченные модификатором static.

Основная особенность статических методов – они выполняются сразу во всех экземплярах класса, они могут выполняться, даже если не создан ни один экземпляр класса. Примеры: методы класса Math, метод System.out.println().

Статические методы называются методами класса, нестатические - методы экземпляра.

Всякая программа, оформленная как приложение, должная содержать метод с именем main. Он может быть один на все приложение или содержаться в некоторых классах этого приложения, а может находиться и в каждом классе.

Метод main() записывается как обычный метод, может содержать любые описания и действия, но он обязательно должен быть открытым (public), статическим (static), не иметь возвращаемого значения (void). Его аргументом обязательно должен быть массив строк (String[]). По традиции этот массив называют args, хотя имя может быть любым.

31) Перечисления

Программируя, мы часто сталкиваемся с необходимостью ограничить множество допустимых значений для некоторого типа данных. Так, например, день недели может иметь 7 разных значений, месяц в году - 12, а время года - 4. Для решения подобных задач во многих языках программирования со статической типизацией предусмотрен специальный тип данных - перечисление (enum). В Java перечисление появилось не сразу. Специализированная языковая конструкция enum была введена начиная с версии 1.5.

Перечисление - это определенный программистом тип данных, значения которого ограничиваются некоторым набором. Этот набор может содержать, например, названия дней недели. Или состояние некоторого объекта (включен, выключен).

Объявляя enum мы неявно создаем класс производный от java.lang.Enum.

Элементы перечисления - экземпляры enum-класса, доступные статически.

28) Область действия и инициализация переменных

В языке Java нестатические переменные можно объявлять в любом месте кода между операторами. Статические переменные могут быть только полями класса, а значит, не могут объявляться внутри методов и блоков.

Важно, что переменным класса и экземпляра неявно присваиваются нулевые значения. Символы неявно получают значение \u0000, логические переменные – значение false, ссылки получают неявно значение null.

Локальные же переменные неявно не инициализируются. Им должны либо явно присваиваться значения, либо они обязаны определяться до первого использования.

Поля класса при объявлении обнуляются, локальные переменные автоматически не инициализируются.

В теле класса можно сделать описание другого, вложенного класса. А во вложенном классе можно снова описать вложенный, внутренний класс и т.д.

Все вложенные классы можно разделить на вложенные классы-члены класса, описанные вне методов, и вложенные локальные классы, описанные внутри методов и/или блоков.

Все нестатические вложенные классы называются внутренними. В них нельзя объявлять статические члены.

Вложенные классы существуют только на уровне исходного кода. Виртуальная машина Java ничего не знает о вложенных классах. Она работает с обычными внешними классами. Для взаимодействия объектов вложенных классов компилятор вставляет в них специальные закрытые поля.

В Java вложенные классы используются только в самом простом виде, главным образом, при обработке событий, возникающих при действиях с мышью и клавиатурой.

29)Пакеты. Импорт классов и пакетов. Java-файлы

Все классы Java распределяются по пакетам. Кроме классов пакеты могут включать в себя интерфейсы и вложенные подпакеты. Образуется древовидная структура пакетов в подпакетов.

Каждый пакет образует одно пространство имен. Это означает, что все имена классов, интерфейсов и подпакетов в пакете должны быть уникальны. Имена в разных пакетах могу совпадать, но это будут разные программные единицы.

Если надо использовать два класса с одинаковыми именами из разных пакетов, то имя класса уточняется именем пакета: пакет.класс. Такое уточненное имя называется полным именем класса.

Чтобы создать пакет надо просто в первой строке java-файла с исходным кодом записать строку package имя; .

Cтруктура исходного файла с текстом программы на языке Java:

  • В первой строке файла может быть необязательный оператор package

  • В следующих строках могут быть необязательные операторы import

  • Далее идут описания классов и интерфейсов

  • Среди классов файла может быть только один открытый public-класс

  • Имя файла должно совпадать с именем открытого класса, если он существует

30) Интерфейсы

В Java запрещено множественное наследование.

Если при порождении надо использовать несколько предков, используется интерфейс. Он, в отличие от класса, содержит только константы и заголовки методов, без их реализации.

Интерфейсы размещаются в тех же пакетах и подпакетах, что и классы, и компилируются тоже в class-файлы.

Описание интерфейса начинается со слова interface, перед которым может стоять модификатор public, означающий, как и для класса, что интерфейс доступен всюду. Если модификатора нет, интерфейс будет доступен только в своем пакете.

После слова interface записывается имя интерфейса, потом может стоять слово extends и список интерфейсов-предков через запятую. Таким образом, интерфейсы могут порождаться от интерфейсов, образуя свою, независимую от классов, иерархию.

Таким образом, интерфейс – это только набросок, эскиз. В нем указано, что делать, но не указано, как это делать.

Использовать нужно не интерфейс, а его реализацию. Реализация интерфейса – это класс, в котором расписываются методы одного или нескольких интерфейсов. В заголовке класса после его имени или после имени его суперкласса, если он есть, записывается слово implements и, через запятую, перечисляются имена интерфейсов.

32)JDK: Классы-оболочки

Java — полностью объектно-ориентированный язык. Это означает, что все, что только можно, в Java представлено объектами.

Восемь примитивных типов нарушают это правило. Они оставлены в Java из-за многолетней привычки к числам и символам. Да и арифметические действия удобнее и быстрее производить с обычными числами, а не с объектами классов.

Но и для этих типов в языке Java есть соответствующие классы — классы-оболочки (wrapper) примитивных типов. Конечно, они предназначены не для вычислений, а для действий, типичных при работе с классами — создания объектов, преобразования объектов, получения численных значений объектов в разных формах и передачи объектов в методы по ссылке.

Для каждого примитивного типа есть соответствующий класс. Числовые классы имеют общего предка — абстрактный класс Number , в котором описаны шесть методов, возвращающих числовое значение, содержащееся в классе, приведенное к соответствующему примитивному типу: bytevalue (), doubievalue () , floatValue (), intValue(), longValue (), shortValue () . Эти методы переопределены в каждом из шести числовых классов-оболочек.

36) Принципы построения графического интерфейса

Каждое приложение, предназначенное для работы в графической среде, должно создать хотя бы одно окно, в котором будет происходить его работа, и зарегистрировать его в графической оболочке операционной системы, чтобы окно могло взаимодействовать с операционной системой и другими окнами.

В технологии Java дело осложняется тем, что приложения Java должны работать в любой или хотя бы во многих графических средах. В первой версии JDK задачу рещили следующим образом: были разработаны интерфейсы, содержащие методы работы с графическими объектами. Классы библиотеки AWT реализуют эти интерфейсы для создания приложений. Приложения Java используют данные методы для размещения и перемещения графических объектов, изменения их размеров, взаимодействия объектов.

Основное понятие графического интерфейса пользователя (ГИП) – компонент (component) графической системы. Отдельный, полностью определенный элемент, который можно использовать в графическом интерфейсе независимо от других элементов.

Каждый компонент перед выводом на экран помещается в контейнер (container). Контейнер "знает", как разместить компоненты на экране. Разумеется, в языке Java контейнер – это объект класса Container или всякого его расширения.

33)JDK: Работа со строками

Очень большое место в обработке информации занимает работа с текстами. Как и многое другое, текстовые строки в языке Java являются объектами. Они представляются экземплярами класса string или класса stringBuffer.

В объектах класса string хранятся строки-константы неизменной длины и содержания. Это значительно ускоряет обработку строк и позволяет экономить память, разделяя строку между объектами, использующими ее. Длину строк, хранящихся в объектах класса stringBuffer , можно менять, вставляя и добавляя строки и символы, удаляя подстроки или сцепляя несколько строк в одну строку. Во многих случаях, когда надо изменить длину строки типа string , компилятор Java неявно преобразует ее к типу stringBuffer , меняет длину, потом преобразует обратно в тип string .

Напомним, что символы в строках хранятся в кодировке Unicode, в которой каждый символ занимает два байта. Тип каждого символа char.

Основных класса два: Класс StringBuffer (строки переменной длины) и Класс StringTokenizer (3 конструктора:1 созд. объект, готовый разбить строку str на слова, 2 задает разделители, 3позволяет включить разделители в число слов)

37)Графические примитивы. Класс Graphics

При создании компонента, т. е. объекта класса Component, автоматически формируется его графический контекст. В контексте размещается область рисования и вывода текста и изображений. Контекст содержит текущий и альтернативный цвет рисования и цвет фона — объекты класса color, текущий шрифт для вывода текста — объект класса Font.

Управляет контекстом класс Graphics или новый класс Graphics2D, введенный в Java 2. Поскольку графический контекст сильно зависит от конкретной графической платформы, эти классы сделаны абстрактными. Поэтому нельзя непосредственно создать экземпляры класса Graphics или Graphics2D.

При создании контекста в нем задается текущий цвет для рисования, обычно черный, и цвет фона области рисования – белый или серый. Изменить текущий цвет можно методом setcolor (Color newColor), аргумент newcolor которого – объект класса Color.

Узнать текущий цвет можно методом getcolor (), возвращающим объект класса color.

• drawRect(int x, int у, int width, int height) — чертит прямоугольник со сторонами, параллельными краям экрана, задаваемый координатами верхнего левого угла (х, у), шириной width пикселов и высотой height пикселов (drawOval)

34) JDK: Классы-коллекции

В языке Java с самых первых версий есть класс vector , предназначенный для хранения переменного числа элементов самого общего типа object .

Количество элементов может быть любым и наперед не определяться. Элементы получают индексы 0, 1, 2, .... К каждому элементу вектора можно обратиться по индексу, как и к элементу массива.

В классе четыре конструктора:

vector () — создает пустой объект нулевой длины;

Vector (int capacity) — создает пустой объект указанной емкости capacity ;

vector (int capacity, int increment) — создает пустой объект указанной емкости capacity и задает число increment , на которое увеличивается емкость при необходимости;

vector (Collection с) — вектор создается по указанной коллекции. Если capacity отрицательно, создается исключительная ситуация. После создания вектора его можно заполнять элементами.

Stack — подкласс класса Vector, который реализует простой механизм типа "последний вошел - первый вышел".

в составе Java API есть полностью реализованные классы-коллекции помимо Vector, Stack. Это классы ArrayList, LinkedList, HashSet, TreeSet, HashMap, TreeMap, WeakHashMap.

Для работы с этими классами разработаны интерфейсы iterator ,

Listiterator, Comparator и классы Arrays И Collections.

38)Основные компоненты графического интерфейса

Графическая библиотека AWT предлагает более двадцати готовых компонентов. Наиболее часто используются подклассы класса Component: классы Button, Canvas, Checkbox, Choice, Container, Label, List, Scrollbar, TextArea, TextField, Panel, ScrollPane, Window, Dialog, FileDialog, Frame.

Еще одна группа компонентов — это компоненты меню — классы Menuitem, MenuBar, Menu, PopupMenu, CheckboxMenuItem.

Общее, что есть во всех этих компонентах - класс component.

Класс component — центр библиотеки AWT — очень велик и обладает большими возможностями. В нем пять статических констант, определяющих размещение компонента внутри пространства и более сотни методов, большинство из которых - методы доступа getxxx(), isxxx(), setxxx().

Конструктор класса недоступен — он защищенный (protected), потому, что класс component абстрактный, он не может использоваться сам по себе, применяются только его подклассы.

35) JDK: Классы-утилиты

Методы работы с датами и показаниями времени собраны в два класса: Calendar и Date из пакета java.utii.

Объект класса Date хранит число миллисекунд, прошедших с 1 января 1970 г. 00:00:00 по Гринвичу. Это "день рождения" UNIX.

Класс Date удобно использовать для отсчета промежутков времени в миллисекундах.

Преобразование миллисекунд, хранящихся в объектах класса Date , в текущее время и дату производится методами класса calendar.

Различные способы представления дат и показаний времени можно осуществить методами, собранными в абстрактный класс DateFormat и его подклассSimpleDateFormat ИЗ пакета Java. text.

Методы установки и изменения часового пояса (time zone) , а также летнего времени DST (Daylight Savings Time), собраны в абстрактном классе Timezone из пакета java.utii. В этом же пакете есть его реализация — подкласс SimpleTimeZone.

Класс Calendar — абстрактный, в нем собраны общие свойства календарей: юлианского, григорианского, лунного. В Java API пока есть только одна его реализация — подкласс GregorianCalendar.

39) Размещение компонентов. Менеджеры размещения

Для того чтобы управлять расположением элементов внутри окон-контейнеров, в Java существует менеджер раскладок (layout manager). От него наследуются пять классов, определяющих тот или иной тип расположения компонентов пользовательского интерфейса в окне. Когда требуется изменить тип расположения, создается тот или иной класс раскладки, отвечающий запросам, и передается в вызываемый метод setLayout(), изменяющий текущую раскладку. Существуют следующие раскладки:

• FlowLayout. Это простейший способ расположения элементов один за другим, применяемый по умолчанию. • CardLayout. Обычно такой расклад удобен, если необходимо динамически изменять интерфейс окна. Показывает в контейнере только один, первый (first), компонент. Остальные компоненты лежат под первым в определенном порядке как игральные карты в колоде.

• BorderLayout. Эта раскладка размещает элементы либо рядом с выбранным краем окна, либо в центре. • GridLayout. Располагает элементы один за другим внутри некоторой условной таблицы.

• GridBagLayout. Это самая мудреная, но и самая мощная раскладка. Она располагает элементы в условной таблице, как это делается в случае с GridLayout. Но в отличие от последней, можно варьировать размер каждого элемента в отдельности.

40) Обработка событий классы-адаптеры

Событие (event) в библиотеке AWT возникает при воздействии на компонент какими-нибудь манипуляциями мышью, при вводе с клавиатуры, при перемещении окна, изменении его размеров. При возникновении события исполняющая система Java автоматически создает объект соответствующего событию класса. Этот объект не производит никаких действий, он только хранит все сведения о событии.

Во главе иерархии классов-событий стоит класс Eventobject из пакета java.util. Его расширяет абстрактный класс AWTEvent из пакета java.awt — глава классов, описывающих события библиотеки AWT.

Методы обработки событий описаны в интерфейсах-слушателях (listener). Имена интерфейсов составляются из имени события и слова Listener (пр. ActionListener). Методы интерфейса "слушают", что происходит в потенциальном источнике события. При возникновении события эти методы автоматически выполняются, получая в качестве аргумента объект-событие и используя при обработке сведения о событии, содержащиеся в этом объекте.

Классы-адаптеры представляют собой пустую реализацию интерфейсов-слушателей, имеющих более одного метода. Их имена составляются из имени события и слова Adapter. Вместо того чтобы реализовать интерфейс, можно расширять эти классы. Полезно для создания безымянного вложенного класса. Классов-адаптеров всего семь: Component Adapter, ContainerAdapter, FocusAdapter, KeyAdapter, MouseAdapter, MouseMotionAdapter, WindowAdapter.

41) Создание меню. Основное меню приложения. Всплывающее меню

В контейнер типа Frame заложена возможность установки стандартной строки меню (menu bar), располагаемой ниже строки заголовка. Эта строка — объект класса MenuBar.

Все, что нужно сделать для установки строки меню в контейнере Frame — создать объект класса MenuBar и обратиться к методу setMenuBar.

При этом строка меню еще пуста, пункты меню не созданы.

Каждый элемент строки меню — выпадающее меню (drop-down menu ) — это объект класса Menu.

Затем определяем каждое выпадающее меню, создавая его пункты. Каждый пункт меню — это объект класса Menuitem.

Класс Menu расширяет класс Menuitem, а не наоборот. Это означает, что меню само является пунктом меню, и позволяет задавать меню в качестве пункта другого меню, тем самым организуя вложенные подменю.

Команды меню типа Menuitem порождают события типа ActionEvent, поэтому нужно присоединить к ним объект класса-слушателя как к обычным компонентам.

Всплывающее меню (popup menu) появляется обычно при нажатии или отпускании правой или средней кнопки мыши и является контекстным (context) меню. В языке Java всплывающее меню — объект класса РорupMenu. Этот класс расширяет класс Menu, следовательно, наследует все свойства меню и пункта меню MenuItem. Присоединяется к определенному компоненту.

42) Апплеты. Передача параметров в апплет

Кроме приложений, язык Java позволяет создавать апплеты (applets). Это программы, работающие в среде браузера. Апплеты не нуждаются в окне верхнего уровня — им служит окно браузера. Их загружает браузер, который сам запускает JVM для выполнения апплета. Эти особенности отражаются на написании программы апплета.

С точки зрения языка Java, апплет — это всякое расширение класса Applet, который, в свою очередь, расширяет класс Panel. Таким образом, апплет — это панель специального вида.

Поскольку JVM не запускает апплет, отпадает необходимость в методе main (), его нет в апплетах.

Начальные действия, обычно выполняемые в конструкторе и методе main, в апплете записываются в метод init класса Applet. Этот метод автоматически запускается исполняющей системой Java браузера сразу же после загрузки апплета.

Метод init () не имеет аргументов, не возвращает значения и должен переопределяться в каждом апплете — подклаccе класса Applet. Обратные действия — завершение работы, освобождение ресурсов — записываются при необходимости в метод destroy, тоже выполняющийся автоматически при выгрузке апплета. Компилятор создает файл class, но воспользоваться для его выполнения интерпретатором java теперь нельзя — нет метода main. Вместо интерпретации надо дать указание браузеру для запуска апплета.

Все указания браузеру даются пометками, тегами (tags), на языке HTML (HyperText Markup Language). В частности, указание на запуск апплета дается в теге <applet>. В нем обязательно задается имя файла с классом апплета параметром code, ширина width и высота height панели апплета в пикселах.

Передача параметров в апплет производится с помощью тегов <param>, располагаемых между открывающим тегом <applet> и закрывающим тегом </applet> в HTML-файле. В тегах <param> указывается название параметра name и его значение value.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]