Платформа Java 2014 1 ст. пр. Овчинников А.

Скачать презентацию Платформа Java 2014 1 ст. пр. Овчинников А. Скачать презентацию Платформа Java 2014 1 ст. пр. Овчинников А.

java_lections.ppt

  • Размер: 5.3 Мб
  • Автор:
  • Количество слайдов: 269

Описание презентации Платформа Java 2014 1 ст. пр. Овчинников А. по слайдам

Платформа Java 2014 1 ст. пр. Овчинников А. Л. Платформа Java 2014 1 ст. пр. Овчинников А. Л.

Основные понятия Java( «Джава» )  — объектно-ориентированный язык программирования,  разработанный компанией SunОсновные понятия Java( «Джава» ) — объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems (в последующем приобретённой компанией Oracle). Java называют не только сам язык, но и платформу для создания и исполнения приложений на основе данного языка.

Программы на Java транслируются в байт-код ,  выполняемый виртуальной машиной Java  (JVM)Программы на Java транслируются в байт-код , выполняемый виртуальной машиной Java (JVM) — программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор.

2014 4

2014 5

Основные понятия(продолжение) Достоинства  • Полная независимость байт-кода от операционной системы и оборудования Основные понятия(продолжение) Достоинства • Полная независимость байт-кода от операционной системы и оборудования – возможность выполнять Java-приложения на любом устройстве, для которого существует соответствующая виртуальная машина. • Гибкая система безопасности — исполнение программы полностью контролируется виртуальной машиной. Любые операции, которые превышают установленные полномочия программы (например, попытка несанкционированного доступа к данным или соединения с другим компьютером) вызывают немедленное прерывание. Недостатки • Низкая производительность – по некоторым данным время выполнения на Java составляет в среднем в полтора-два раза больше, чем для C/C++ • Высокие затраты памяти — потребление памяти Java-машиной может быть в 10 -30 раз больше, чем программой на C/C++

Для чего изучать Java? 2014 7 Для чего изучать Java?

Для чего изучать Java? 2014 8 Для чего изучать Java?

Исторические предпосылки • Конец 1980 гг. – начало 1990 гг. основное средство ОО программированияИсторические предпосылки • Конец 1980 гг. – начало 1990 гг. основное средство ОО программирования – С++ – Поздняя стандартизация – Сильная зависимость от реализации и платформы, отсутствие стандарта на бинарное представление – Достаточно высокая сложность – Отсутствие стандартной библиотеки, содержащей средства сетевого и меж процессного взаимодействия и построения графического интерфейса – Классическая модель построения систем – компиляция, связывание, построение образа процесса

Исторические предпосылки (продолжение) • Язык программирования Oak (1991) Джеймс Гослинг( James Gosling),  ПатрикИсторические предпосылки (продолжение) • Язык программирования Oak (1991) Джеймс Гослинг( James Gosling), Патрик Ноутон ( Patrick Naughton), Крис Варт ( Chris Warth ) , Эд Франк( Ed Frank) и Майк Шеридан ( Mike Sheridan) — Sun Microsystems, Inc – Разработка – 18 месяцев (первый компилятор – осень 1991 г. ) – Платформенная независимость, переносимость, виртуальная машина – Первоначальный акцент на «бытовую электронику» , микроконтроллеры – Момент совпал с бурным развитием Internet, WWW – 1993 г. – идея использования в сети Internet

Эволюция Java • 1995 – Oak представлен мировой общественности под именем Java • 1996Эволюция Java • 1995 – Oak представлен мировой общественности под именем Java • 1996 – версия 1. 0 с библиотекой AWT • 1997 – версия 1. 1. x новый механизм обработки событий, расширенная библиотека • 1998 – версия 1. 2 (J 2 SE 1. 2 — Java 2 Platform Standard Edition) – Swing, Коллекции, JIT- компилятор • 2001 – J 2 SE 1. 3, Hot. Spot оптимизация • 2002 – J 2 SE 1. 4 , Асинхронный ввод-вывод • 2004 -2005 – J 2 SE 5. 0 Существенное расширение языка ( emun, boxing/unboxing, generics, foreach etc ) • 2006 — Java SE 6 расширены библиотеки API, добавлены несколько новых пакетов, ряд усовершенствований времени выполнения • 2011 — Java SE 7 — поддержка виртуальной машиной динамических языков, новая библиотека ввода/вывода, новое графическое API , новая JVM • 2014 — Java SE 8 — Лямбда-выражения и дефолтные методы в интерфейсах, Аннотации типов, Java. Script- движок Nashorn , Параллельная сортировка массивов и коллекций, Base 64 декодер ( java. util. Base 64) , Date & Time API (java. time) , Bulk- операции для коллекций ( stream)

Основные принципы Java • Простота • Безопасность • Переносимость, независимость от архитектуры • ООПОсновные принципы Java • Простота • Безопасность • Переносимость, независимость от архитектуры • ООП • Многопоточность • Высокая производительность • Распределенность • Динамичность ( reflection ) • Интерпретируемость (до версии 1. 3)

Цикл разработки и компиляции 2014 13 Цикл разработки и компиляции

Запуск и исполнение 2014 14 Запуск и исполнение

Виртуальная машина Java : байт-код 2014 15 Class. File { u 4 magic; Виртуальная машина Java : байт-код 2014 15 Class. File { u 4 magic; //0 x. CAFEBABE u 2 minor_version; u 2 major_version; // версия формата u 2 constant_pool_count; // размер constant_pool cp_info constant_pool[constant_pool_count-1]; u 2 access_flags; u 2 this_class; u 2 super_class; // информация о типе u 2 interfaces_count; // реализуемые u 2 interfaces[interfaces_count]; // интерфейсы u 2 fields_count; field_info fields[fields_count]; // поля u 2 methods_count; method_info methods[methods_count]; // методы u 2 attributes_count; attribute_info attributes[attributes_count]; // атрибуты }

Виртуальная машина Java : типы данных • boolean ( ограниченная поддержка VM) • byteВиртуальная машина Java : типы данных • boolean ( ограниченная поддержка VM) • byte (8 bit signed), short (16 bit signed) • int (32 bit signed), long (64 bit signed) • char (16 bit unsigned) • float, double (IEEE 754) • return. Address ( только VM, но нет в языке ) • reference type – class type reference – array type reference – interface type reference

Виртуальная машина Java :  runtime  2014 17 JVM Runtime HEAP Constant poolВиртуальная машина Java : runtime 2014 17 JVM Runtime HEAP Constant pool Class loader. Garbage collector. Thread JVM stack PC Frame local vars LIFO operand stack Native stack Method area. Thread JVM stack PC Frame local vars LIFO operand stack

Особенности языка Java • Основан на синтаксисе С • Развитая система типов ( «абстракция»Особенности языка Java • Основан на синтаксисе С • Развитая система типов ( «абстракция» , «инкапсуляция» , «типизация» ) • Одиночное наследование классов и множественное наследование интерфейсов ( «иерархия» ) • Развитая система пакетов ( «модульность» ) • Обработка исключений • Автоматическая сборка мусора • Обеспечение конкурентного доступа к данным при многопоточности ( «параллелизм» ) • Доступ к метаинформации ( reflection api ) • Отсутствие низкоуровнего управления памятью • Развитая библиотека (с поддержкой «сохраняемости» )

Библиотека Java (1. 0) • java. lang библиотека языковой поддержки • java. util утилитыБиблиотека Java (1. 0) • java. lang библиотека языковой поддержки • java. util утилиты • java. io ввод-вывод • java. net средства работы с сетью • java. applet апплеты • java. awt библиотека графического интерфейса

Особенности Java 1. 1  • inner classes • java beans • internationalization •Особенности Java 1. 1 • inner classes • java beans • internationalization • new GUI event model (listeners-adapters) • new AWT (Abstract Window Toolkit) • поддержка jar в апплетах • serialization • reflection • security • JDBC (Java Database connectivity) • RMI (Remote Method Invocation)

Особенности java 1. 2 (java 2 platform) • переработана библиотека • улучшенный ввод выводОсобенности java 1. 2 (java 2 platform) • переработана библиотека • улучшенный ввод вывод • расширенные коллекции • перестроена система безопасности • JFC (Java Foundation Classes) : – Swing – Pluggable look and feel – поддержка Accessibility – drag and drop – Java

Особенности Java 1. 3 (java 2 platform) 2014 22 Особенности Java 1. 3 (java 2 platform)

2014 23

Особенности Java 1. 5 (java 2 platform) • Обобщенное программирование ( Generics ) •Особенности Java 1. 5 (java 2 platform) • Обобщенное программирование ( Generics ) • Алгоритмические усовершенствования: – Autoboxing/Unboxing – Усовершенствование синтаксиса циклов – Поддержка произвольного количества аргументов в методах ( Varargs ) • Статический импорт • Поддержка метаданных ( Annotations ) • Улучшение производительности • Улучшения в системе отладки и мониторинга за java процессами

Особенности Java 1. 6 (java 2 platform) • Поддержка веб севисов ( Web Services)Особенности Java 1. 6 (java 2 platform) • Поддержка веб севисов ( Web Services) • Поддержка scripting • Java DB • Расширенная диагностика • «Компиляция на лету» доступ к компилятору через API • Множество новых возможностей в библиотеке ( JSR)

2014 26 Java Platform Standard Edition 7 2014 26 Java Platform Standard Edition

Платформа J 2 EE (enterprise edition) 2014 27 • Java Platform, Enterprise Edition, сокращенноПлатформа J 2 EE (enterprise edition) 2014 27 • Java Platform, Enterprise Edition, сокращенно Java EE (до версии 5. 0 — Java 2 Enterprise Edition или J 2 EE) — набор спецификаций и соответствующей документации для языка Java, описывающей архитектуру серверной платформы для задач средних и крупных предприятий. • J 2 EE является промышленной технологией и в основном используется в высокопроизводительных проектах, в которых необходима надежность, масштабируемость, гибкость.

Платформа J 2 EE (enterprise edition) 2014 28 Платформа J 2 EE (enterprise edition)

Платформа J 2 ME (Micro Edition) • Java Platform,  Micro Edition (Java ME,Платформа J 2 ME (Micro Edition) • Java Platform, Micro Edition (Java ME, ранее — Java 2 Micro Edition, J 2 ME) — подмножество платформы Java для устройств, ограниченных в ресурсах , например: сотовых телефонов, карманных персональных компьютеров, ресиверов цифрового телевидения, проигрывателей дисков Blu-ray. • Отличительными особенностями устройств с ограниченными ресурсами являются ограниченная вычислительная мощность , ограниченный объём памяти , малый размер дисплея , питание от портативной батареи, а также низкоскоростные и недостаточно надёжные коммуникационные возможности.

Платформа J 2 ME (Micro Edition) 2014 30 (CLDC) Connected Limited Device Configuration (CDC)Платформа J 2 ME (Micro Edition) 2014 30 (CLDC) Connected Limited Device Configuration (CDC) Connected Device Configuration (MIDP) Mobile Information Device Profile (KVM) K virtual machine

Платформа Java. FX • Java. FX — это платформа для создания Rich Internet ApplicationsПлатформа Java. FX • Java. FX — это платформа для создания Rich Internet Applications (RIAs), которая позволяет создавать приложения для персонального компьютера, браузера и мобильного телефона. Технология Java. FX представляет собой инструмент для работы с мультимедийным контентом и графическим интерфейсом пользователя. • Приложения Java. FX создаются с помощью декларативного языка программирования Java. FX Script. Из кода, написанного на языке Java. FX Script, можно обращаться к любым библиотекам Java. Совместное использование языков Java и Java. FX Script позволяет решать разнообразные задачи, например, логика бизнес-приложения может быть написана на Java, а графический интерфейс пользователя — на Java. FX Script.

Платформа Java. FX 2014 32 Платформа Java. FX

Первая программа ( Hello world ) // file Hello. java public class Hello {Первая программа ( Hello world ) // file Hello. java public class Hello { public static void main( String args[] ) { System. out. println(“Hello World!”); System. out. println(“My arguments: ”); for (int i = 0; i javac Hello. java C: \. . . >java Hello one two three fore five

ОСНОВЫ ЯЗЫКА JAVA 2014 34 ОСНОВЫ ЯЗЫКА JAV

2014 http: //docs. oracle. com/javase/specs/jls/se 7/html/index. html 35 Лексическая структура JAVA программы • Текст2014 http: //docs. oracle. com/javase/specs/jls/se 7/html/index. html 35 Лексическая структура JAVA программы • Текст единицы компиляции состоит из символов Unicode(www. unicode. org) (используется версия 4. 0 ) • Первичная трансляция (обработка) исходного включает следующие этапы: 1) расширение escape- последовательностей вида \u. XXXX , где X – шестнадцатеричные символы 2) трансляция потока полученного на шаге 1 в последовательность входных символов и терминаторов строки ( LF, CR ) 3) трансляция потока полученного на шаге 2 в последовательность входных элементов, которая, после удаления комментариев и пробелов состоит из лексем и терминальных символов грамматики

2014 36 Escape последовательности unicode  Unicode. Input. Character: Unicode. Escape Raw. Input. Character2014 36 Escape последовательности unicode Unicode. Input. Character: Unicode. Escape Raw. Input. Character Unicode. Escape: \ Unicode. Marker Hex. Digit Unicode. Marker: u Unicode. Marker u Raw. Input. Character: any Unicode character Hex. Digit: one of 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F Учитывается “ четность ” количества символов ‘\’ , и номер прохода: “ \\u 2297=\u 2297” транслируется в “ \ u 2 2 9 7 = “ “ \ u 005 Cu 005 A” транслируется в “ \ u 0 0 5 A” , но не в “z”(005 C код \ )

2014 37 Специальные символы Line. Terminator:  the ASCII LF character, also known as2014 37 Специальные символы Line. Terminator: the ASCII LF character, also known as «newline» the ASCII CR character, also known as «return» the ASCII CR character followed by the ASCII LF character Input. Character: Unicode. Input. Character but not CR or LF White. Space: the ASCII SP character, also known as «space» the ASCII HT character, also known as «horizontal tab» the ASCII FF character, also known as «form feed» Line. Terminator

2014 38 Последовательность входных элементов Input:  Input. Elements opt  Sub opt Input.2014 38 Последовательность входных элементов Input: Input. Elements opt Sub opt Input. Elements: Input. Elements Input. Element: White. Space Comment Token: Identifier Keyword Literal Separator Operator Sub: the ASCII SUB character, also known as «control-Z»

2014 39 Комментарии в тексте программы /** многострочный документирующий комментарий java * / /*2014 39 Комментарии в тексте программы /** многострочный документирующий комментарий java * / /* традиционный многострочный комментарий в стиле C * / // традиционный комментарий в стиле C++ • Комментарии не могут быть вложенными. • символы /* и */ не имеют специального значения в комментариях, начинающихся с символов //. • символы // не имеют специального значения в комментариях, начинающихся с символов /* или /**. /* Данный комментарий /* // /** оканчивается здесь : */

2014 40 Идентификаторы Identifier:  Identifier. Chars but not a Keyword or Boolean. Literal2014 40 Идентификаторы Identifier: Identifier. Chars but not a Keyword or Boolean. Literal or Null. Literal Identifier. Chars: Java. Letter Identifier. Chars Java. Letter. Or. Digit Java. Letter: any Unicode character that is a Java letter Java. Letter. Or. Digit: any Unicode character that is a Java letter-or-digit Символы Java включают в себя ASCII символы A-Z (\u 0041 -\u 005 A), a-z (\u 0061 -\u 007 A), _ (\u 005 F), $ (\u 0024) Цифры Java включают цифры ASCII 0 -9 (\u 0030 -\u 0039)

2014 41 Идентификаторы • Два идентификатора совпадают только если совпадают Unicode коды всех символов2014 41 Идентификаторы • Два идентификатора совпадают только если совпадают Unicode коды всех символов из которых они состоят • Символы в идентификаторе могут иметь одинаковое начертание, но различаться по кодам: – LATIN CAPITAL LETTER A (A, \u 0041) и GREEK CAPITAL LETTER ALPHA (A, \u 0391) – LATIN SMALL LETTER A (a, \u 0061), and CYRILLIC SMALL LETTER A (a, \u 0430) • Примеры допустимых идентификаторов: String i 3 Αρετη MAX_VALUE is. Letter. Or. Digit

2014 42 Ключевые слова abstract continue for new switch assert default if package synchronized2014 42 Ключевые слова abstract continue for new switch assert default if package synchronized boolean do goto private this break double implements protected throw byte else import public throws case enum instanceof return transient catch extends int short try char final interface static void class finally long strictfp volatile const float native super while Слова goto и const зарезервированы(не используются). true , false и null технически являются литерными константами

2014 43 Литералы ( literals ) Literal:  Integer. Literal Floating. Point. Literal Boolean.2014 43 Литералы ( literals ) Literal: Integer. Literal Floating. Point. Literal Boolean. Literal Character. Literal String. Literal Null. Literal Литералы типа int (диапазон от – 2 31 до 2 31 ): 0 2 0372 0 x. Dada. Cafe 1996 0 x 00 FF Литералы типа long (диапазон от – 2 63 до 2 63 ): 0 l 0777 L 0 x 10000 L 2147483648 L 0 x. C 0 B 0 L

2014 44 Литералы ( literals ) Литералы типа float: 1 e 1 f 2.2014 44 Литералы ( literals ) Литералы типа float: 1 e 1 f 2. f . 3 f 0 f 3. 14 f 6. 022137 e+23 f Литералы типа double: 1 e 1 2. . 3 0. 0 3. 14 1 e-9 d 1 e 137 Символьные литералы: ‘a’ ‘%’ ‘\t’ ‘\\’ ‘\» ‘\u 03 a 9’ ‘\u. FFFF’ ‘\177’ ‘ ‘ для LF и CR необходимо использовать ‘\n’ и ‘\r’ Строковые литералы: «» // пустая строка «\»» // строка содержащая символ » «This is a string» // строка из 16 символов «This is a » + // константное выражение , сформированное «two-line string» // из двух строковых литералов

2014 ! Оператор == сравнивает ссылаются ли две ссылки на один и тот же2014 ! Оператор == сравнивает ссылаются ли две ссылки на один и тот же объект 45 Строковые литералы и объекты Stringpackage test; class Test { public static void main(String[] args) { String hello = «Hello», lo = «lo»; System. out. print((hello == «Hello») + » «); System. out. print((Other. hello == hello) + » «); System. out. print((other. Other. hello == hello) + » «); System. out. print((hello == («Hel»+»lo»)) + » «); System. out. print((hello == («Hel»+lo)) + » «); System. out. println(hello == («Hel»+lo). intern()); } } class Other { static final String hello = «Hello»; } package other; public class Other { public final static String hello = «Hello»; }

2014 46 Разделители и операторы Separator: one of (  )  { 2014 46 Разделители и операторы Separator: one of ( ) { } [ ] ; , . Operator: one of = > < ! ~ ? : == = != && || ++ — + — * / & | ^ % <> >>> += -= *= /= &= |= ^= %= <>>=

2014 47 Типы и значения выражений Primitive. Type:  Numeric. Type boolean Numeric. Type:2014 47 Типы и значения выражений Primitive. Type: Numeric. Type boolean Numeric. Type: Integral. Type Floating. Point. Type Integral. Type: one of byte short int long char Floating. Point. Type: one of float double Reference. Type: Class. Or. Interface. Type Array. Type Class. Or. Interface. Type: Class. Type Interface. Type Class. Type: Type. Name Interface. Type: Type. Name Array. Type: Type [ ] Type: Primitive. Type Reference. Type

2014 48 Диапазоны значений Значения интегрального типа являются целыми числами следующих диапазонов : 2014 48 Диапазоны значений Значения интегрального типа являются целыми числами следующих диапазонов : • Для byte , от -128 до 127, включительно • Для short , от -32768 до 32767, включительно • Для int , от -2147483648 до 2147483647, включительно • Для long , от -9223372036854775808 до 9223372036854775807, включительно • Для char , от ‘\u 0000’ до ‘\uffff’ включтельно, т. е. , от 0 до 65535 Для типов с плавающей точкой диапазоны значений регулируются стандартом ANSI/IEEE Standard 754 -1985. Существуют специальные значения Float. Na. N и Double. Na. N

2014 49 Типы значений в выражениях • При вычислении выражений аргументы оператора приводятся к2014 49 Типы значений в выражениях • При вычислении выражений аргументы оператора приводятся к одному типу, при этом более простой тип приводится к более сложному путем продвижения ( byte-> short -> int ->long; float -> double; int->float или double ) : short c = 456; double d = 3. f / 2 + (c + 100000); • Будьте осторожны при вычислениях с плавающей точкой: double d = 31/5 + 6 * ( 1 / 5); // d == 6. 0 !!!!!! double d = ((double)31)/5 + 6 * (1. / 5); // d == 7. 4 — Ok • Будьте осторожны при вычислениях близких к границам значений с плавающей точкой ( positive and negative zero, positive and negative infinity ) • Будьте осторожны при вычислениях в которых часть выражения может достичь значения Na. N.

2014 50 Потеря информации преобразованиях • Сужающие преобразования происходят при необходимости присвоения переменной более2014 50 Потеря информации преобразованиях • Сужающие преобразования происходят при необходимости присвоения переменной более узкого типа значения выражения более широкого типа: – byte в char – short в byte или char – char в byte или short – int в byte, short, или char – long в byte, short, char, или int – float в byte, short, char, int, или long – double в byte, short, char, int, long, или float short s = 1000 * 100; // > 32767 result: -31072 int i = ((int) (100000 L * 5)) / 100;

2014 51 Блоки кода • Блоки кода служат для группировки нескольких операторов ( statement2014 51 Блоки кода • Блоки кода служат для группировки нескольких операторов ( statement ) и используются для задания тел классов, методов, блоков статической и динамической инициализации, областей перехвата исключений, блоков синхронизации, а также для задания частей сложных операторов (ветвления, выбора, цикла) • Начало и конец блока задается разделителями { } • Блоки могут содержать: – объявления и инициализаторы локальных переменных – объявления локальных типов (классов и интерфейсов) – выражения и операторы языка – вложенные блоки • Область видимости локальных переменных ограничена пределами блока

2014 52 Блоки (спецификация) Block:  { Block. Statements opt } Block. Statements: 2014 52 Блоки (спецификация) Block: { Block. Statements opt } Block. Statements: Block. Statements Block. Statement: Local. Variable. Declaration. Statement Class. Declaration Statement Local. Variable. Declaration. Statement: Local. Variable. Declaration ; Local. Variable. Declaration: final opt Type Variable. Declarators: Variable. Declarators , Variable. Declarator: Variable. Declarator. Id =Variable. Initializer Variable. Declarator. Id: Identifier Variable. Declarator. Id [ ] Variable. Initializer: Expression Array. Initializer

2014 53 Оператор выбора if • Служит для задания альтернативных веток исполнения кода: public2014 53 Оператор выбора if • Служит для задания альтернативных веток исполнения кода: public static int abs (int value) { if (value >= 0) return value; // может стоять блок { } else return –value; // может стоять блок { } } • Условное выражение в скобках всегда должно иметь тип boolean • Вложенный оператор if: if (i == 10) { if (j 100) c = d; // этот оператор if else a = c; // связан с этим оператором else } else a = d; // а этот else относится к if (i == 10)Операторы

2014 54 Цепочка if-else-if if (  условие  )  оператор ; else2014 54 Цепочка if-else-if if ( условие ) оператор ; else if ( условие ) оператор ; . . else оператор ; int month = 4; String season; if (month==12 || month ==1 || month == 2) season = “ зимний ” ; else if (month >=3 && month 5 && month 8 && month < 12) season = “ осенний ” ; else season = “ неправильно заданный ” ; System. out. println(“ Апрель — ” + season + “ месяц. ”) ;

2014 55 Оператор выбора switch • switch  лучшая альтернатива if-else-if  если нужна2014 55 Оператор выбора switch • switch лучшая альтернатива if-else-if если нужна проверка на конкретные значения switch ( выражение ) { case значение 1 : // последовательность операторов break; case значение 2 : // последовательность операторов break; … case значение N : // последовательность операторов break; default: // последовательность операторов по умолчанию }

2014 56 Итерационный оператор while • Используется для повторения действий пока выполняется условие •2014 56 Итерационный оператор while • Используется для повторения действий пока выполняется условие • Может быть прерван оператором break; • Может быть продолжен оператором continue; while ( условие ) { // тело цикла } // пример: int n = 10; while ( n > 0) { n—; System. out. println(“ шаг ” + n); if (n == 5 ) continue; if (n == 3) break; }

2014 57 Итерационный оператор do - while • Если нужно выполнить тело цикла хотя2014 57 Итерационный оператор do — while • Если нужно выполнить тело цикла хотя бы раз вне зависимости от результата проверки условия, то можно воспользоваться конструкцией do – while: do { // последовательность операторов } while ( условие );

2014 58 Итерационный оператор for • Используется для объединения условия, инициализации и операции над2014 58 Итерационный оператор for • Используется для объединения условия, инициализации и операции над переменными цикла for ( ининциализация ; условие ; итерация ) { // тело цикла } // пример: for (int i = 0; i < 10; i++) { System. out. println(“ шаг ” + i); } • Как и любой другой цикл, цикл for можно прервать с помощью оператора break и продолжить с помощью continue

2014 59 Использование меток • Метка имеет видимость только внутри непосредственно объемлющего ее блока2014 59 Использование меток • Метка имеет видимость только внутри непосредственно объемлющего ее блока • Метки могут используются для выхода из глубоко вложенных циклов void do. Something () { first: for(int i = 0; i < 10; i++) { second: for (int j = 0; j < 10; j++) { if( j == 5 ) break second; if( i == 6 ) break first; } } }

2014 60 Последовательность исполнения • Программа выполняется последовательно оператор за оператором ( statement )2014 60 Последовательность исполнения • Программа выполняется последовательно оператор за оператором ( statement ) • Операторы могут содержать в себе другие операторы, а также выражения • Операторы могут завершаться нормально, а могут быть прерваны: – break; break label opt ; — прерывание цикла или switch – continue; continue label opt ; — продолжение цикла – return; return value opt ; — возврат из метода – throw … — явный выброс исключения – а также выброс исключения в процессе вычисления выражения или выполнения оператора

Переменные 1. переменные классов ( class variable - переменная-член объявленная static ) 2. переменныеПеременные 1. переменные классов ( class variable — переменная-член объявленная static ) 2. переменные экземпляра ( instance variable – переменная — член класса объявленная без static) 3. компоненты массивов : int ia[] = new int[3]; ia[0] 4. параметры методов : void do. Some(int i, Object o) {…} 5. параметры конструкторов: My. Class(Object param) {…} 6. параметры перехватчиков исключений: catch(Exception ex) {…} 7. локальные переменные, объявленные внутри методов, блоков, и в операторе for

2014 62 Модификатор final • Переменная объявленная final может быть проинициализирована ровно один раз,2014 62 Модификатор final • Переменная объявленная final может быть проинициализирована ровно один раз, после этого ее значение изменить нельзя. • Если ссылка объявлена с модификатором final, то это не значит, что нельзя изменить состояние объекта на который она ссылается! Нельзя изменить лишь саму переменную ссылочного типа. void unflow(boolean flag) { final int k; if (flag) { k = 3; System. out. println(k); } else { k = 4; System. out. println(k); } } // all ok void unflow(boolean flag) { final int k; if (flag) { k = 3; System. out. println(k); } if (!flag) { k = 4; System. out. println(k); } } //compile-time error!

2014 63 Вызов методов пусть задан класс: public class My. Class { public static2014 63 Вызов методов пусть задан класс: public class My. Class { public static void static. Method. Name() {…} public void method. Name() {…} } • Вызов метода класса (статического): Class. Name. static. Method. Name(); • Вызов метода экземпляра (объекта): Class. Name obj = new Class. Name(); // создание объекта obj. method. Name(); // вызов метода используя ссылку • У объекта можно вызвать статический метод: obj. static. Method. Name(); // вызов статического метода

2014 64 Объекты и значения ссылочного типа Объекты - экземпляры классов ( class instance2014 64 Объекты и значения ссылочного типа Объекты — экземпляры классов ( class instance ) и массивы. Class. Instance. Creation. Expression: new Class. Or. Interface. Type ( Argument. List opt ) Class. Body opt Primary. new Identifier ( Argument. List opt ) Class. Body opt Argument. List: Expression Argument. List , Expression // Создание объектов – экземпляров классов class My. Class implements My. Interface {…} My. Class my. Obj = new My. Class(); My. Interface another. Obj = new My. Class(“parameter”); My. Class refl. Obj = (My. Class)Class. for. Name(“My. Class”). new. Instance();

2014 65 Операции над ссылками доступ к полю :  obj. x = 10;2014 65 Операции над ссылками доступ к полю : obj. x = 10; super. y = 20; вызов метода : obj. do. Some(); super. do. Another(); преобразование типа: (Object)obj строковый оператор + : String s = “one” + obj; // вызывается метод obj. to. String(); оператор проверки типа instanceof: if (obj instanceof My. Class) {…} // Проверяется тип obj операторы сравнения ссылок == и !=: if (obj == obj 2 && obj != obj 3) {…} условный тернарный оператор ? : obj = ( obj 2. size() < obj 3. size() ) ? obj 2: obj 3;

2014 66 Объекты – массивы: грамматика. Array. Creation. Expression:  new Primitive. Type Dim.2014 66 Объекты – массивы: грамматика. Array. Creation. Expression: new Primitive. Type Dim. Exprs Dims opt new Type. Name Dim. Exprs Dims opt new Primitive. Type Dims Array. Initializer new Type. Name Dims Array. Initializer Dim. Exprs: Dim. Exprs Dim. Expr: [ Expression ] Dims: [ ] Dims [ ] Индексация элементов массива начинается с 0 а не с 1 !!! Диапазон допустимых значений индекса – от 0 до length —

2014 67 Создание и инициализация массивов // Создание массивов примеры: // Создание объекта –2014 67 Создание и инициализация массивов // Создание массивов примеры: // Создание объекта – массива из трех ссылок на объекты типа My. Class array[] = new My. Class[3]; // Инициализация элемента массива (ссылки): array[0] = new My. Class(); // Создание объекта – массива из двух ссылок на объекты-массивы // ссылок на объекты класса My. Class array 2[][] = new My. Class[2][]; // Инициализация элементов 0 и 1 массива array 2[0] = new My. Class[5]; // объект – массив из 5 ссылок array 2[1] = new My. Class[4]; // объект – массив из 4 ссылок // Объект — массив из трех элементов типа int array 3[] = new int[ 3 ]; array 3[0] = 0; // Создание и инициализация массива из четырех элементов int array 4 [] = new int [] {1, 2, 3, 4}; // Создание и инициализация объекта-массива ссылок на объекты // класса My. Class array 5[] = {new My. Class(“a”), new My. Class(“b”)};

2014 68 Особенности использования массивов Члены объектов-массивов:  public final int length  это2014 68 Особенности использования массивов Члены объектов-массивов: public final int length это поле содержит длину массива public Object clone() – создает копию массива + все методы класса Object. Любой массив можно привести к классу Object или к массиву совместимого типа. class Test { public static void main(String[] args) throws Throwable { int ia[][] = { { 1 , 2}, null }; int ja[][] = (int[][]) ia. clone(); System. out. print( (ia == ja) + » «); System. out. println(ia[0] == ja[0] && ia[1] == ja[1]); } } // this program prints: false true

2014 69 Особенности использования массивов class Point { int x, y; } class Colored.2014 69 Особенности использования массивов class Point { int x, y; } class Colored. Point extends Point { int color; } class Test { public static void main(String[] args) { Colored. Point[] cpa = new Colored. Point[10]; Point[] pa = cpa; System. out. println(pa[1] == null); try { pa[0] = new Point(); } catch (Array. Store. Exception e) { System. out. println(e); } } }

2014 70 Классы объявляют новый ссылочный тип и определяют его реализацию Вложенный ( nested2014 70 Классы объявляют новый ссылочный тип и определяют его реализацию Вложенный ( nested ) класс – это класс объявленный внутри другого класса или интерфейса (в том числе класс объявленный внутри метода или блока): member class – объявленный внутри класса local class – объявленный внутри метода anonymous class – не имеющий имени Верхнеуровневый ( top-level ) класс – это класс, не являющийся вложенным Именованные ( named ) классы могут быть абстрактными

2014 71 Классы Каждый класс кроме Object является наследником другого класса и может реализовывать2014 71 Классы Каждый класс кроме Object является наследником другого класса и может реализовывать ( implements) произвольное количество интерфейсов Тело класса может содержать: члены ( members ): поля методы вложенные классы и интерфейсы инициализаторы экземпляра статические инициализаторы конструкторы Видимость членов и конструкторов регулируется модификаторами доступа public , private , protected

2014 72 Спецификация объявления класса Class. Declaration:  Class. Modifiers opt class Identifier Super2014 72 Спецификация объявления класса Class. Declaration: Class. Modifiers opt class Identifier Super opt Interfaces opt Class. Body Class. Modifiers: Class. Modifiers Class. Modifier: one of public protected private abstract static final strictfp Super: // Определяет «прямой суперкласс» extends Class. Type Interfaces: // Определяет «прямые суперинтерфейсы» implements Interface. Type. List: Interface. Type. List , Interface. Type

2014 73 Классы и наследование Членами класса являются унаследованные и определенные в классе члены2014 73 Классы и наследование Членами класса являются унаследованные и определенные в классе члены Вновь объявленные поля могут скрывать поля суперклассов и суперинтерфейсов Вновь объявленные методы могут скрывать , реализовывать или перегружать методы, объявленные в суперклассе или суперинтерфейсе Вложенные классы бывают статическими и внутренними ( inner ), в зависимости от контекста в котором они объявлены

2014 74 Методы описывают участки кода, которые могут быть вызваны с помощью выражения вызова2014 74 Методы описывают участки кода, которые могут быть вызваны с помощью выражения вызова метода Метод класса исполняется в контексте переменных класса ( static context ) Метод экземпляра исполняется в контексте конкретного объекта, доступного по this Методы не имеющие реализации должны быть объявлены abstract Допускается перегрузка методов по списку и типам аргументов Метод может иметь платформенно-зависимую реализацию ( native method )

2014 75 Поля и методы класса и экземпляра 2014 75 Поля и методы класса и экземпляра

2014 76 Конструкторы и инициализаторы Инициализаторы экземпляра – блоки кода {…} выполняемые  при2014 76 Конструкторы и инициализаторы Инициализаторы экземпляра – блоки кода {…} выполняемые при инициализации объекта. Выполняются перед вызовом конструктора. Статические инициализаторы – статические блоки кода static {…} выполняемые при первом использовании класса (после его загрузки но перед созданием первого объекта или доступом к полю) Конструкторы в отличие от методов не могут быть вызваны непосредственно с помощью выражения вызова метода. Конструкторы вызываются при создании экземпляров объектов и могут быть перегружены

2014 77 Пример объявления класса public abstract class My. Class extends Parent implements My.2014 77 Пример объявления класса public abstract class My. Class extends Parent implements My. Interface, Another. Interface { static { //Static initializer } { //Non static initializer } public My. Class() { super(); // Вызов конструктора супер класса } }

2014 78 Модификаторы объявления класса public – класс доступен извне пакета.  abstract –2014 78 Модификаторы объявления класса public – класс доступен извне пакета. abstract – класс является абстрактным (в нем есть абстрактные методы) final – класс является конечным в иерархии наследования. От него нельзя унаследовать другой класс strictfp – для всех методов класса действуют правила строгой проверки арифметических выражений во время вычислений Для вложенных(внутренних) классов дополнительно действуют следующие модификаторы: static – класс является статическим (вложенный класс) protected – к классу имеют доступ только классы наследники объемлющего класса или классы в том же пакете private – к классу имеет доступ только объемлющий класс

2014 79 Модификаторы объявления класса Modifier Class Package Subclass World public Y Y protected2014 79 Модификаторы объявления класса Modifier Class Package Subclass World public Y Y protected Y Y Y N no modifier Y Y N N private Y N N NДоступность членов класса в соответствии с модификаторами : Modifier Alpha Beta Alphasub Gamma public Y Y protected Y Y Y N no modifier Y Y N N private Y N N NДоступность членов класса Alpha:

2014 80 Абстрактные классы Класс C  является абстрактным, если:  C  явно2014 80 Абстрактные классы Класс C является абстрактным, если: C явно содержит объявление абстрактного метода Какой-либо класс-родитель C содержит объявление абстрактного метода, который не был реализован в классе C или в его родительских классах «Прямой суперинтерфейс» C определяет или наследует метод, который не реализован (и поэтому является абстрактным) , т. е. ни C ни его родительские классы не определяют реализацию этого метода

2014 81 Абстрактные классы abstract class Point { int x = 1, y =2014 81 Абстрактные классы abstract class Point { int x = 1, y = 1; void move(int dx, int dy) { x += dx; y += dy; alert(); } abstract void alert(); } abstract class Colored. Point extends Point { int color; } class Simple. Point extends Point { void alert() { } } Point p = new Point(); // compile-time error Point p = new Simple. Point(); // correct.

2014 82 Внутренние ( inner )  классы Внутренний ( inner )  класс2014 82 Внутренние ( inner ) классы Внутренний ( inner ) класс – это класс который ни явно, ни неявно не является static Внутренние классы могут быть : локальными , анонимными и не статическими членами Внутренний класс не может содержать блоков статической инициализации или членов-интерфейсов Внутренний класс не может содержать статических членов за исключением полей-констант времени компиляции Внутренние классы могут наследовать статические члены, не являющиеся константами времени компиляции Члены-интерфейсы всегда являются static по умолчанию Вложенные(не внутренние) классы могут свободно содержать статические члены как и обычные классы Java

2014 83 Пример вложенности классов class Has. Static  { static int j =2014 83 Пример вложенности классов class Has. Static { static int j = 100; } class Outer { class Inner extends Has. Static { static final int x = 3; // ok — compile-time constant static int y = 4; // compile-time error, an inner class } static class Nested. But. Not. Inner{ static int z = 5; // ok, not an inner class } interface Never. Inner{} // interfaces are never inner }

2014 84 Статический контекст Выражение находится в статическом контексте ,  тогда и только2014 84 Статический контекст Выражение находится в статическом контексте , тогда и только тогда, когда наиглубочайший включающий его метод, конструктор, блок инициализации или инициализатор поля является статическим методом, статическим инициализатором или инициализатором статической переменной соответственно. Если в точке объявления класса имеет смысл ссылка this на объект объемлющего класса, то контекст объявления является динамическим ( non static ) и класс будет внутренним.

2014 85 Пример – глубокая вложенность class With. Deep. Nesting  { boolean to.2014 85 Пример – глубокая вложенность class With. Deep. Nesting { boolean to. Be; With. Deep. Nesting(boolean b) { to. Be = b; } class Nested { boolean the. Question; class Deeply. Nested { Deeply. Nested(){ the. Question = to. Be || !to. Be; } } Каждый экземпляр With. Deep. Nesting. Nested. Deeply. Nested имеет объемлющий объект класса With. Deep. Nesting. Nested ( его непосредственно объемлющий объект ) и объемлющий объект – экземпляр класса With. Deep. Nesting ( объемлющий объект ранга 2 ).

2014 86

2014 87 Примеры : Inner. Class. Example, Local. Class. Example, Anonimous. Class. Example class2014 87 Примеры : Inner. Class. Example, Local. Class. Example, Anonimous. Class. Example class Base{ void method 1(){ } void method 2(){ } } class A{ // классверхнегоуровня(объемлющий) static class B{ } // статическийвложенныйкласс class C{ } // внутреннийкласс void f(){ class D{ } // локальныйвнутреннийкласс } void g(){ // анонимныйкласс Basebref= new Base(){ void method 1(){ } }; } }

2014 88 Локальный класс ( Local class ) :  Используется если необходимо создать2014 88 Локальный класс ( Local class ) : Используется если необходимо создать более одного экземпляра этого класса, если необходим доступ к его конструктору, или необходимо определить новый именованный тип. Анонимный класс ( Anonymous class ) : Используется если необходим только один экземпляр класса, если класс используется в месте его создания или сразу после него. Вложенный класс ( Nested class ) : Используется если требования аналогичны случаю локального класса, позволяя сделать тип более широко доступным. Используется если не требуется доступ к локальным переменным класса или параметрам методов. Не-статический вложенный класс ( Inner class ), Используется если необходим доступ к полям и методам объемлющего класса. Использование вложенных классов :

2014 89 Суперклассы и подклассы Класс C является суперклассом класса A  если верно2014 89 Суперклассы и подклассы Класс C является суперклассом класса A если верно одно из следующих утверждений: A является непосредственным подклассом C. Существует класс B такой , что A является подклассом B , и B является подклассом C , применяя это правило рекурсивно. class Point { int x, y; } class Colored. Point extends Point { int color; } final class Colored 3 d. Point extends Colored. Point { int z; } Класс Point является суперклассом класса Colored. Point. Класс Point является суперклассом класса Colored 3 d. Point. Класс Colored. Point является подклассом класса Point. Класс Colored. Point является суперклассом класса Colored 3 d. Point. Класс Colored 3 d. Point является подклассом класса Colored. Point. Класс Colored 3 d. Point является подклассом класса Point.

2014 90 Зависимость между классами Классы и интерфейсы зависят по загрузке от других типов2014 90 Зависимость между классами Классы и интерфейсы зависят по загрузке от других типов (классов и интерфейсов), приведенных в декларации наследования ( extends и implements ) Зависимость типов друг от друга может формировать цепочку: A зависит от B, B зависит от C тогда A зависит от C. class B implements C {…} class A extends B {…} … A the. A = new A(); // Будут загружены интерфейс C и // классы B и A Циклические зависимости вызывают ошибку времени компиляции: class Point extends Colored. Point { int x, y; } class Colored. Point extends Point { int color; } Если цикл обнаружен во время исполнения программы и загрузки классов в JVM, то генерируется исключение Class. Circularity. Error

2014 91 Суперинтерфейсы класса Суперинтерфейсами (родительскими интерфейсами) для класса являются:  Прямые суперинтерфейсы (объявленные2014 91 Суперинтерфейсы класса Суперинтерфейсами (родительскими интерфейсами) для класса являются: Прямые суперинтерфейсы (объявленные implements ) Суперинтерфейсы прямых суперинтерфейсов Суперинтерфесы родительского класса Говорят, что класс реализует все свои суперинтерфейсы У класса может быть несколько прямых суперинтерфейсов: interface One { void do. It(); } interface Two { void do. It(); void do. Another(); } class My. Class implements One, Two { void do. It() {} // Общая реализация для One и Two void do. Another{} }

2014 92 Спецификация объявления тела класса Class. Body:  { Class. Body. Declarations opt2014 92 Спецификация объявления тела класса Class. Body: { Class. Body. Declarations opt } Class. Body. Declarations: Class. Body. Declarations Class. Body. Declaration: Class. Member. Declaration Instance. Initializer Static. Initializer Constructor. Declaration Class. Member. Declaration: Field. Declaration Method. Declaration Class. Declaration Interface. Declaration ;

2014 93 Члены класса Областью видимости члена m ,  объявленного или унаследованного классом2014 93 Члены класса Областью видимости члена m , объявленного или унаследованного классом C , является тело класса C , включая тела всех типов объявленных внутри C. Если C сам по себе является вложенным классом, то объявления одноименных членов ( полей, методов или типов ) m в объемлющих областях видимости (блоках, классах или пакете) будут сокрыты данным членом m класса С. Членами класса являются: Члены, унаследованные от его прямого суперкласса (исключением является класс Object не имеющий суперклассов) Члены, унаследованные от его прямых суперинтерфейсов Члены, объявленные в теле класса Члены класса объявленные private не наследуются подклассами. Конструкторы и инициализаторы не являются членами и не наследуются

2014 94 Пример наследования членов class Point { int x, y;  private Point()2014 94 Пример наследования членов class Point { int x, y; private Point() { reset(); } Point(int x, int y) { this. x = x; this. y = y; } private void reset() { this. x = 0; this. y = 0; } } class Colored. Point extends Point { int color; void clear() { reset(); } // error – reset() is private } // error: Colored. Point() {super(); } –constructor is not visible class Test { public static void main(String[] args) { Colored. Point c = new Colored. Point(0, 0); // error – // Colored. Point has no such constructor c. reset(); // error – reset() is private } }

2014 95 Наследование и доступ по умолчанию package points;  public class Point {2014 95 Наследование и доступ по умолчанию package points; public class Point { int x, y; public void move(int dx, int dy) { x += dx; y += dy; } } package points; public class Point 3 D extends Point { int z; public void move(int dx, int dy, int dz) { x += dx; y += dy; z += dz; } } import points. *; class Point 4 D extends Point 3 D { int w; public void move(int dx, int dy, int dz, int dw) { x+=dx; y+=dy; z+=dz; // compile-time error! w+=dw; } } import points. *; class Point 4 D extends Point 3 D { int w; public void move(int dx, int dy, int dz, int dw) { super. move(dx, dy, dz); //Good! w+=dw; } }

2014 96 Поля -члены класса (спецификация) Field. Declaration:  Field. Modifiersopt Type Variable. Declarators2014 96 Поля -члены класса (спецификация) Field. Declaration: Field. Modifiersopt Type Variable. Declarators ; Variable. Declarators: Variable. Declarators , Variable. Declarator Field. Modifiers: Field. Modifiers Field. Modifier: one of public protected private static final transient volatile

2014 97 Статические поля class Point { int  x ,  y ,2014 97 Статические поля class Point { int x , y , use. Count ; Point( int x, int y) { this. x = x; this. y = y; } final static Point origin = new Point(0, 0); } public class Test { public static void main(String[] args) { Point p = new Point(1, 1); Point q = new Point(2, 2); p. x = 3; p. y = 3; p. use. Count ++; p. origin. use. Count ++; System. out. println( «(» + q. x + «, » + q. y + «)» ); //(2, 2) System. out. println(q. use. Count ); //0 System. out. println(q. origin == Point. origin ); //true System. out. println(q. origin. use. Count ); //1 } } Пример Static. Field

2014 98 Singleton ( объект одиночка ) Данный шаблон используется для обеспечение единственности объекта2014 98 Singleton ( объект одиночка ) Данный шаблон используется для обеспечение единственности объекта определенного класса public class Singleton { private static Singleton instance = null; private Singleton(){} // никто не может вызвать конструктор // все должны использовать данный метод для получения объекта public static Singleton get. Instance() { if (instance == null) { instance = new Singleton(); } return instance; } }

2014 99 Поля-члены, объявленные final Переменные классов( static )  и переменные экземпляров могут2014 99 Поля-члены, объявленные final Переменные классов( static ) и переменные экземпляров могут быть объявлены final Статическая переменная, объявленная final должна быть инициализирована непосредственно при объявлении либо в блоке статической инициализации Переменная экземпляра, объявленная final должна быть проинициализирована непосредственно при объявлении либо в блоке инициализации, либо ей должно быть присвоено значение к концу исполнения каждого конструктора

2014 100 Модификаторы volatile и transient Переменные,  объявленные transient  не являются частью2014 100 Модификаторы volatile и transient Переменные, объявленные transient не являются частью persistent состояния объекта и не сохраняются во время сериализации. class Test { static int i = 0, j = 0; static void one() { i++; j+ +; } static void two() { System. out. println(«i=» + i + » j=» + j); } // может вывести j } // большее, чем i если one и // two будут вызываться // различными потоками в цикле class Test { static volatile int i = 0, j = 0; static void one() { i++; j+ +; } static void two() { System. out. println(«i=» + i + » j=» + j); } // i всегда >= j !!! } Для переменных, объявленных volatile , осуществляется синхронизация локальной и главной копий при каждом обращении к значению переменной в многопоточной среде.

2014 101 Инициализация полей экземпляра происходит каждый раз при создании нового объекта.  Инициализация2014 101 Инициализация полей экземпляра происходит каждый раз при создании нового объекта. Инициализация статических полей класса происходит один раз при первом использовании класса. При инициализации поля экземпляра могут использовать статические поля, т. к. они гарантированно инициализированы к моменту создания объекта При инициализации статические поля класса не могут использовать поля экземпляра, а также ключевые слова this и super Инициализация полей происходит в порядке объявления и в порядке исполнения блоков инициализации. Константы времени компиляции инициализируются первыми. Код конструкторов исполняется в последнюю очередь Стоит избегать зависимости от порядка инициализации полей

2014 102 Разрешение перекрытия полей class Point { static int x = 2; }2014 102 Разрешение перекрытия полей class Point { static int x = 2; } class Test extends Point { static double x = 4. 7; public static void main(String[] args) { new Test(). print. X(); } void print. X() { System. out. println(x + » » + super. x); } } Для доступа к полям, перекрытым при наследовании можно использовать super, а также полную квалификацию ( super. x или Point. x ) Field. Super

2014 103 Множественное перекрытие interface Frob { float v = 2. 0 f; }2014 103 Множественное перекрытие interface Frob { float v = 2. 0 f; } class Super. Test { int v = 3; } class Test extends Super. Test implements Frob { public static void main(String[] args) { new Test(). print. V(); } void print. V() { System. out. println((super. v + Frob. v)/2); } } При множественном перекрытии необходимо использовать полную квалификацию Field. Super

2014 104 Методы Метод определяет участок исполняемого кода, который может быть вызван с передачей2014 104 Методы Метод определяет участок исполняемого кода, который может быть вызван с передачей фиксированного количества параметров определенного типа Method. Declaration: Method. Header Method. Body Method. Header: Method. Modifiers opt Result. Type Method. Declarator Throws opt Result. Type: Type void Method. Declarator: Identifer ( Formal. Parameter. List opt ) В классе может быть объявлен метод, имя которого совпадает с именем члена-поля, вложенного класса, интерфейса или другого метода ( стоит избегать!!! )Спецификация объявления метода

2014 105 Сигнатура метода Методы класса должны различаться по своей сигнатуре.  Сигнатура метода2014 105 Сигнатура метода Методы класса должны различаться по своей сигнатуре. Сигнатура метода определяется его именем, количеством параметров и типами этих параметров Formal. Parameter. List: Formal. Parameter. List , Formal. Parameter: final opt Type Variable. Declarator. Id: Identifier Variable. Declarator. Id [ ] Имена параметров метода должны быть различны Список формальных параметров метода может быть пуст

2014 106 Параметры метода Во время вызова метода вычисленные значения передаваемых аргументов используются для2014 106 Параметры метода Во время вызова метода вычисленные значения передаваемых аргументов используются для инициализации переменных-параметров метода Таким образом всегда имеет место передача «по значению» Область видимости параметра ограничивается методом, в котором он объявлен. При этом доступ к нему осуществляется с помощью обычного имени. Параметры перекрывают собой поля-члены класса, в котором объявлен метод, содержащий эти параметры. Для доступа к перекрытым полям-членам нужно использовать this либо полное квалифицированное имя Параметры типов double и float всегда содержат значения из множества double и float соответственно. Они не могут принимать расширенных значений, появляющихся во время вычисления выражений не являющихся strictfp

2014 107 Модификаторы метода Method. Modifiers:  Method. Modifiers Method. Modifier: one of public2014 107 Модификаторы метода Method. Modifiers: Method. Modifiers Method. Modifier: one of public protected private abstract static final synchronized native strictfp Запрещенные комбинации: два из public, protected, private abstract с любым из: private , static, final, native, strictfp, synchronized native strictfp

2014 108 Абстрактные методы Абстрактный метод определяет сигнатуру и список выбрасываемых исключений для метода,2014 108 Абстрактные методы Абстрактный метод определяет сигнатуру и список выбрасываемых исключений для метода, который должен быть реализован ниже по иерархии наследования Абстрактный класс может перегружать метод, оставляя (или делая) его абстрактным и сохраняя его сигнатуру. При этом может измениться список выбрасываемых исключений. class Buffer. Empty extends Exception {…} class Buffer. Error extends Exception { … } public interface Buffer { char get() throws Buffer. Empty, Buffer. Error; } public abstract class Infinite. Buffer implements Buffer { abstract char get() throws Buffer. Error; }

2014 109 Осторожность при перегрузке abstract class Point { int x, y;  public2014 109 Осторожность при перегрузке abstract class Point { int x, y; public abstract String to. String(); } class Colored. Point extends Point { int color; public String to. String() { // ошибка – вызов абстрактного метода: return super. to. String() + «: color » + color; } }

2014 110 Модификаторы метода (продолжение) В статическом методе не может использоваться ссылка this Ссылки2014 110 Модификаторы метода (продолжение) В статическом методе не может использоваться ссылка this Ссылки super и this могут использоваться только в методах экземпляра (т. е. методах, не объявленных static ) Метод, объявленный final , не может быть перегружен в классах-наследниках. Никакой метод класса, объявленного final не может быть перегружен (так как такой класс не может иметь наследников) и, таким образом, все его методы являются final По своей сути метод, объявленный private является final Компилятор или оптимизатор могут использовать « inline » подстановку для final и private методов, тем самым увеличивая скорость исполнения программы

2014 111 Модификаторы метода (продолжение) native  методы используются для реализации их тела в2014 111 Модификаторы метода (продолжение) native методы используются для реализации их тела в платформенно-зависимой библиотеке, написанной на языке C, C++, и т. д. пример: файл производного доступа package java. io; public class Random. Access. File implements Data. Output, Data. Input { . . . public native void open(String name, boolean writeable) throws IOException; public native int read. Bytes(byte[] b, int off, int len) throws IOException; public native void write. Bytes(byte[] b, int off, int len) throws IOException; public native long get. File. Pointer() throws IOException; public native void seek(long pos) throws IOException; public native long length() throws IOException; public native void close() throws IOException; }

2014 112 Модификаторы метода (окончание) synchronized  методы используются для реализации синхронных классов-серверов (Параллелизм:2014 112 Модификаторы метода (окончание) synchronized методы используются для реализации синхронных классов-серверов (Параллелизм: класс-сервер может быть последовательным, защищенным или синхронным) strictfp определяет метод, в котором все вычисляемые выражения float и double будут FP-strict. Это значит, что все промежуточные результаты вычисления выражения будут являться элементами множества float и double языка java и не могут принадлежать к расширенному набору float или double, которые может предоставлять конкретная платформа для обеспечения высокой точности вычисления выражений с плавающей точкой. При этом всегда будет происходит приведение промежуточного результата к элементу множества float или double , либо возникнет переполнение.

2014 113 Выбрасываемые исключения Список throws  определяет исключения, которые должны обрабатываться при вызове2014 113 Выбрасываемые исключения Список throws определяет исключения, которые должны обрабатываться при вызове метода ( checked exceptions ) Throws: throws Class. Type. List: Class. Type. List , Class. Type Класс, объявленный в списке throws должен быть наследником класса Throwable или самим классом Throwable Классы-наследники Runtime. Exception можно не объявлять в списке throws Классы-наследники Error используются для сигнализации о сбое машины и не должны использоваться в прикладном коде Метод, перегружающий метод родительского класса или реализующий метод интерфейса не может «расширять» список throws

2014 114 Тело метода Method. Body :  Block  ; Метод, не объявленный2014 114 Тело метода Method. Body : Block ; Метод, не объявленный как abstract или native должен иметь тело, являющееся блоком Метод, объявленный void не может содержать оператор вида return Expression ; Метод, объявленный с возвращаемым типом Type должен содержать выражение вида return Expression ; на каждой возможной ветви завершения метода. При этом тип результата вычисления выражения Expression должен быть совместимым с типом Type В случае, если возможная ветвь метода завершается явным выбросом исключения, выражение return Expression ; может быть опущено

2014 115 Перегрузка методов ( Overriding ) Перегрузка методов экземпляра (не статических методов): 2014 115 Перегрузка методов ( Overriding ) Перегрузка методов экземпляра (не статических методов): Метод m 1 класса C перегружает метод m 2 класса A с той же сигнатурой, тогда и только тогда, когда: Класс C является наследником класса A либо m 2 не является private и доступен из C m 1 перегружает m 3 , который перегружает m 2 и отличен от m 1 и m 2 Если m 1 не является abstract , то говорят что он реализует абстрактные методы, которые перегружает. Для доступа к перегруженному методу используется super Приведение к типу суперкласса содержащего объявление перегруженного метода не обеспечивает вызов этого метода (виртуальный полиморфизм) в отличие от обеспечения доступа к сокрытым переменным static , private , final методы не могут быть перегружены

2014 116 Сокрытие методов (Hiding) Если класс декларирует статический метод, то этот метод скрывает2014 116 Сокрытие методов (Hiding) Если класс декларирует статический метод, то этот метод скрывает методы с той же сигнатурой объявленные в его суперклассах Для доступа к сокрытому методу можно использовать выражение со словом super , либо квалифицированное имя, либо приведение к типу класса в котором этот метод объявлен. В этом случае сокрытые методы ведут себя также как и сокрытые поля Статический метод не может скрывать метод экземпляра (не являющийся статическим)

2014 117 Требования к перегрузке и сокрытию Перегружаемые и скрываемые методы должны совпадать не2014 117 Требования к перегрузке и сокрытию Перегружаемые и скрываемые методы должны совпадать не только по сигнатуре но и по возвращаемому значению Перегружающий или перекрывающий метод должен иметь такой же, либо более открытый уровень доступа: public -> public protected -> protected, public package(default ) -> package(default ), protected , public private методы не наследуются и не перегружаются поэтому могут иметь совпадающую сигнатуру, но разные возвращаемые значения и не совместимые списки throws на разных уровнях абстракции

2014 118 Наследование нескольких методов с одинаковой сигнатурой не всегда приводит к ошибке. При2014 118 Наследование нескольких методов с одинаковой сигнатурой не всегда приводит к ошибке. При этом возможны следующие варианты: Если один из методов не является абстрактным, то: Если этот метод static то возникает ошибка времени компиляции Иначе этот метод реализует ( implements ) или перегружает все унаследованные методы. Если при этом выявляется несовместимость по возвращаемому значению или списку исключений, то возникает ошибка времени компиляции Если метод абстрактный, то и класс является абстрактным и при этом говорят , что данный метод перегружает все унаследованные методы. При этом также проверяется совместимость по возвращаемому значению и списку выбрасываемых исключений В языке java не может возникнуть ситуация, когда два из наследуемых методов с одинаковой сигнатурой не являются абстрактными ( т. к. одиночное наследование )

2014 119 Overloading, Overriding, and Hiding class Point { int x = 0, y2014 119 Overloading, Overriding, and Hiding class Point { int x = 0, y = 0; int color; void move(int dx, int dy) { x += dx; y += dy; } } class Real. Point extends Point { float x = 0. 0 f, y = 0. 0 f; // hiding x and y // overriding move void move(int dx, int dy) { move((float)dx, (float)dy); } //overloading move void move(float dx, float dy) { x += dx; y += dy; } }

2014 120 Некорректное перекрытие class Point { int x = 0, y = 0,2014 120 Некорректное перекрытие class Point { int x = 0, y = 0, color; void move(int dx, int dy) { x += dx; y += dy; } int get. X() { return x; } int get. Y() { return y; } } class Real. Point extends Point { float x = 0. 0 f, y = 0. 0 f; void move(int dx, int dy) { move((float)dx, (float)dy); } void move(float dx, float dy) { x += dx; y += dy; } float get. X() { return x; } float get. Y() { return y; } }

2014 121 Вызов перегруженных методов class Super { static String greeting() { return Goodnight;2014 121 Вызов перегруженных методов class Super { static String greeting() { return «Goodnight»; } String name() { return «Richard»; } } class Sub extends Super { static String greeting() { return «Hello»; } String name() { return «Dick»; } } class Test { public static void main(String[] args) { Super s = new Sub(); System. out. println(s. greeting() + «, » + s. name() ); } }

2014 122 Несоответствие списков исключений class Bad. Point. Exception extends Exception { Bad. Point.2014 122 Несоответствие списков исключений class Bad. Point. Exception extends Exception { Bad. Point. Exception() { super(); } Bad. Point. Exception(String s) { super(s); } } class Point { int x, y; void move(int dx, int dy) { x += dx; y += dy; } } class Checked. Point extends Point { void move(int dx, int dy) throws Bad. Point. Exception { if ((x + dx) < 0 || (y + dy) < 0) throw new Bad. Point. Exception(); x += dx; y += dy; } }

2014 123 Интерфейсы Interface. Declaration:  Interface. Modifiers opt interface Identifier Extends. Interfaces opt2014 123 Интерфейсы Interface. Declaration: Interface. Modifiers opt interface Identifier Extends. Interfaces opt Interface. Body Interface. Modifiers: Interface. Modifiers Interface. Modifier: one of public protected private abstract static strictfp Допустимо множественное наследование интерфейсов: Extends. Interfaces: extends Interface. Type Extends. Interfaces , Interface. Type Все интерфейсы являются abstract protected , static , private относятся только к членам-интерфейсам Глобальные (не вложенные) интерфейсы являются public

2014 124 Отношение наследования Интерфейс I напрямую зависит  от  типа  T2014 124 Отношение наследования Интерфейс I напрямую зависит от типа T если T присутствует в списке extends интерфейса I как родительский интерфейс, либо как квалификатор в имени родительского интерфейса. Интерфейс I зависит от ссылочного типа T если выполняется одно из условий : I напрямую зависит от T. I напрямую зависит от класса C который зависит от T. I напрямую зависит от интерфейса J который зависит от T ( применяя правило рекурсивно ). Интерфейс K является родительским (суперинтерфейсом) интерфейса I если выполняется одно из условий : K является прямым суперинтерфейсом I. Существует интерфейс J такой что K является суперинтерфейсом J , и J является суперинтерфейсом I , применяя это правило рекурсивно Интерфейс I называется подинтерфейсом ( subinterface ) интерфейса K , если K является суперинтерфейсом I.

2014 125 Тело и члены интерфейса Interface. Body:  { Interface. Member. Declarations opt2014 125 Тело и члены интерфейса Interface. Body: { Interface. Member. Declarations opt } Interface. Member. Declarations: Interface. Member. Declarations Interface. Member. Declaration: Constant. Declaration Abstract. Method. Declaration Class. Declaration Interface. Declaration ;

2014 126 Члены интерфейса Членами интерфейса являются :  Члены, объявленные в интерфейсе Члены2014 126 Члены интерфейса Членами интерфейса являются : Члены, объявленные в интерфейсе Члены унаследованные от прямых суперинтерфейсов Если у интерфейса нет прямых суперинтерфейсов, то интерфейс по умолчанию (неявно) декларирует public abstract метод m сигнатуры s , возвращаемого типа r , и списка исключений t для каждого public instance метода m сигнатуры s , возвращаемого типа r , и списка исключений t , объявленного в классе Object , кроме таковых объявленных явно в этом интерфейсе. Если интерфейс декларирует метод с той же сигнатурой, но с отличным типом возвращаемого значения либо несовместимым списком исключений то будет ошибка компиляции. Интерфейс наследует от интерфейсов, которые расширяет ( extends ) всех членов этих интерфейсов за исключением полей, классов, интерфейсов которые он скрывает( hides ) и методов, которые перегружает (overrides).

2014 127 Константные поля интерфейсов Constant. Declaration:  Constant. Modifiers opt Type Variable. Declarators2014 127 Константные поля интерфейсов Constant. Declaration: Constant. Modifiers opt Type Variable. Declarators Constant. Modifiers: Constant. Modifiers Constant. Modifer Constant. Modifier: one of public static final Фактически все поля интерфейса являются public static final константами. Декларация данных спецификаторов является избыточной. В случае если интерфейс унаследует два и более поля с одинаковыми именами от своих суперинтерфейсов, ошибка времени компиляции будет иметь место только при попытке обращения к этим полям по простому имени (без полной квалификации).

2014 128 Инициализация полей интерфейсов Каждое поле в теле интерфейса должно быть проинициализировано выражением,2014 128 Инициализация полей интерфейсов Каждое поле в теле интерфейса должно быть проинициализировано выражением, значение которого должно быть вычислено на стадии компиляции. При этом возможно использование в выражении уже проинициализированных полей самого интерфейса или его суперинтерфейсов. Поля инициализируются в порядке их декларации за исключением полей, явно инициализируемых константами. В выражениях инициализации нельзя использовать ключевые слова this и super кроме случая если эти слова используются внутри декларации тела анонимного класса реализующего интерфейс. interface Test { float f = j; // error – j используется до объявления int j = 1; int k = k+1; // error – k инициализируется с использованием k }

2014 129 Неоднозначность при наследовании interface Base. Colors { int RED = 1, 2014 129 Неоднозначность при наследовании interface Base. Colors { int RED = 1, GREEN = 2, BLUE = 4; } interface Rainbow. Colors extends Base. Colors { int YELLOW = 3, ORANGE = 5, INDIGO = 6, VIOLET = 7; } interface Print. Colors extends Base. Colors { int YELLOW = 8, CYAN = 16, MAGENTA = 32; } interface Lots. Of. Colors extends Rainbow. Colors , Print. Colors { int FUCHSIA = 17, VERMILION = 43, CHARTREUSE = RED+90; }

2014 130 Декларация абстрактных методов интерфейса Abstract. Method. Declaration:  Abstract. Method. Modifiers opt2014 130 Декларация абстрактных методов интерфейса Abstract. Method. Declaration: Abstract. Method. Modifiers opt Result. Type Method. Declarator Throws opt ; Abstract. Method. Modifiers: Abstract. Method. Modifiers Abstract. Method. Modifier: one of public abstract Фактически все методы интерфейса являются public abstract , и использование данных спецификаторов является избыточным Будьте осторожны при наследовании интерфейсом от своих суперинтерфейсов методов с одинаковой сигнатурой но несовместимыми возвращаемыми значениями или throws clauses Все члены-классы и члены-интерфейсы , объявленные в интерфейсе , являются static public по умолчанию и не могут быть внутренними (inner)

2014 131 Перечисления ( enum),  начиная с java 1. 5 В отличие от2014 131 Перечисления ( enum), начиная с java 1. 5 В отличие от статических констант, предоставляют типизированный, безопасный способ задания фиксированных наборов значений Являются классами специального вида , не могут иметь наследников, сами в свою очередь наследуются от java. lang. Enum. Не могут быть абстрактными и содержать абстрактные методы, но могут реализовывать интерфейсы Экземпляры объектов перечисления нельзя создать с помощью new , каждый объект перечисления уникален, создается при загрузке перечисления в виртуальную машину, поэтому допустимо сравнение ссылок для объектов перечислений , можно использовать switch Как и обычные классы могут реализовывать поведение, содержать вложенные и внутренние классы-члены

2014 132 Пример public enum Days { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, 2014 132 Пример public enum Days { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY; public boolean is. Weekend() { switch(this) { case SUNDAY: case SATURDAY: return true; default: return false; } } } … System. out. println( Days. MONDAY+” is. Week. End(): “ + Days. MONDAY. is. Weekend() );

2014 133 Перечисления (продолжение) Каждый класс перечисления неявно содержит следующие методы:  values() -2014 133 Перечисления (продолжение) Каждый класс перечисления неявно содержит следующие методы: values() — возвращает массив элементов перечисления (статический метод) ordinal() — возвращает порядковый номер элемента перечисления (в порядке декларации) value. Of(String name) – возвращает элемент перечисления по его строковому имени (статический метод, выбрасывает Illegal. Argument. Exception если нет элемента с указанным именем) Класс перечисления может иметь конструктор ( private либо package ), который вызывается для каждого элемента при его декларации Отдельные элементы перечисления могут реализовывать свое собственное поведение

2014 134 Пример более сложного перечисления public  enum Direction {  FORWARD (1.2014 134 Пример более сложного перечисления public enum Direction { FORWARD (1. 0) { public Direction opposite() { return BACKWARD ; } }, BACKWARD (2. 0) { public Direction opposite() { return FORWARD ; } }; private double ratio ; Direction( double r) { ratio = r; } public double get. Ratio() { return ratio ; } public static Direction by. Ratio( double r) { if (r == 1. 0) return FORWARD ; else if (r == 2. 0) return BACKWARD ; else throw new Illegal. Argument. Exception(); } public abstract Direction opposite(); }

Обобщения ( generics) Позволяют объявлять классы, интерфейсы и методы, где тип данных и ограниченияОбобщения ( generics) Позволяют объявлять классы, интерфейсы и методы, где тип данных и ограничения на него, которыми они оперируют указан в виде параметра Позволяют реализовать код, который будет работать единообразно с разными типами данных В отличие от использования ссылок на тип Object предоставляют безопасные с точки зрения типизации средства обобщенного программирования Спецификация параметра задается явно (классы, интерфейсы и ссылки) или выводится на основании аргументов (вызов методов) Соответствие типа проверяется на стадии компиляции

Простейший пример До java 1. 5: public class Envelope { private Object ref; publicПростейший пример До java 1. 5: public class Envelope { private Object ref; public Envelope (Object arg) { ref = arg; } public Object get() { return ref; } } … Envelope e = new Envelope(new My. Class()); … My. Class m = (My. Class) e. get(); //OK // Class. Cast. Exception in runtime: Another a = (Another) e. get(); Необходимо знать и учитывать объект какого типа был сохранен 2014 136 Начиная с 1. 5 : public class Envelope { private T ref; public Envelope (T arg) { ref = arg; } public T get() { return ref; } } … Envelope e = new Envelope(new My. Class()); … My. Class m = e. get(); // compile time error : Another a = e. get(); Проверка типа осуществляется на стадии компиляции

Спецификация обобщений 2014 137 Class. Declaration:  Normal. Class. Declaration Enum. Declaration Normal. Class.Спецификация обобщений 2014 137 Class. Declaration: Normal. Class. Declaration Enum. Declaration Normal. Class. Declaration: Class. Modifiers opt class Identifier Type. Parameters opt Super opt Interfaces opt Class. Body Type. Parameters : Type. Parameter. List : Type. Parameter. List , Type. Parameter | Type. Parameter: Type. Variable Type. Bound opt Type. Bound: extends Class. Or. Interface. Type Additional. Bound. List opt Additional. Bound. List: Additional. Bound. List Additional. Bound: & Interface. Type

Основные отличия от C++ При объявлении специфической ссылки имеющей типом родовой класс или интерфейсОсновные отличия от C++ При объявлении специфической ссылки имеющей типом родовой класс или интерфейс не происходит генерация кода класса (интерфейса) Все объекты – специфические экземпляры обобщения разделяют один и тот же обобщенный тип Параметрами обобщения могут быть только типы На параметры обобщения можно наложить ограничения по наследованию определенного типа и / или интерфейса (интерфейсов) Исключения и перечисления не могут быть обобщениями В качестве значений параметров при спецификации не могут использоваться примитивные типы java

Использование параметров - типов В теле класса с обобщением можно использовать параметр типа дляИспользование параметров — типов В теле класса с обобщением можно использовать параметр типа для объявления ссылок и спецификации значений аргументов других параметризуемых типов : class My. Generic { private T t; private Another. Generic at = new Another. Generic(); } Нельзя создать экземпляр объекта или массив имеющий типом – параметр: class Some. Generic { T t = new T(); //compile time error T array = new T[10]; //compile time error } Параметр типа недоступен в статическом контексте class Has. Static { static T t; //compile time error }

Ограниченные типы / / Т должен быть либо Number, либо классом, / / унаследованнымОграниченные типы / / Т должен быть либо Number, либо классом, / / унаследованным от него. class Stats { private T [ ] nums; public Stats ( T [] array ) { nums = array; } public double average ( ) { double sum = 0. 0; for (T n : nums ) { // все типы наследники Number реализуют метод double. Value() sum += n. double. Value(); // можно использовать } return sum / nums. length(); } } 2014 140 Generics. Sample

Шаблоны аргументов( wildcard ) Допустим мы хотим сравнивать средние значения объектов StatsT: class StatsШаблоны аргументов( wildcard ) Допустим мы хотим сравнивать средние значения объектов Stats: class Stats { private T [ ] nums; public Stats ( T [] array ) { nums = array; } public double average ( ) { … } public boolean same. Avg ( Stats another) { return average() == another. average(); } } // Проблема – нельзя сравнить среднее разных спецификаций : Integer int. Array[] = { 1, 2, 4, 7 }; Double double. Array [] = { 6. 0, 7. 8, 22. 0 }; Stats int. Stats = new Stats (int. Array); int. Stats. same. Avg (new Stats(double. Array) ); //Compile time error

Решение – использование шаблона  «? »  class Stats T extends Number {Решение – использование шаблона «? » class Stats { private T [ ] nums; public Stats ( T [] array ) { nums = array; } public double average ( ) { … } public boolean same. Avg ( Stats another) { return average() == another. average(); } } ? можно использовать для спецификации обобщенных ссылок и generic-type массивов Stats any. Stats = new Stats ( ); Stats array[] = new Stats [10]; ? следует применять при проверках instanceof Stats i. Stats = new Stats ( new Integer[]{ 1, 2, 3, 4} ); i. Stats instanceof Stats // true 2014 142 Шаблон аргумента указывается символом ? и представляет собой неизвестный тип :

Ограниченные шаблоны (bounded wildcard) Для того, чтобы установить верхнюю границу шаблона ,  используетсяОграниченные шаблоны (bounded wildcard) Для того, чтобы установить верхнюю границу шаблона , используется следующий тип шаблонного выражения : Здесь суперкласс — это имя класса, который служит верхней границей. Это — включающее выражение, потому что класс, заданный в качестве верхней границы (т. е. сам суперкласс ), также находится в пределах допустимых типов. Возможно указать нижнюю границу шаблона , добавив выражение super к объявлению шаблона : В этом случае допустимыми аргументами могут быть только классы, которые являются суперклассами для подкласс. Это исключающая конструкция, поскольку она не включает класс подкласс. 2014 143 Bounded. Wildcard

Обобщенные методы Методы внутри обобщенного класса могут использовать параметр типа,  а следовательно, Обобщенные методы Методы внутри обобщенного класса могут использовать параметр типа, а следовательно, обобщения относятся также к параметрам методов. Однако можно объявить обобщенный метод , который сам по себе использует один или более параметров типа. Более того, можно объявить обобщенный метод, который включен в параметризованный (необобщенный) класс. class Gen. Meth. Demo { // Определение, содержится ли объект в массиве. static boolean is. In(T х, V[] у) { for(int i=0 ; i < у. length; i++) if(x. equals(y[i])) return true; return false; } 2014 144 Параметр типа объявлен перед типом возвращаемого значения метода. Тип V ограничен сверху типом Т. То есть тип V либо должен быть тем же типом, что и Т, либо типом его подклассов. Это отношение указывает, что метод is. In () может быть вызван только с аргументами, совместимыми между собой.

Обобщенные конструкторы Конструкторы также могут быть обобщенными, даже если их классы таковыми не являются.Обобщенные конструкторы Конструкторы также могут быть обобщенными, даже если их классы таковыми не являются. Например : // Использование обобщенного конструктора, class Gen. Cons { private double val; Gen. Cons(T arg) { val = arg. double. Value(); } void showval() { System. out. println(«val: » + val); } } class Gen. Cons. Demo { public static void main(String args[]) { Gen. Cons test = new Gen. Cons(100); Gen. Cons test 2 = new Gen. Cons(123. 5 F); test. showval(); test 2. showval(); } }

Обобщенные интерфейсы указывают так же, как и обобщенные классы. Например : interface Min. MaxTОбобщенные интерфейсы указывают так же, как и обобщенные классы. Например : interface Min. Max<T extends Comparable> { T min(); T max(); } class My. Class<T extends Comparable> implements Min. Max { T[] vals; My. Class(T [] о) { vals = о; } public Т min() { // Возвращает минимальное значение из vals. Т v = vals[ 0 ] ; for(int i=l; i < vals. length; i++) if(vals[i]. compare. To(v) < 0) v = vals[i]; return v; } public T max() {// Возвращает максимальное значение из vals. T v = vals[0]; for(int i=l; i 0) v = vals[i]; return v; } } class Genl. FDemo { public static void main(String args[]) { Integer inums[] = {3, 6, 2, 8, 6 }; Character chs[] = {‘b 1, ‘r 1, ‘P 1, ‘ w’ }; My. Class iob = new My. Class(inums); My. Class cob = new My. Class(chs); System. out. println(» Максимальное значение в inums: » + iob. max()); System. out. println(» Минимальное значение в inums: » + iob. min()); System. out. println(» Максимальное значение в chs: » + cob. max()); System. out. println(» Минимальное значение в chs: » + cob. min()); } }

Базовые( Raw )  типы и совместимость Для совместимости с ранним кодом можно использоватьБазовые( Raw ) типы и совместимость Для совместимости с ранним кодом можно использовать обобщения без спецификации параметров. class Gen { Т ob ; // Объявление объекта типа Т Gen(Т о) { // Передача конструктору ссылки на объект типа Т. ob = о; } Т getob() { // Возврат ob. return ob ; } } class Raw. Demo { // Демонстрация базового типа, public static void main(String args[]) { Gen i. Ob = new Gen(88); // Создать объект Gen для Integer. Gen str. Ob = new Gen( » Обобщенный тест» ); //Создать объект Gen для String. Gen raw = new Gen( new Double(98. 6)); // Создать объект базового типа Gen и дать ему значение Double. double d = (Double) raw. getob () ; // Приведение необходимо, поскольку тип неизвестен, System. out. println( » значение: » + d); // int i = (Integer) raw. getob () ; // ошибка времени выполнения str. Ob = raw; // OK, но потенциально неверно // String str = str. Ob. getob(); // ошибка времени выполнения raw = i. Ob; // OK, но потенциально неверно // d = (Double) raw. getob () ; // ошибка времени выполнения } }

Обобщения и наследование Обобщенные классы (интерфейсы) могут наследоваться от обычных классов (интерфейсов) и наоборотОбобщения и наследование Обобщенные классы (интерфейсы) могут наследоваться от обычных классов (интерфейсов) и наоборот Возможно приведение ссылки дочернего обобщенного класса (интерфейса) на базовый только в том случае, если совпадают значения аргументов–типов, заданные при спецификации Если классы A и B связаны наследованием ( A extends B), то это не значит, что специфицированные ссылки параметризованных типов которым переданы эти классы в качестве параметров-типов совместимы между собой! // параметры совпадают, класс Linked. List реализует интерфейс List List string. List = new Linked. List (); //OK // значения параметров у ссылок не совпадают, присваивание невозможно: List object. List = string. List; //compile time error

Перегрузка и наследование public class Base T { private T val; public Base(T v)Перегрузка и наследование public class Base { private T val; public Base(T v) { val = v; } public T get. Val() { return val; } } public class Derived extends Base { private S another; public Derived (T v, S s) { super(v); another = s; } public T get. Val () { … } // Перегруженный метод } // Допустимо: Base b = new Derived (5, “Hello!”);

 «Очистка параметров» при компиляции Из соображений совместимости со старыми версиями языка вся информация «Очистка параметров» при компиляции Из соображений совместимости со старыми версиями языка вся информация о параметрах–типах при компиляции удаляется. При этом происходит замена параметров типа на реально ограничивающий их класс – это называется очисткой ( erasure). class Bar {…} — T заменяется на Number class Foo {…} — T заменяется на Object class Gen. Str { T str; Gen. Str ( T val) { str = val; } T get. Str () {return str; } } // откомпилируется как будто был написан так: class Gen. Str extends Object { java. lang. String str; Gen. Str (java. lang. String val) {str = val; } java. lang. String get. Str() { return str; } }

Методы – мосты 2014 151 Иногда компилятору приходится добавлять к классу так называемый метод-мостМетоды – мосты 2014 151 Иногда компилятору приходится добавлять к классу так называемый метод-мост (bridge method), чтобы справиться с ситуациями, когда результат очистки типов в перегруженном методе подкласса не совпадает с тем, что получается при очистке в суперклассе. В этом случае создается метод, который использует очистку типов суперкласса, и этот метод вызывает соответствующий метод подкласса, выполняющий очистку. Методы-мосты появляются только на уровне кода виртуальной машины, они невидимы для программиста и недоступны для непосредственного вызова.

Методы – мосты(продолжение) 2014 152 class GenT { // Ситуация, в которой создается метод-мост,Методы – мосты(продолжение) 2014 152 class Gen { // Ситуация, в которой создается метод-мост, Т ob; // объявить объект типа Т Gen(T о) {// Передать конструктору ссылку на объект типа Т. ob = о; } Т getob() { // Возвращает ob. return ob; } } class Gen 2 extends Gen {// Подкласс Gen 2(String o) { super(o); } String getob() {// Ориентированная на строки перегрузка getob(). System. out. print(» Вызван String getob(): «); return ob; } } class Bridge. Demo {// Демонстрация ситуации, в которой необходим метод-мост, public static void main(String args[]) { // Создать объект Gen 2 для Strings. Gen 2 str 0 b 2 = new Gen 2(» Обобщенный тест»); System. out. println(str 0 b 2. getob()); } }

Методы – мосты(продолжение) 2014 153 Если посмотреть на интерфейс класса Gen 2 с помощьюМетоды – мосты(продолжение) 2014 153 Если посмотреть на интерфейс класса Gen 2 с помощью javap ( The Java Class File Disassembler ) , то можно увидеть следующие методы : class Gen 2 extends Gen { Gen 2(java. lang. String); java. lang. String getob(); java. lang. Object getob(); // метод-мост } Так как из-за очистки типов ожидаемая форма метода getob() будет выглядеть так: Object getob() {. . . } Поэтому компилятор создает метод-мост с сигнатурой Object getob() , который вызывает строковую версию.

Ошибки неоднозначности // Неоднозначность порождается очисткой перегруженных методов, class My. Gen. ClassT, V {Ошибки неоднозначности // Неоднозначность порождается очисткой перегруженных методов, class My. Gen. Class { Т ob 1; V ob 2; //. . . // Эти два перегруженных метода неоднозначны и не компилируются, void set(Т о) { obi = о; } void set(V o) { ob 2 = о; } } 2014 154 Включение в язык обобщений породило новый тип ошибок, от которых необходимо защищаться — неоднозначность (ambiquity). Ошибки неоднозначности случаются, когда очистка порождает два внешне разных обобщенных объявления, разрешаемых в виде одного очищенного типа, что вызывает конфликт.

2014 155 Пакеты: организация java программ В типичном случае программа состоит из нескольких пакетов2014 155 Пакеты: организация java программ В типичном случае программа состоит из нескольких пакетов Каждый пакет имеет собственное пространство имен для типов объявленных в пакете Верхнеуровневый тип доступен извне пакета только если он объявлен со спецификатором public Пакеты образуют иерархическую структуру имен. Членами пакета являются: классы и интерфейсы, объявленные в единицах компиляции пакета подпакеты, которые имеют свои собственные подпакеты и единицы компиляции Пакеты могут располагаться на файловой системе или в базе данных Пакеты размещаемые на файловой системе имеют ряд ограничений на их организацию для обеспечения однозначности при поиске и загрузке (а также компиляции) типов (и единиц компиляции) и пакета

2014 156 Пакеты: организация программ При отображении (хранении) на файловой системе единица компиляции может2014 156 Пакеты: организация программ При отображении (хранении) на файловой системе единица компиляции может содержать тоьлко один тип объявленный public совпадающий по имени с именем файла единицы компиляции

2014 157 Единицы компиляции Пакет содержит несколько единиц компиляции Типы внутри единицы компиляции имеют2014 157 Единицы компиляции Пакет содержит несколько единиц компиляции Типы внутри единицы компиляции имеют доступ ко всем верхнеуровневым типам, объявленным в других единицах компиляции данного пакета а также к типам пакета java. lang Для доступа к другим пакетам используется декларация import Compilation. Unit : Package. Declaration opt Import. Declarations opt Type. Declarations opt Import. Declarations: Import. Declarations Import. Declaration Type. Declarations: Type. Declarations Type. Declaration

2014 158 Именованные и безымянные пакеты Объявление именованного пакета: Package. Declaration:  package Package.2014 158 Именованные и безымянные пакеты Объявление именованного пакета: Package. Declaration: package Package. Name ; В качестве имени пакета выступает полное квалифицированное имя: например com. somecompany. project. one для First. java Единицы компиляции безымянного пакета не содержат объявление пакета Безымянные пакеты следует использовать только в небольших тестовых программах Переменная окружения CLASSPATH содержит точки привязки иерархий пакетов к точкам в файловой системе (коими могут являться директории и архивные jar или zip файлы) Классы находящиеся во всех «корневых» директориях точек привязки CLASSPATH принадлежат к единому безымянному пакету

2014 159 Декларация import Декларация имени пакета распространяется на всю единицу компиляции Декларации import2014 159 Декларация import Декларация имени пакета распространяется на всю единицу компиляции Декларации import также распространяются на всю единицу компиляции Для того чтобы получить доступ к членам подпакета в единице компиляции, нужно явно импортировать эти члены. По умолчанию они не видны Import. Declaration : Single. Type. Import. Declaration Type. Import. On. Demand. Declaration import java. io. Input. Stream; // single type import declaration import java. net. *; // import on demand declaration Будучи импортированными типы становятся доступны в единице компиляции с использованием простого (не квалифицированного) имени.

2014 160 Статический импорт ( начиная с java 1. 5) Для того чтобы иметь2014 160 Статический импорт ( начиная с java 1. 5) Для того чтобы иметь возможность обращаться к статическим методам, полям класса, а также к элементам перечислений без использования квалифицированного имени, можно воспользоваться статической декларацией импорта: import static Days. * ; import static java. lang. Math. *; … Day d = MONDAY; Day d 2 = value. Of(“SATURDAY”); double v = sin(PI/2); Однако злоупотреблять статическим импортом не стоит

2014 161 Сокрытие и конфликты import single-type-import декларация d  в единице компиляции c2014 161 Сокрытие и конфликты import single-type-import декларация d в единице компиляции c пакета p импортирующая тип n , скрывает: любой верхнеуровневый тип n , объявленный в другой единице компиляции пакета p любой тип n импортированный type-imoprt-on-demand декларацией в c нельзя импортировать пакет, можно импортировать только типы: import java. util; — ведет к ошибке времени компиляции верхнеуровневые типы объявленные внутри единицы компиляции, а также вложенные типы скрывают типы, импортируемые type-import-on-demand декларацией, при использовании простого имени. для разрешения неоднозначности или доступа к сокрытому типу можно воспользоваться квалифицированным именем

2014 162 Пример package Vector;  public class Mosquito { int capacity;  }2014 162 Пример package Vector; public class Mosquito { int capacity; } package strange. example; import java. util. Vector; import Vector. Mosquito; class Test { public static void main(String[] args){ System. out. println(new Vector(). get. Class()); System. out. println(new Mosquito(). get. Class()); } } Вывод: class java. util. Vector class Vector. Mosquito

2014 163 Двойная декларация package test;  import java. util. Vector;  class Point2014 163 Двойная декларация package test; import java. util. Vector; class Point { int x, y; } interface Point { // compile-time error #1 int get. R(); int get. Theta(); } class Vector { // compile-time error #2 Point[] pts; } ————————— package test; import java. util. *; class Vector { Point[] pts; } // not a error

2014 164 Опережающее использование package points;  class Point { int x, y; //2014 164 Опережающее использование package points; class Point { int x, y; // coordinates Point. Color color; // color of this point Point next; // next point with this color static int n. Points; } class Point. Color { Point first; // first point with this color Point. Color(int color) { this. color = color; } private int color; // color components } //all is OK!

2014 165 Правила именования пакетов Для обеспечения уникальности имени пакета  в качестве основы2014 165 Правила именования пакетов Для обеспечения уникальности имени пакета в качестве основы следует использовать доменное имя организации, например: ua. sevntu. is. mylastname. task 1 В случае если доменное имя не может быть использовано в силу наличия специальных символов, запрещенных к использованию в идентификаторах, нужно произвести следующую трансформацию: если имя содержит знак ‘-’, его заменяют на ‘_’: some-ware. com -> com. some_ware если имя является ключевым словом, то к нему добавляют ‘_’: do. something. com -> com. something. do_; если имя начинается с цифры, то спереди добавляется ‘_’: just. 4 you. com -> com. _4 you. just Примеры имен: com. sun. java. jag. scrabble com. apple. quicktime. v

2014 166 Полное квалифицированное имя Полным квалифицированным именем является:  для примитивных типов –2014 166 Полное квалифицированное имя Полным квалифицированным именем является: для примитивных типов – ключевое слово типа для именованного пакета первого уровня – простое имя этого пакета для именованного пакета уровня N – полное квалифицированное имя объемлющего пакета плюс простое имя пакета: outer 1. outer 2. outer. N-1. packagename для класса или интерфейса в безымянном пакете – простое имя этого класса или интерфейса полное квалифицированное имя класса или интерфейса в именованном пакете – это полное квалифицированное имя пакета плюс простое имя класса или интерфейса: outerpackage 1. . . outerpackage. N-1. packagename. Class. Name

2014 167 Полное квалифицированное имя класс (интерфейс) – член другого класса имеет полное квалифицированное2014 167 Полное квалифицированное имя класс (интерфейс) – член другого класса имеет полное квалифицированное имя только если таковое имеется у класса его содержащего: outerpackage 1. …. outerpackage. N. Outer. Class 1. …. Outer. Class. M. Member исключение – безымянные классы Полное квалифицированное имя массива – это полное квалифицированное имя компонентного типа с последующим [] Примеры полностью квалифицированных имен: java. lang. Object java. util. Map. Entry int java. lang. String[]

Обработка исключений 2014 168 Обработка исключений

2014 169 Обработка исключений Каждый раз,  когда при выполнении программы происходит ошибка, 2014 169 Обработка исключений Каждый раз, когда при выполнении программы происходит ошибка, — программа выбрасывает исключение — в этот момент создается специальный объект-исключение (exception-object). Этот объект содержит информацию о возникшей ошибке: тип ошибки ; запись о состоянии программы на момент возникновения ошибки. Создание исключения и передача его среде выполнения называется выбрасыванием исключения (exception throwing). Исполняющая система ищет стек вызовов для метода, который содержит блок кода, который может обработать исключение. Этот блок кода называется обработчиком исключения. Поиск начинается с метода, в котором произошла ошибка, и проходит через стек вызовов в обратном порядке, в котором методы были вызваны. Когда соответствующий обработчик найден, исполняющая система передает исключение в обработчик.

2014 170 Обработка исключений(продолжение) 2014 170 Обработка исключений(продолжение)

2014 171 Причины возникновения исключений Ошибочная ситуация синхронно обработанная JVM во время вычисления выражения:2014 171 Причины возникновения исключений Ошибочная ситуация синхронно обработанная JVM во время вычисления выражения: Выражение нарушает нормальную семантику языка (деление на ноль и т. д. ) Ошибка во время загрузки или связывания части программы Нехватка ресурсов (недостаток памяти и др. ) Вызов оператора throw Асинхронная ошибка, возникающая в следующих ситуациях: вызов метода stop () класса Thread внутренняя ошибка в виртуальной машине

2014 172 Иерархия базовых исключений 2014 172 Иерархия базовых исключений

2014 173 Полная иерархия исключений java. lang. Throwable (implements java. io. Serializable )java. lang.2014 173 Полная иерархия исключений java. lang. Throwable (implements java. io. Serializable )java. lang. Error java. lang. Assertion. Error java. lang. Linkage. Error java. lang. Bootstrap. Method. Error java. lang. Class. Circularity. Error java. lang. Class. Format. Error java. lang. Unsupported. Class. Version. Error java. lang. Exception. Initializer. Error java. lang. Incompatible. Class. Change. Error java. lang. Abstract. Method. Error java. lang. Illegal. Access. Error java. lang. Instantiation. Error java. lang. No. Such. Field. Error java. lang. No. Such. Method. Error java. lang. No. Class. Def. Found. Error java. lang. Unsatisfied. Link. Error java. lang. Verify. Error java. lang. Thread. Death java. lang. Virtual. Machine. Error java. lang. Internal. Error java. lang. Out. Of. Memory. Error java. lang. Stack. Overflow. Error java. lang. Unknown. Error java. lang. Exception java. lang. Clone. Not. Supported. Exception java. lang. Interrupted. Exception java. lang. Reflective. Operation. Exception java. lang. Class. Not. Found. Exception java. lang. Illegal. Access. Exception java. lang. Instantiation. Exception java. lang. No. Such. Field. Exception java. lang. No. Such. Method. Exception java. lang. Runtime. Exception java. lang. Arithmetic. Exception java. lang. Array. Store. Exception java. lang. Class. Cast. Exception java. lang. Enum. Constant. Not. Present. Exception java. lang. Illegal. Argument. Exception java. lang. Illegal. Thread. State. Exception java. lang. Number. Format. Exception java. lang. Illegal. Monitor. State. Exception java. lang. Illegal. State. Exception java. lang. Index. Out. Of. Bounds. Exception java. lang. Array. Index. Out. Of. Bounds. Exception java. lang. String. Index. Out. Of. Bounds. Exception java. lang. Negative. Array. Size. Exception java. lang. Null. Pointer. Exception java. lang. Security. Exception java. lang. Type. Not. Present. Exception java. lang. Unsupported. Operation. Exception

2014 174 Класс java. lang. Throwable Базовый класс для всех классов исключений и ошибок,2014 174 Класс java. lang. Throwable Базовый класс для всех классов исключений и ошибок, объект которого содержит информацию о стеке исполнения потока Конструкторы: Throwable() Создает новый объект на основе информации о стеке текущего потока Throwable(String message) Создает новый объект на основе информации о стеке текущего потока плюс позволяет задать текст сообщения об ошибке Throwable(Throwable cause) Создает новый объект – обертку вокруг другого объекта Throwable. Стек вызовов заполняется на основе информации о стеке текущего потока Throwable(String message, Throwable cause) Создает объект-обертку с возможностью переопределения сообщения

2014 175 Класс java. lang. Throwable ( методы ) String get. Message() String get.2014 175 Класс java. lang. Throwable ( методы ) String get. Message() String get. Localized. Message() Возвращает текст сообщения об ошибке print. Stack. Trace() print. Stack. Trace(Print. Stream s) print. Stack. Trace(Print. Writer s) Выводит информацию о стеке вызовов на момент возникновения ошибки. Распечатка ведется на стандартный поток ошибок или в указанный поток native Throwable fill. In. Stack. Trace() Заполняет информацию о стеке вызовов для текущего потока в объект Throwable и возвращает ссылку на этот-же объект. Используется конструкторами. init. Cause(Throwable cause) Throwable get. Cause() Манипуляция с объектом-источником (для оберток) Stack. Trace. Element[ ] get. Stack. Trace() set. Stack. Trace(Stack. Trace. Elem ent[ ] stack. Trace) Позволяет работать с элементами стека вызовов

2014 176 Класс java. lang. Stack. Trace. Element String get. Class. Name() String get.2014 176 Класс java. lang. Stack. Trace. Element String get. Class. Name() String get. File. Name() String get. Line. Number() String get. Method. Name() Выдают информацию о точке вызова (исходный файл, строка в нем, имя класса, имя метода). Для того чтобы информация была доступна, код должен быть откомпилирован с включенной отладочной информацией int hash. Code() boolean equals(Object obj) String to. String() Перегруженные методы класса Object обеспечивающие сравнение двух объектов типа Stack. Trace. Element , а также строковое представление boolean is. Native. Method() Возвращает true если вызван native метод

2014 177 Error, Exception, Runtime. Exception java. lang. Error  – ошибки работы виртуальной2014 177 Error, Exception, Runtime. Exception java. lang. Error – ошибки работы виртуальной машины java. Выбрасываются самой виртуальной машиной и сигнализируют о серьезных проблемах. java. lang. Exception – базовый класс для исключений библиотеки и разрабатываемых приложений. Обычные исключения должны наследоваться от этого класса java. lang. Runtime. Exception – специальный класс исключений, наследников которого не обязательно перехватывать с помощью try-catch и декларировать в throws списке метода.

2014 178 Runtime исключения синхронно вызываемые JVM при нарушении семантики языка при вычислении выражений2014 178 Runtime исключения синхронно вызываемые JVM при нарушении семантики языка при вычислении выражений Out. Of. Memory. Error во время создания объекта (объекта – класса, массива, временного объекта при конкатенации строк) Negative. Array. Size. Exception во время создания объекта – массива. Null. Pointer. Exception во время использования (доступ к полю или вызов метода) ссылки или выражения результатом которого является ссылочный тип, имеющего значение null Null. Pointer. Exception при обращении к элементу массива в случае если ссылка на массив содержит null Array. Index. Out. Of. Bounds. Exception в случае выхода за границы массива Class. Cast. Exception при попытке приведения несовместимых типов. Деление на ноль при выполнении операторов « / » , « % » приводит к Arithmetic. Exception Array. Store. Exception при попытке присваивания элементу массива значения несовместимого ссылочного типа.

2014 179 Обработка исключений Все исключения кроме наследников java. lang. Error  и java.2014 179 Обработка исключений Все исключения кроме наследников java. lang. Error и java. lang. Runtime. Exception должны явно обрабатываться одним из двух способов: Выражение которое может привести к возникновению исключительной ситуации должно быть помещено в try – catch блок, который перехватит данное исключение Метод содержащий выражение которое может привести к возникновению исключительной ситуации должен в объявлении throws содержать совместимый тип исключения (такой-же тип либо суперкласс данного исключения) Исключение прерывает нормальную последовательность исполнения выражений и приводит к передаче управления вверх по стеку вызовов методов вплоть до точки перехвата исключения

2014 180 Синтаксис try – catch – finally Try. Statement:  try Block Catches2014 180 Синтаксис try – catch – finally Try. Statement: try Block Catches opt Finally Catches: Catch. Clause Catches Catch. Clause: catch ( Formal. Parameter ) Block Finally: finally Block Formal. Parameter: final opt Type Variable. Declarator. Id: Identifier Variable. Declarator. Id [ ] try { … } catch (Child. Exception ce) { … } catch (Parent. Exception pe) { … } catch (Exception ex) { … } catch (Throwable thr) { … } finally { … }

2014 181 Обработка исключений try {  . . .  throw new Exception2014 181 Обработка исключений try { . . . throw new Exception (“Description”); . . . } catch (Exception e) { System. err. println(“Exception caught: ”+e); System. err. println(e. get. Message()); e. print. Stack. Trace(); // На System. err e. print. Stack. Trace(System. out); // Print. Stream throw e; // Повторная генерация исключения } finally { //do something there System. out. println(“finally block”); }

2014 182 Пример обработки исключений class Test {  public void do. It() throws2014 182 Пример обработки исключений class Test { public void do. It() throws Exception{ throw new Exception(«do. It»); } public void do. Another() throws Exception { do. It(); } public void lets. Do. It() throws Exception { try { do. Another(); } catch (Exception e) { System. out. println(«first print. Stack. Trace: «); e. print. Stack. Trace(System. out); System. out. println(«local context in catch: «); Throwable t = new Throwable(); t. fill. In. Stack. Trace(); t. print. Stack. Trace(System. out); System. out. println(«Throw it again. . . «); throw e; } } } public class Main { public static void main(String[] args) { Test t = new Test(); try { t. lets. Do. It(); } catch (Exception e) { System. out. println(«Second print. Stack. Trace: «); e. print. Stack. Trace(System. out); } } }

2014 183 Блок finally – выполняется всегда: public class Finally. Demo {  static2014 183 Блок finally – выполняется всегда: public class Finally. Demo { static void proc. A() { try { System. out. println(«proc. A»); throw new Runtime. Exception(«Demo»); } finally { System. out. println(«finally proc. A»); } } static void proc. B() { try { System. out. println(«proc. B»); return; } finally { System. out. println(«finally proc. B»); } } static void proc. C() { try { System. out. println(«proc. C»); } finally { System. out. println(«finally proc. C»); } } public static void main(String[] args) { try { proc. A(); } catch (Exception ex) { System. out. println(«Exception was caught»); ex. print. Stack. Trace(System. out); } proc. B(); proc. C(); } }

2014 184 Создание пользовательских классов исключений  public class User. Exception extends Exception {2014 184 Создание пользовательских классов исключений public class User. Exception extends Exception { public User. Exception() { super(); } public User. Exception(String msg) { super(msg); } }Допускается создание собственных классов исключений. Для этого необходимо создать класс, унаследованный от java. lang. Throwable или его потомков :

2014 185 Переопределение методов исключения При переопределении методов следует помнить,  что если переопределяемый2014 185 Переопределение методов исключения При переопределении методов следует помнить, что если переопределяемый метод объявляет список возможных исключений, то переопределяющий метод не может расширять этот список , но может его сужать. Например: public class Base. Class { public void method() throws IOException { … } } public class Legal. One extends Base. Class { public void method() throws IOException { … } } public class Legal. Two extends Base. Class { public void method() { … } } public class Legal. Three extends Base. Class { public void method() throws EOFException, Malformed. URLException {// наследники Exception … } } public class Illegal. One extends Base. Class { public void method() throws IOException, Illegal. Access. Exception { … } }

2014 186Потерянные исключения Возможна ситуация, при которой исключение «потеряется» . Это может произойти, если2014 186″Потерянные исключения» Возможна ситуация, при которой исключение «потеряется» . Это может произойти, если в блоке finally возбудить другое исключение:

Библиотека Java 2014 187 Библиотека Java

2014 188 Пакет java. lang – поддержка языка и платформы Error Exception Comparable Cloneable2014 188 Пакет java. lang – поддержка языка и платформы Error Exception Comparable Cloneable Double Character. Byte Boolean Compiler Float Integer Long. Math Numb er. Null. Pointer. Exception Object Package Process. Runtime. Exception Short. String. Buffer System Runnable Class. Loader Thread -target. Throwable Class Void

2014 189 Пакет java. lang – поддержка языка и платформы java. lang. Object o2014 189 Пакет java. lang – поддержка языка и платформы java. lang. Object o java. lang. Boolean (implements java. lang. Comparable , java. io. Serializable ) o java. lang. Character. Subset o java. lang. Character. Unicode. Block o java. lang. Class (implements java. lang. reflect. Annotated. Element , java. lang. reflect. Generic. Declaration , java. io. Serializable , java. lang. reflect. Type ) o java. lang. Class. Loader o java. lang. Class. Value o java. lang. Compiler o java. lang. Enum (implements java. lang. Comparable , java. io. Serializable ) o java. lang. Math o java. lang. Number (implements java. io. Serializable ) o java. lang. Byte (implements java. lang. Comparable ) o java. lang. Double (implements java. lang. Comparable ) o java. lang. Float (implements java. lang. Comparable ) o java. lang. Integer (implements java. lang. Comparable ) o java. lang. Long (implements java. lang. Comparable ) o java. lang. Short (implements java. lang. Comparable ) o java. lang. Package (implements java. lang. reflect. Annotated. Element ) o java. security. Permission (implements java. security. Guard , java. io. Serializable ) o java. security. Basic. Permission (implements java. io. Serializable ) o java. lang. Runtime. Permission o java. lang. Process. Builder. Redirect o java. lang. Runtime o java. lang. Security. Manager o java. lang. Stack. Trace. Element (implements java. io. Serializable ) o java. lang. Strict. Math o java. lang. String (implements java. lang. Char. Sequence , java. lang. Comparable , java. io. Serializable ) o java. lang. String. Buffer (implements java. lang. Char. Sequence , java. io. Serializable ) o java. lang. String. Builder (implements java. lang. Char. Sequence , java. io. Serializable ) o java. lang. System o java. lang. Thread (implements java. lang. Runnable ) o java. lang. Thread. Group (implements java. lang. Thread. Uncaught. Exception. Handler ) o java. lang. Thread. Local o java. lang. Inheritable. Thread. Local o java. lang. Throwable (implements java. io. Serializable ) o java. lang. Error o java. lang. Exception o java. lang. Clone. Not. Supported. Exception o java. lang. Interrupted. Exception o java. lang. Reflective. Operation. Exception o java. lang. Runtime. Exception o java. lang. Void

2014 190 Пакет java. lang – поддержка языка и платформы. Interface Hierarchy o java.2014 190 Пакет java. lang – поддержка языка и платформы. Interface Hierarchy o java. lang. Appendable o java. lang. Auto. Closeable o java. lang. Char. Sequence o java. lang. Cloneable o java. lang. Comparable o java. lang. Iterable o java. lang. Readable o java. lang. Runnable o java. lang. Thread. Uncaught. Exception. Handler Annotation Type Hierarchy o java. lang. Safe. Varargs (implements java. lang. annotation. Annotation ) o java. lang. Deprecated (implements java. lang. annotation. Annotation ) o java. lang. Suppress. Warnings (implements java. lang. annotation. Annotation ) o java. lang. Override (implements java. lang. annotation. Annotation ) Enum Hierarchy o java. lang. Object o java. lang. Enum (implements java. lang. Comparable , java. io. Serializable ) o java. lang. Character. Unicode. Script o java. lang. Process. Builder. Redirect. Type o java. lang. Thread. State

2014 191 Классы поддержки основных механизмов Базовый класс для загрузчиков классов в системе. Class.2014 191 Классы поддержки основных механизмов Базовый класс для загрузчиков классов в системе. Class. Loader Интерфейс используемый классом потока для запуска параллельных действий. Runnable Базовый класс потока. Thread Класс, объекты которого хранят информацию о пакетах во время исполнения. Package Класс, объекты которого хранят служебную информацию о классах во время исполнения Class Класс для взаимодействия со средой исполнения. Runtime Класс-утилита для взаимодействия с системой. System Маркерный интерфейс для классов, реализующих метод public Object clone()Cloneable Базовый класс для всех классов. Object

2014 192 Классы поддержки системы типов Базовый класс для классов – оберток числовых типов.2014 192 Классы поддержки системы типов Базовый класс для классов – оберток числовых типов. Number Классы – обертки для числовых типов. Byte, Short, Integer, Long, Float, Double Интерфейс, реализуемый классами для объектов которых определено отношение порядка. Comparable Объектная обертка для типа void. Void Объектная обертка для логического типа. Boolean Объектная обертка для символьного типа. Character Символьный буфер, используемый для оптимизации работы со строками. String. Buffer Класс для работы со строками String

2014 193 Класс java. lang. System (основные методы) Методы для манипуляции с загружаемыми native2014 193 Класс java. lang. System (основные методы) Методы для манипуляции с загружаемыми native библиотеками (dll , ld. so ) load(), load. Library(), map. Library. Nam e() Принудительный вызов сборщика мусораgc() Прекращение работы виртуальной машины и завершение процессаexit() Взятие текущего времени в миллисекундах с момента 00 часов 1 января 1970 годаcurrent. Time. Millis () Набор методов для работы со стандартными свойствами (настройками) java машины get. Properties(), get. Property(), set. Properties(), set. Property() Метод для быстрого копирования содержимого массивовarraycopy() Статические переменные содержащие ссылки на стандартные потоки ввода, вывода и ошибокerr, in, out

2014 194 Класс java. lang. Runtime (основные методы) Запуск сборщика мусора и финализатораgc(), run.2014 194 Класс java. lang. Runtime (основные методы) Запуск сборщика мусора и финализатораgc(), run. Finalization() Установка и удаления перехватчиков, вызываемых при остановке виртуальной машиныadd. Shutdown. Hook(), remove. Shutdown. Hoo k() Загрузка динамических native библиотекload. Library(), load() Методы для получения информации о доступной памятиfree. Memory() total. Memory() Shutdown и остановка java машиныexit(int status), halt() Семейство вызовов для запуска отдельного процесса (программы) в операционной системе. Process exec() Статический метод для получения объекта Runtimeget. Runtime()

2014 195 java. lang. Class (основные методы) Загрузка ресурсов (файлов настроек,  картинок и2014 195 java. lang. Class (основные методы) Загрузка ресурсов (файлов настроек, картинок и т. д. ) расположенных на файловой системе или в архиве jarget. Resource(), get. Resource. As. Strea m() Получение информации о суперклассе, реализуемых интерфейсах и пакетеget. Super. Class(), get. Interfaces(), get. Package() Получение загрузчика с помощью которого был загружен данных класс. Class. Loader get. Class. Loader() Создает новый объект данного класса. Необходимо чтобы класс определял конструктор по умолчанию. Object new. Instance() Используется для динамической загрузки класса по имени в виртуальную машинуstatic Class for. Name(String name) Дополнительно имеется множество методов для работы с полями, агрегатами и методами определенными в классе

2014 196 Классы-обертки для основных типов Используются тогда, когда нужно работать с значениями примитивных2014 196 Классы-обертки для основных типов Используются тогда, когда нужно работать с значениями примитивных типов как с объектами Используются для получения разнообразной информации о диапазонах значений и специальных значениях данного типа Используются для преобразования типов между собой, между различными системами счисления, в строковый формат и наоборот из строкового формата (наследники класса java. lang. Number) Объекты классов оберток, ровно как и объекты класса String не могут быть изменены после создания. При операциях с ними могут создаваться новые объекты

2014 197 Пример класса обертки – java. lang. Integer Формируют строковое представление числа в2014 197 Пример класса обертки – java. lang. Integer Формируют строковое представление числа в различных системах счисленияto. Binary. String(), to. Hex. String(), to. Octal. String() Методы для преобразования числовых типовdouble. Value(), short. Value(), long. Value(), double. Value(), float. Vlaue() Используются для разбора числа заданного в строковом формате. Выбрасывают java. lang. Number. Format. Exception int parse. Int(…) Integer value. Of(…) Используется для сравнения с другими объектами данного типаcompare. To(…) Конструкторы для создания нового объекта. Integer(int value), Integer(String s) Статические поля, содержащие информацию о диапазоне и ссылку на объект типа Class. MAX_VALUE, MIN_VALUE, TYP

Автоматическая обертка boxing/unboxing К омпилятор может выполнять автоматическое преобразование примитивных типов в объектные иАвтоматическая обертка boxing/unboxing К омпилятор может выполнять автоматическое преобразование примитивных типов в объектные и наоборот: Integer i = 5; // Integer i = new Integer(5); Integer array[] = new Integer[] { new Integer(1), new Integer(2), new Integer(3) }; // можно заменить : Integer array [] = { 1, 2, 3}; Необходимо соблюдать осторожность при обратных преобразованиях во избежание Null. Pointer. Exception class Foo { static Integer do. Something() { … } } … int i = Foo. do. Something(); // возможе Null. Pointer. Exception Integer the. I = Foo. do. Something(); int i = (the. I != null) ? the. I : 0;

Пакет java. util – коллекции, события, дата и время,  интернационализация, служебные классы InterfaceПакет java. util – коллекции, события, дата и время, интернационализация, служебные классы Interface Hierarchy o java. util. Comparator o java. util. Enumeration o java. util. Event. Listener o java. util. Formattable o java. lang. Iterable o java. util. Collection o java. util. List o java. util. Queue o java. util. Deque o java. util. Set o java. util. Sorted. Set o java. util. Navigable. Set o java. util. Iterator o java. util. List. Iterator o java. util. Map o java. util. Sorted. Map o java. util. Navigable. Map o java. util. Map. Entry o java. util. Observer o java. util. Random. Access

Пакет java. util – коллекции, события, дата и время,  интернационализация, служебные классы java.Пакет java. util – коллекции, события, дата и время, интернационализация, служебные классы java. util. Abstract. Collection (implements java. util. Collection )java. util. Abstract. List (implements java. util. List ) java. util. Abstract. Sequential. List java. util. Linked. List (implements java. lang. Cloneable , java. util. Deque , java. util. List , java. io. Serializable ) java. util. Array. List (implements java. lang. Cloneable , java. util. List , java. util. Random. Access , java. io. Serializable ) java. util. Vector (implements java. lang. Cloneable , java. util. List , java. util. Random. Access , java. io. Serializable ) java. util. Stack java. util. Abstract. Queue (implements java. util. Queue ) java. util. Priority. Queue (implements java. io. Serializable ) java. util. Abstract. Set (implements java. util. Set ) java. util. Enum. Set (implements java. lang. Cloneable , java. io. Serializable ) java. util. Hash. Set (implements java. lang. Cloneable , java. io. Serializable , java. util. Set ) java. util. Linked. Hash. Set (implements java. lang. Cloneable , java. io. Serializable , java. util. Set ) java. util. Tree. Set (implements java. lang. Cloneable , java. util. Navigable. Set , java. io. Serializable ) java. util. Array. Deque (implements java. lang. Cloneable , java. util. Deque , java. io. Serializable ) java. util. Abstract. Map (implements java. util. Map )java. util. Enum. Map (implements java. lang. Cloneable , java. io. Serializable ) java. util. Hash. Map (implements java. lang. Cloneable , java. util. Map , java. io. Serializable ) java. util. Linked. Hash. Map (implements java. util. Map ) java. util. Identity. Hash. Map (implements java. lang. Cloneable , java. util. Map , java. io. Serializable ) java. util. Tree. Map (implements java. lang. Cloneable , java. util. Navigable. Map, java. io. Serializable) java. util. Weak. Hash. Map (implements java. util. Map) java. util. Abstract. Map. Simple. Entry (implements java. util. Map. Entry, java. io. Serializable) java. util. Abstract. Map. Simple. Immutable. Entry (implements java. util. Map. Entry, java. io. Serializable) java. util. Arrays java. util. Bit. Set (implements java. lang. Cloneable, java. io. Serializable) java. util. Calendar (implements java. lang. Cloneable, java. lang. Comparable, java. io. Serializable)java. util. Gregorian. Calendar java. util. Collections java. util. Currency (implements java. io. Serializable) java. util. Date (implements java. lang. Cloneable, java. lang. Comparable, java. io. Serializable) java. util. Dictionary java. util. Hashtable (implements java. lang. Cloneable, java. util. Map, java. io. Serializable) java. util. Properties java. util. Event. Listener. Proxy (implements java. util. Event. Listener) java. util. Event. Object (implements java. io. Serializable) java. util. Formattable. Flags java. util. Formatter (implements java. io. Closeable, java. io. Flushable) java. util. Locale (implements java. lang. Cloneable, java. io. Serializable) java. util. Locale. Builder java. util. Objects java. util. Observable java. security. Permission (implements java. security. Guard, java. io. Serializable)java. security. Basic. Permission (implements java. io. Serializable) java. util. Property. Permission java. util. Random (implements java. io. Serializable)java. util. Resource. Bundle java. util. List. Resource. Bundle java. util. Property. Resource. Bundle java. util. Resource. Bundle. Control java. util. Scanner (implements java. io. Closeable, java. util. Iterator)java. util. Service. Loader (implements java. lang. Iterable)java. util. String. Tokenizer (implements java. util. Enumeration)java. lang. Throwable (implements java. io. Serializable) java. util. Timer. Task (implements java. lang. Runnable) java. util. Time. Zone (implements java. lang. Cloneable, java. io. Serializable) java. util. Simple. Time. Zone java. util. UUID (implements java. lang. Comparable, java. io. Serializable)

2014 201 Enumeration, Comparator Enumeration – объекты классов, реализующих данный интерфейс,  используются для2014 201 Enumeration, Comparator Enumeration – объекты классов, реализующих данный интерфейс, используются для предоставления однопроходного последовательного доступа к серии объектов: Hashtable t = …; for(Enumeration e = t. keys(); e. has. More. Elements(); ) { String s = e. next. Element(); } Comparator – классы, реализующие данный интерфейс используются для обеспечения сравнения произвольных элементов. Используются при сортировке и организации упорядоченных контейнеров: Comparator c = new Comparator (){…}; My. Class array[] = …; Arrays. sort(array, c);

Коллекции объектов 2014 202 Интерфейс Collection  – корневой элемент иерархии коллекций.  КоллекцияКоллекции объектов 2014 202 Интерфейс Collection – корневой элемент иерархии коллекций. Коллекция представляет группу объектов, называемых элементами коллекции. Интерфейс Set описывает множество. Элементы множества не упорядочены, множество не может содержать двух одинаковых элементов. Интерфейс List описывает упорядоченный список. Элементы списка пронумерованы, начиная с нуля, и к конкретному элементу можно обратиться с использованием целочисленного индекса. Интерфейс Queue описывает очередь. Элементы могут добавляться в очередь только с одного конца, а извлекаться с другого. Интерфейс Deque описывает двухстороннюю очередь — линейную структуру данных, которая поддерживает вставку и удаление элементов на обоих концах. Интерфейс Deque позволяет реализовывать и стеки и очереди. Интерфейс Map — отображение или ассоциативный массив — абстрактный тип данных, позволяющий хранить пары вида «(ключ, значение)» и поддерживающий операции добавления пары, а также поиска и удаления пары по ключу. Добавление пары с уже существующим в Map ключом приводит к замене, а не к добавлению. Из отображения (Map) можно получить множество (Set) ключей и список (List) значений. Sorted. Set – это упорядоченное множество объектов. Sorted. Map – ассоциативный массив, с упорядоченными ключами.

Коллекции объектов :  интерфейс Collection 2014 203 Коллекции объектов : интерфейс Collection

2014 204 Использование итераторов CollectionString col = …; for (IteratorString i = col. iterator();2014 204 Использование итераторов Collection col = …; for (Iterator i = col. iterator(); i. has. Next(); ) { String s = i. next(); } for (String s : col ) { s; } // Альтернатива Concurrent. Modification. Exception – возникает когда коллекция изменена во время итерирования другим потоком Illegal. State. Exception – возникает при попытке удаления элемента с помощью вызова remove(), когда еще не был вызван первый метод next() , или итератор указывает на конец коллекции ( has. Next() возвращает false ) No. Such. Element. Exception – возникает при попытке вызова next() когда has. Next() возвращает false Unsupported. Operation. Exception – возникает при вызове метода который не поддерживается конкретной реализацией коллекции

Множества 2014 205 Множества

Множества :  пример Hash. Set 2014 206 Множества : пример Hash. Set

   Упорядоченные множества 2014 207 Упорядоченные множества

   Упорядоченные множества :  пример Tree. Set 2014 208 Tree. SetInteger Упорядоченные множества : пример Tree. Set 2014 208 Tree. Set tset = new Tree. Set(); tset. add(6); tset. add(1); tset. add(4); System. out. println( tset ); System. out. println( «Iterate through the Tree. Set» ); for ( Integer i_el : tset) System. out. println( i_el); System. out. println( «Show that duplicates cannot be added. » ); if ( !tset. add(8)) System. out. println( «Could not add 8. » ); else { System. out. println( «Added 8» ); System. out. println( «New contents are » + tset ); } if (!tset. add(4)) System. out. println( «Could not add 4. » ); else { System. out. println( «Added 4. » ); System. out. println( «New contents are » + tset ); }

Очереди 2014 209 Очереди

Списки 2014 210 Списки

Реализации списка 2014 211 Реализации списка

Реализации списка :  пример Linked. List 2014 212 Linked. ListString ll = newРеализации списка : пример Linked. List 2014 212 Linked. List ll = new Linked. List(); // add elements to the linked list ll. add( «F» ); ll. add( «B» ); ll. add( «D» ); ll. add( «E» ); ll. add( «C» ); ll. add. Last( «Z» ); ll. add. First( «A» ); ll. add(1, «A 2» ); ll. push( «A 0» ); System. out. println( «Original contents of ll: » + ll); // remove elements from the linked list ll. remove( «F» ); ll. remove(2); System. out. println( «Contents of ll after deletion: » + ll); // remove first and last elements ll. remove. First(); ll. remove. Last(); System. out. println( «ll after deleting first and last: » + ll); System. out. println( «First : » + ll. peek. First()); System. out. println( «ll after peek first : » + ll); // get and set a value String val = ll. get(2); ll. set(2, val + » Changed» ); System. out. println( «ll after change: » + ll);

Ассоциативные контейнеры 2014 213 Ассоциативные контейнеры

Ассоциативные контейнеры :  пример  Hash. Map 2014 214 MapString, Integer m =Ассоциативные контейнеры : пример Hash. Map 2014 214 Map m = new Hash. Map(); String s= «some string contains some words in this string» ; // Initialize frequency table from string for (String a : s. split( » » )) { Integer freq = m. get(a); m. put(a, (freq == null ) ? 1 : freq + 1); } System. out. println(m. size() + » distinct words: » ); System. out. println(m);

2014 215 Ассоциативные контейнеры : Sorted. Map 2014 215 Ассоциативные контейнеры : Sorted. Map

2014 216 Ассоциативные контейнеры :  пример Tree. Map Integer, Stringt. Map = new2014 216 Ассоциативные контейнеры : пример Tree. Map t. Map = new Tree. Map(); // Добавляем данные t. Map. put(7, «Saturday» ); t. Map. put(2, «Monday» ); t. Map. put(1, «Sunday» ); t. Map. put(5, «Thursday» ); t. Map. put(3, «Tuesday» ); t. Map. put(4, «Wednesday» ); t. Map. put(6, «Friday» ); // Получаем все ключи System. out. println( «Keys of tree map: » + t. Map. key. Set()); // Получаем все значения System. out. println( «Values of tree map: » + t. Map. values()); // Получаем пятое значение System. out. println( «Key: 5 value: » + t. Map. get(5)+ «\n» ); // Получаем первый ключ и его значение System. out. println( «First key: » + t. Map. first. Key() + » Value: » + t. Map. get(t. Map. first. Key()) + «\n» ); // Получаем последние ключ и значение System. out. println( «Last key: » + t. Map. last. Key() + » Value: » + t. Map. get(t. Map. last. Key()) + «\n» ); // Удаляем первый ключ и значение System. out. println( «Removing first data: » + t. Map. remove(t. Map. first. Key())); System. out. println( «Now the tree map Keys: » + t. Map. key. Set()); System. out. println( «Now the tree map contain: » + t. Map. values() + «\n» ); // Удаляем последний ключ и значение System. out. println( «Removing last data: » + t. Map. remove(t. Map. last. Key())); System. out. println( «Now the tree map Keys: » + t. Map. key. Set()); System. out. println( «Now the tree map contain: » + t. Map. values()); System. out. println();

2014 217 Хеш-таблиц а 2014 217 Хеш-таблиц а

2014 218 Хеш-таблица :  пример HashtableString, Integer numbers = new HashtableString,  Integer();2014 218 Хеш-таблица : пример Hashtable numbers = new Hashtable(); numbers. put( «one» , 1); numbers. put( «two» , 2); numbers. put( «three» , 3); numbers. put( «four» , 4); numbers. put( «five» , 5); System. out. println(); String nums= «three one two five two» ; // Initialize frequency table from string for (String a : nums. split( » » )) { System. out. print(numbers. get(a)); } System. out. println();

2014 219 Класс-утилита Collections Служит для поддержки классов контейнеров и осуществления основных манипуляций с2014 219 Класс-утилита Collections Служит для поддержки классов контейнеров и осуществления основных манипуляций с содержимым: sort(List), sort(List, Comparator) binary. Search(List, Object), binary. Search(List, Object, Comparator) reverse(List) shuffle(List), shuffle(List, Random) fill(List, Object) copy(List, List) min(Collection), min(Collection, Comparator) max(Collection), max(Collection, Comoarator) Представляет коллекцию как Enumeration (метод enumeration(Collection) ) Создает не модифицируемый список, содержащий несколько копий объекта: n. Copies(int, Object): List Содержит специальные статические поля: EMPTY_SET , EMPTY_LIST , EMPTY_MAP

2014 220 Класс-утилита Collections (продолж. ) Предоставляет обертки для защиты контейнеров от модификации ,2014 220 Класс-утилита Collections (продолж. ) Предоставляет обертки для защиты контейнеров от модификации , для обеспечения синхронизированного доступа , для защиты от добавления элементов несоответствующих типов : unmodifiable. XXX(arg: XXX): XXX synchronized. XXX(arg: XXX): XXX checked. XXX(arg: XXX): XXX — это Collection , Set , Sorted. Set , List , Map , Sorted. Map Предоставляет не модифицируемые обертки, содержащие только один элемент (или пару ключ-значение для Map ): singleton(Object): Set singleton. List(Object): List singleton. Map(Object, Object): Map

2014 221 Collections :  пример использования Collections. sort  class My. Comp implements2014 221 Collections : пример использования Collections. sort class My. Comp implements Comparator { public int compare(String a, String b) { String a. Str, b. Str; a. Str = a; b. Str = b; // С равнение в обратном порядке return b. Str. compare. To(a. Str); } } Linked. List ll = new Linked. List(); // add elements to the linked list ll. add( «F» ); ll. add( «B» ); ll. add( «D» ); ll. add( «E» ); ll. add( «C» ); ll. add. Last( «Z» ); ll. add. First( «A» ); ll. add(1, «A 2» ); ll. push( «A 0» ); System. out. println( «Collection: » ); System. out. println(ll); Collections. sort(ll, new My. Comp()); System. out. println( «Compartator sorted: » +ll);

2014 222 Многопоточность в Java 2014 222 Многопоточность в Java

2014 223 Многопоточность в Java Потоки Java могут находиться в следующих состояниях : 2014 223 Многопоточность в Java Потоки Java могут находиться в следующих состояниях : • Может быть готов к выполнению. • Поток может выполняться. • Работающий поток может быть приостановлен. Выполнение приостановленного потока может быть возобновлено, позволяя ему продолжить работу с того места, где он был приостановлен. • Поток может быть заблокирован , когда ожидает какого-то ресурса. • В любой момент поток может быть прерван , что немедленно останавливает его выполнение. Однажды прерванный поток уже не может быть возобновлен. Java присваивает каждому потоку приоритет. Приоритеты потоков задаются целыми числами, определяющими относительный приоритет одного потока по сравнению с другими. Хотя программы Java могут запускаться в многозадачных средах на основании процессов, такая многозадачность средствами Java не контролируется. Однако Java-программа может одновременно выполнять две или более задач с использованием потоков.

2014 224 Многопоточность в Java C оздать новый поток  в Java можно 22014 224 Многопоточность в Java C оздать новый поток в Java можно 2 способами : 1. Создать объект класса Thread, передав ему в конструкторе класс, реализующий интерфейс Runnable. 2. Создать подкласса Thread и переопределить его метод run()Многопоточная система Java встроена в класс Thread , его методы и дополняющий его интерфейс Runnable. Класс Thread инкапсулирует механизмы работы с потоком. Методы управления Назначение get. Name Получить имя потока get. Priority Получить приоритет потока is. Alive Определить, выполняется ли поток join Ожидать завершения потока run Входная точка потока sleep Приостановить выполнение потока на заданное время start Запустить поток вызовом его метода run

2014 225 Многопоточность в Java Интерфейс Runnable абстрагирует единицу исполняемого кода. Возможно создать поток2014 225 Многопоточность в Java Интерфейс Runnable абстрагирует единицу исполняемого кода. Возможно создать поток из любого объекта, реализующего интерфейс Runnable. Чтобы реализовать интерфейс Runnable, класс должен объявить единственный метод run(): public void run() 1. Создание потока реализацией интерфейса Runnable Внутри метода run() определяется код, который, и составляет новый поток. После того как будет объявлен класс, реализующий интерфейс Runnable, для запуска потока необходимо создать экземпляр класса Thread с использованием конструктора : Thread(Runnable объект_потока, String имя_потока)

2014 226 Многопоточность в Java 1.  Создание потока реализацией интерфейса Runnable class Our.2014 226 Многопоточность в Java 1. Создание потока реализацией интерфейса Runnable class Our. Runnable implements Runnable{ public void run(){ System. out. println( » Созданный поток!» ); } } public class Threads{ static Our. Runnable rnbl ; // объект класса, реализующего интерфейс Runnable public static void main(String[] args){ rnbl = new Our. Runnable(); // создание экземляра Our. Runnable Thread my. Thread = new Thread( rnbl ); // Создание потока «my. Thready» Thread my. Thread 1 = new Thread( new Runnable(){ // Создание потока » my. Thread 1″ с использованием анонимного внутреннего класса public void run(){ System. out. println( «Поток созданный с использованием анонимного внутреннего класса!» ); }); my. Thread. start(); // Запуск потока my. Thread 1. start(); // Запуск потока 1 System. out. println( » Главный поток завершён. . . » ); } }

2014 227 Многопоточность в Java 2.  Создание потока наследованием от Thread Подкласс Thread2014 227 Многопоточность в Java 2. Создание потока наследованием от Thread Подкласс Thread обязан переопределить метод run(), который является точкой входа для нового потока. Он также должен вызвать метод start() для запуска выполнения нового потока. class My. Thread extends Thread{ @Override public void run(){ // Этот метод будет выполнен в побочном потоке System. out. println( » Новый поток!» ); } } public class Threads 1{ static My. Thread m. Second. Thread ; public static void main(String[] args){ m. Second. Thread = new My. Thread(); // Создание потока m. Second. Thread. start(); // Запуск потока System. out. println( » Главный поток завершён. . . » ); } }

2014 228 Многопоточность в Java Создание множества потоков Java программа может порождать столько потоков,2014 228 Многопоточность в Java Создание множества потоков Java программа может порождать столько потоков, сколько необходимо : class New. Thread implements Runnable { String name ; // name of thread Thread t ; New. Thread(String threadname) { name = threadname; t = new Thread( this , name ); System. out. println( «New thread: » + t ); t. start(); // Start the thread } public void run() { // This is the entry point for thread. try { for ( int i = 5; i > 0; i—) { System. out. println( name + «: » + i); Thread. sleep(1000); } } catch (Interrupted. Exception e) { System. out. println( name + «Interrupted» ); } System. out. println( name + » exiting. » ); } } class Threads 2 { //Multi. Thread. Demo public static void main(String args[]) { for ( int i=1; i<5; i++){ new New. Thread( "Thread " +i); // start threads } try { Thread. sleep(10000); // wait for other threads to end } catch (Interrupted. Exception e) { System. out. println( "Main thread Interrupted" ); } System. out. println( "Main thread exiting. " ); } }

2014 229 Многопоточность в Java Методы, использующиеся при работе с потоками Thread. sleep() 2014 229 Многопоточность в Java Методы, использующиеся при работе с потоками Thread. sleep() — статический метод класса Thread, который приостанавливает выполнение потока, в котором он был вызван. Во время выполнения метода sleep() система перестает выделять потоку процессорное время, распределяя его между другими потоками. Метод sleep() может выполняться либо заданное кол-во времени (миллисекунды или наносекунды) либо до тех пор пока он не будет остановлен прерыванием (в этом случае он сгенерирует исключение Interrupted. Exception). Thread. sleep(1500); //Ждет полторы секунды Thread. sleep(2000, 100); //Ждет 2 секунды и 100 наносекунд Статический метод Thread. yield() заставляет процессор переключиться на обработку других потоков системы. Метод может быть полезным, например, когда поток ожидает наступления какого-либо события и необходимо чтобы проверка его наступления происходила как можно чаще. В этом случае можно поместить проверку события и метод Thread. yield() в цикл: //Ожидание поступления сообщения while(!msg. Queue. has. Messages()) { //Пока в очереди нет сообщений Thread. yield(); //Передать управление другим потокам }

2014 230 Многопоточность в Java Методы, использующиеся при работе с потоками for (int i2014 230 Многопоточность в Java Методы, использующиеся при работе с потоками for (int i = 0; i < inputs. length; i++) { heavy. Work(inputs[i]); if (Thread. interrupted()) { // We've been interrupted: no more Work. return; } }Interruption Класс Thread содержит в себе скрытое булево поле, которое называется флагом прерывания. Установить этот флаг можно вызвав метод interrupt() потока. Проверить установлен ли этот флаг, можно двумя способами : 1. вызвать метод bool is. Interrupted() объекта потока ; 2. вызвать статический метод bool Thread. interrupted(). Первый метод возвращает состояние флага прерывания и оставляет этот флаг нетронутым. Второй метод возвращает состояние флага и сбрасывает его. Thread. interrupted() — статический метод класса Thread, и его вызов возвращает значение флага прерывания того потока, из которого он был вызван. Поэтому этот метод вызывается только изнутри потока и позволяет потоку проверить своё состояние прерывания.

2014 231 Многопоточность в Java Методы, использующиеся при работе с потоками. Interupt import java.2014 231 Многопоточность в Java Методы, использующиеся при работе с потоками. Interupt import java. util. Linked. List; import java. util. List; class My. Thread extends Thread{ public String name ; My. Thread(String iname){ name =iname; } @Override public void run(){ // Этот метод будет выполнен в побочном потоке System. out. println( » Поток » + name + » запущен!» ); for ( int i=0; i<1000000; i++){ if (Thread. interrupted()) { // We've been interrupted: no more Work. System. out. println( "Поток " + name + " прерван в цикле обработки!" ); return ; } try { Thread. sleep(1000); } catch (Interrupted. Exception e) { System. out. println( "Поток " + name + " прерван при ожидании!" ); return ; } System. out. println( " Поток " + name + " завершен!" ); } } public class Threads. Interupt{ static My. Thread m. Thread ; public static void main(String[] args) throws Interrupted. Exception{ List list = new Linked. List(); for ( int i=1; i<5; i++){ m. Thread = new My. Thread(String. value. Of(i)); // Создание потока m. Thread. start(); // Запуск потока list. add( m. Thread ); } Thread. sleep(100); for (Thread ph: list){ ph. interrupt(); } System. out. println( " Главный поток завершён. . . " ); } }

2014 232 Многопоточность в Java Методы, использующиеся при работе с потоками Метод join() В2014 232 Многопоточность в Java Методы, использующиеся при работе с потоками Метод join() В Java предусмотрен механизм, позволяющий одному потоку ждать завершения выполнения другого. Для этого используется метод join(). Например, чтобы главный поток подождал завершения побочного потока my. Thread, необходимо выполнить инструкцию my. Thread. join() в главном потоке. Как только поток my. Thread завершится, метод join() вернет управление, и главный поток сможет продолжить выполнение. Метод join() имеет перегруженную версию, которая получает в качестве параметра время ожидания. В этом случае join() возвращает управление либо когда завершится ожидаемый поток, либо когда закончится время ожидания. Подобно методу Thread. sleep() метод join может ждать в течение указанного количества миллисекунд и наносекунд ( аргументы такие же как и у sleep()). boolean is. Alive() — возвращает true если поток выполняется и false если поток еще не был запущен или был завершен. set. Name(String thread. Name) – задает имя потока. String get. Name() – получает имя потока. Имя потока – ассоциированная с ним строка. static Thread. current. Thread() — статический метод, возвращающий объект потока, в котором он был вызван. long get. Id() – возвращает идентификатор потока. Идентификатор – уникальное число, присвоенное потоку. void set. Priority(int priority) – устанавливает приоритет потока. Возможные значения priority — MIN_PRIORITY, NORM_PRIORITY и MAX_PRIORITY. int get. Priority() – получает приоритет потока.

2014 233 Подсистема ввода-вывода java. io 2014 233 Подсистема ввода-вывода java. io

2014 234 Подсистема ввода-вывода java. io Serializ ableInterface Object. OutputInterface Object. InputInterface Externaliz able2014 234 Подсистема ввода-вывода java. io Serializ able<> Object. Output<> Object. Input<> Externaliz able <>Data. Output<> Data. Input<> Input. Stream Output. Stream Reader Writer File. IOException

2014 235 Подсистема ввода-вывода java. io 2014 235 Подсистема ввода-вывода java. io

2014 236 Потоки ввода-вывода Потоки ввода вывода бывают двух типов:  узловые потоки (node2014 236 Потоки ввода-вывода Потоки ввода вывода бывают двух типов: узловые потоки (node streams) – предоставляют ввод вывод на уровне потоков байт фильтрующие потоки (filter streams) – предоставляют обертки вокруг низкоуровневых потоков для обеспечения расширенной функциональности Input. Stream() read() : int read(arg 0 : byte[], arg 1 : int, arg 2 : int) : int skip(arg 0 : long) : long available() : int close() : void mark(arg 0 : int) : void reset() : void mark. Supported() : boolean Output. Stream() write(arg 0 : int) : void write(arg 0 : byte[], arg 1 : int, arg 2 : int) : void flush() : void close() : void

2014 237 Узловые потоки работают непосредственно с подлежащими источниками (приемниками) данных на уровне байт.2014 237 Узловые потоки работают непосредственно с подлежащими источниками (приемниками) данных на уровне байт. Источниками(приемниками) могут быть: файлы в файловой системе – File. Input. Stream, File. Output. Stream массивы байт в памяти – Byte. Array. Input. Stream, Byte. Array. Output. Stream каналы (pipes) — Piped. Input. Stream, Piped. Output. Stream строки – String. Buffer. Input. Stream (deprecated) прочие источники – сокеты и т. д: something. get. Input. Stream(), something. get. Output. Stream()

2014 238 Пример – копирование файлов import java. io. *; public class File. Copy2014 238 Пример – копирование файлов import java. io. *; public class File. Copy { public static void main(String args[]) { Input. Stream in = null; Output. Stream out = null; try { in = new File. Input. Stream(args[0]); out = new File. Output. Stream(args[1]); } catch (Exception e) { System. out. println(«Неправильные аргументы»); if (in!=null) try {in. close(); } catch(IOException ix 2){} return; } byte buf[] = new byte[1024]; //Буфер для хранения промежуточного блока int read; //Переменная для хранения количества прочитанных байт try { while ( (read = in. read(buf)) >= 0) //При достижении конца вернет <0 out. write(buf, 0, read); //Записываем ровно столько сколько удалось прочитать } catch (IOException ioex) { System. out. println(“Ошибка ввода/вывода: ”+ioex. get. Localized. Message()); } finally { try {in. close(); } catch(IOException ix 2){} try {out. close(); } catch (IOException ix 3) {} }

2014 239 Фильтрующие потоки предоставляют дополнительную функциональность на основе других потоков абстрактные – Filter.2014 239 Фильтрующие потоки предоставляют дополнительную функциональность на основе других потоков абстрактные – Filter. Input. Stream, Filter. Output. Stream буферизация – Buffered. Input. Stream, Buffered. Output. Stream форматированный ввод-вывод данных – Data. Input. Stream, Data. Output. Stream сериализация объектов – Object. Input. Stream, Object. Output. Stream опережающее чтение – Pushback. Input. Stream объединение потоков – Sequence. Input. Stream печатный поток вывода – Print. Stream построчное чтение – Line. Number. Input. Stream (deprecated)

2014 240 Произвольный доступ к файлу Random. Access. File используется для осуществления произвольного доступа2014 240 Произвольный доступ к файлу Random. Access. File используется для осуществления произвольного доступа к содержимому файла: обеспечивает форматированный ввод-вывод данных (реализует интерфейсы Data. Input и Data. Output ) void seek(long) — позиционирование в файле long get. File. Pointer() — текущая позиция курсора

2014 241 Ввод данных с использованием класса Scaner Начиная с версии Java  1.2014 241 Ввод данных с использованием класса Scaner Начиная с версии Java 1. 5 , в пакете java. util существует класс Scanner. Для каждого из базовых типов (а также классов длинной арифметики) имеется пара методов: has. Next. T() говорит, можно ли далее прочесть элемент типа T , в то время как next. T() этот элемент пытается считать. Scanner scanner = new Scanner(file); while (scanner. has. Next. Line()) { if (scanner. has. Next. Int()) { int i = scanner. next. Int(); System. out. println(«Тип Integer: » + i); } else if (scanner. has. Next. Double()) { double d = scanner. next. Double(); System. out. println(«Тип double: » + d); } else if (scanner. has. Next. Boolean()) { Boolean b = scanner. next. Boolean(); System. out. println(«Тип boolean: » + b); } else { System. out. println(«String: » + scanner. next()); } }

2014 242 Символьные потоки (readers & writers) 2014 242 Символьные потоки (readers & writers)

2014 243 Символьные потоки (readers & writers) В отличие от байтовых потоков, работают на2014 243 Символьные потоки (readers & writers) В отличие от байтовых потоков, работают на уровне символов, что позволяет корректно работать с различными кодировками В качестве мостов между байтовыми и символьными потоками используются классы Input. Stream. Reader и Output. Stream. Writer lock : Object Writer() Writer(arg 0 : Object) write(arg 0 : int) : void write(arg 0 : char[], arg 1 : int, arg 2 : int) : void write(arg 0 : String, arg 1 : int, arg 2 : int) : void flush() : void close() : void Reader lock : Object Reader() Reader(arg 0 : Object) read() : int read(arg 0 : char[], arg 1 : int, arg 2 : int) : int skip(arg 0 : long) : long ready() : boolean mark. Supported() : boolean mark(arg 0 : int) : void reset() : void close() : void

2014 244 Символьные потоки Узловые символьные потоки:  файловые – File. Reader, File. Writer2014 244 Символьные потоки Узловые символьные потоки: файловые – File. Reader, File. Writer на основе массивов символов – Char. Array. Reader, Char. Array. Writer канальные – Piped. Reader, Piped. Writer строковые – String. Reader, String. Writer Фильтрующие символьные потоки: абстрактные – Filter. Reader , Filter. Writer буферизирующие – Buffered. Reader, Buffered. Writer переходные – Input. Stream. Reader, Output. Stream. Writer опережающее чтение – Pushback. Reader построчное чтение – Line. Number. Reader печатный поток вывода – Print. Writer

2014 245 Stream. Tokenizer class Stream. Tokeniz er ttype : int TT_EOF : 2014 245 Stream. Tokenizer class Stream. Tokeniz er ttype : int TT_EOF : int = -1 TT_EOL : int = 10 TT_NUMBER : int = -2 TT_WORD : int = -3 nval : double sval : String Stream. Tokeniz er(arg 0 : Input. Stream) Stream. Tokeniz er(arg 0 : Reader) reset. Syntax() : void word. Chars(arg 0 : int, arg 1 : int) : void whitespace. Chars(arg 0 : int, arg 1 : int) : void ordinary. Char(arg 0 : int) : void comment. Char(arg 0 : int) : void quote. Char(arg 0 : int) : void parse. Numbers() : void eol. Is. Significant(arg 0 : boolean) : void slash. Star. Comments(arg 0 : boolean) : void slash. Slash. Comments(arg 0 : boolean) : void lower. Case. Mode(arg 0 : boolean) : void next. Token() : int push. Back() : void lineno() : int to. String() : String. Экземпляр Stream. Tokenizer создается поверх существующего объекта, либо Input. Stream, либо Reader. Как и java. util. String. Tokenizer, этот класс позволяет разбивать данные на лексемы (token), выделяемые из потока по определенным свойствам. Поскольку работа ведется со словами, конструктор, принимающий Input. Stream, объявлен как deprecated (предлагается оборачивать байтовый поток классом Input. Stream. Reader и вызывать второй конструктор). Общий принцип работы такой же, как и у String. Tokenizer, – задаются параметры разбиения, после чего вызывается метод next. Token(), пока не будет достигнут конец потока.

2014 246 Сериализация объектов Средства сериализации и десериализации объектов пакета java. io реализуют поддержку2014 246 Сериализация объектов Средства сериализации и десериализации объектов пакета java. io реализуют поддержку принципа сохраняемости ООП Сериализация используется для сохранения иерархий объектов для передачи в другую виртуальную машину, либо для последующего восстановления в другом сеансе работы системы Особенности сериализации: версионность классов сериализуемых объектов сохранение иерархий кеширование и переиспользование ссылок на уже сериализованные объекты средства управления процессом сериализации (десериализации) объектов

2014 247 Obje ct. Input re ad. Obje ct() : Obje ct re ad()2014 247 Obje ct. Input re ad. Obje ct() : Obje ct re ad() : int re ad(arg 0 : byte [], arg 1 : int, arg 2 : int) : int skip(arg 0 : long) : long av ailable () : int close () : v oid <> Obje ct. In put. Stre am. Obje ct. Output write Obje ct(arg 0 : Obje ct) : v oid write (arg 0 : int) : v oid write (arg 0 : byte [], arg 1 : int, arg 2 : int) : v oid flush() : v oid close () : v oid <> Obje ct. Output. Stre am Exte rnalizable write Exte rnal(arg 0 : Obje ct. Output) : v oid re ad. Exte rnal(arg 0 : Obje ct. Input) : v oid <>Se rializable<> Obje ct. Stre am. Class Obje ct. Stre am. Constants <>Ob je ct. Stre am. Fie ld Obje ct. Input. Validation v alidate Obje ct() <>

2014 248 Исключения при сериализации Inv alid. Class. Exce ption Inv alid. Obje ct.2014 248 Исключения при сериализации Inv alid. Class. Exce ption Inv alid. Obje ct. Exce ption Ob je ct. Stre am. Exce ption Not. Se rializable Exce ption. Not. Activ e Exce ption Stre am. Corrupte d. Exce ption Write Aborte d. Exce ption de tail : Exce ption Optional. Data. Exce ption

2014 249 Общие правила Классы, объекты которых подлежат сериализации должны реализовывать маркерный интерфейс java.2014 249 Общие правила Классы, объекты которых подлежат сериализации должны реализовывать маркерный интерфейс java. io. Serializable По умолчанию подлежат сохранению все поля объектов не объявленные transient. Статические поля не сеариализуются Для сериализации и десериализации используются фильтрующие потоки Object. Output. Stream и Object. Input. Stream Сериализуемые поля класса реализующего интерфейс Serializable должны быть примитивными типами либо типами, реализующими интерфейс Serializable Если класс имеет своим суперклассом класс, не реализующий интерфейс Serializable , то у данного суперкласса должен быть доступен конструктор с пустым списком аргументов Сериалиазации внутренних или анонимных классов следует категорически избегать

2014 250 Управление сериализацией объекта Для явного определения списка сериализуемых полей нужно в классе2014 250 Управление сериализацией объекта Для явного определения списка сериализуемых полей нужно в классе объявить поле private static final Object. Stream. Field[] serial. Persistent. Fields = {…}; Для управления процессом сериализации/десериализации нужно в классе объявить методы: private void write. Object(java. io. Object. Output. Stream out) throws IOException {…} private void read. Object(java. io. Object. Input. Stream in) throws IOException, Class. Not. Found. Exception {…} Для управления замещением объ е кта при сериализации/десериализации нужно определить методы: Object write. Replace() throws Object. Stream. Exception {…} Object read. Resolve() throws Object. Stream. Exception {…} Для явного задания номера версии нужно определить поле static final long serial. Version. UID = …;

2014 251 Интерфейс java. io. Externalizable  Позволяет полностью управлять форматом записи данных класса2014 251 Интерфейс java. io. Externalizable Позволяет полностью управлять форматом записи данных класса (автоматически сохраняется только информация о классе и объекте) Для сохранения состояния нужно реализовать метод public void write. External(Object. Output out) throws IOException Для восстановления состояния нужно реализовать метод public void read. External(Object. Input in) throws IOException, java. lang. Class. Not. Found. Exception Класс реализующий интерфейс Externalizable должен иметь public конструктор с пустым списком аргументов

2014 252 Версионность Изменения, ведущие к несовместимости версий классов:  Удаление полей не объявленных2014 252 Версионность Изменения, ведущие к несовместимости версий классов: Удаление полей не объявленных transient Изменение позиции класса в иерархии классов Изменение факта наличия/отсутствия модификаторов static и transient у поля Изменение типа у поля примитивного (встроенного) типа Изменение реализации методов write. Object() и read. Object() на предмет использования методов default. Write. Object() и default. Read. Object() классов Object. Output. Stream и Object. Input. Stream соответственно Изменение класса с Serializable на Externalizable и наоборот Добавление методов write. Replace() или read. Resolve() Изменение факта наследования классом интерфейсов Serializable или Externalizable

2014 253 Средства работы с файлами Если классы потоков осуществляют реальную запись и чтение2014 253 Средства работы с файлами Если классы потоков осуществляют реальную запись и чтение данных, то класс File – это вспомогательный инструмент, призванный обеспечить работу с файлами и каталогами. Объект класса File является абстрактным представлением файла и пути к нему. Он устанавливает только соответствие с ним, при этом для создания объекта неважно, существует ли такой файл на диске. После создания можно выполнить проверку, вызвав метод exists, который возвращает значение true, если файл существует. Создание или удаление объекта класса File не отображается на реальных файлах. Для работы с содержимым файла можно получить экземпляры File. I/OStream. Объект File может указывать на каталог (узнать это можно путем вызова метода is. Directory). Метод list возвращает список имен (массив String ) содержащихся в нем файлов (если объект File не указывает на каталог – будет возвращен null ).

2014 254 Средства работы с файлами Также класс File предоставляет возможность получения некоторой информации2014 254 Средства работы с файлами Также класс File предоставляет возможность получения некоторой информации о файле. • Методы can. Read и can. Write – возвращается boolean значение, можно ли будет приложению производить чтение и изменение содержимого из файла, соответственно. • get. Name – возвращает строку – имя файла (или каталога). • get. Parent, get. Parent. Name – возвращают каталог, где файл находится в виде объекта и строки названия File, соответственно. • get. Path – возвращает путь к файлу (при этом в строку преобразуется абстрактный путь, на который указывает объект File ). • is. Absolutely – возвращает boolean значение, является ли абсолютным путь, которым указан файл. Определение, является ли путь абсолютным, зависит от системы, где запущена Java-машина. Так, для Windows абсолютный путь начинается с указания диска, либо символом ‘\’. Для Unix абсолютный путь начинается символом ‘/’. • is. Directory, is. File – возвращает boolean значение, указывает ли объект на каталог либо файл, соответственно. • is. Hidden – возвращает boolean значение, указывает ли объект на скрытый файл. • last. Modified – дата последнего изменения. • length – длина файла в байтах.

2014 255 Средства работы с файлами Также можно изменить некоторые свойства файла – методы2014 255 Средства работы с файлами Также можно изменить некоторые свойства файла – методы set. Read. Only, set. Last. Modified , назначение которых очевидно из названия. Если нужно создать файл на диске, это позволяют сделать методы create. New. File, mk. Dirs. Соответственно, create. New. File создает пустой файл (если таковой еще не существует), mk. Dir создает каталог, если для него все родительские уже существуют, а mk. Dirs создаст каталог вместе со всеми необходимыми родительскими. Файл можно удалить – для этого предназначены методы delete и delete. On. Exit. При вызове метода delete файл будет удален сразу же, а при вызове delete. On. Exit по окончании работы Java-машины (только при корректном завершении работы) отменить запрос уже невозможно.

2014 256 Библиотека SWING 2014 256 Библиотека SWING

2014 257 Библиотека S wing Swing — это библиотека для создания графического интерфейса пользователя2014 257 Библиотека S wing Swing — это библиотека для создания графического интерфейса пользователя -представляет собой набор классов, применяемых для создания графических пользовательских интерфейсов (Graphical User Interface — GUI) современных приложений, в том числе Web-приложений. В сравнении с использовавшейся в ранних версиях Java библиотекой AWT, библиотека Swing имеет ряд преимуществ: • богатый набор интерфейсных примитивов; • настраивающийся внешний вид на различных платформах (look and feel); • раздельная архитектура модель-вид (model-view); • встроенная поддержка HTML. Swing предоставляет богатый набор визуальных компонентов, например, кнопок, полей редактирования, полос прокрутки, переключателей, таблиц и т. п. Посредством Swing можно разработать интерфейс приложения, удовлетворяющий большинству потребностей пользователей.

2014 258 Библиотека S wing В состав графического пользовательского интерфейса,  созданного средствами Swing2014 258 Библиотека S wing В состав графического пользовательского интерфейса, созданного средствами Swing , входят элементы двух типов: компоненты и контейнеры. Компоненты — это независимые элементы (например, кнопки или линейные регуляторы). Контейнер может содержать в себе несколько компонентов и представляет собой специальный тип компонента. Чтобы компонент отобразился на экране, его надо поместить в контейнер. Таким образом, в составе графического пользовательского интерфейса должен присутствовать хотя бы один контейнер. Поскольку контейнеры являются компонентами, один контейнер может находиться в составе другого. Это позволяет формировать так называемую иерархию контейнеров, на вершине которой должен находиться контейнер верхнего уровня. Контейнер верхнего уровня не может включаться в состав других контейнеров. Более того, любая иерархия должна начинаться именно с контейнера верхнего уровня. В приложениях для этой цели чаще всего используется объект JFrame , в апплетах — JApplet (Java-апплет — прикладная программа Java , встраиваемая в Web -страницы и выполняемая в веб-обозревателе c использованием виртуальной машины Java ).

2014 259 Библиотека S wing JFrame  — контейнер,  предназначенный для размещения на2014 259 Библиотека S wing JFrame — контейнер, предназначенный для размещения на нем других компонентов. JFrame регистрируется в ОС как окно и получает многие из свойств окна операционной системы: минимизация/максимизация, изменение размеров и перемещение. Основные методы класса JFrame : get / set. Title () — Получить/установить заголовок фрейма. get / set. State () — Получить/установить состояние фрейма (минимизировать, максимизировать и т. д. ). is / set. Visible () — Получить/установить видимость фрейма, другими словами, отображение на экране. get / set. Location () — Получить/установить месторасположение в окне, где фрейм должен появиться. get / set. Size () — Получить/установить размер фрейма. add () — Добавить компоненты к фрейму.

2014 260 Библиотека S wing JLabel  — компонент, позволяющий отобразить текст с иконкой.2014 260 Библиотека S wing JLabel — компонент, позволяющий отобразить текст с иконкой. Основные методы класса JLabel : get / set. Text () — Получить/установить текст в метке. get / set. Icon () — Получить/установить изображение в метке. get / set. Horizontal. Alignment () — Получить/установить горизонтальную позицию текста. get / set. Vertical. Alignment () — Получить/установить вертикальную позицию текста. get / set. Displayed. Mnemonic () — Получить/установить мнемонику (подчеркнутый символ) для метки. get / set. Label. For () — Получить/установить компонент, к которому присоединена данная метка; когда пользователь нажимает комбинацию клавиш Alt +мнемоника, фокус перемещается на указанный компонент.

2014 261 Библиотека S wing JButton  — компонент Swing , реализующий кнопку. Основные2014 261 Библиотека S wing JButton — компонент Swing , реализующий кнопку. Основные методы класса JButton : get / set. Text () — Получить/ установить текст в кнопке. get / set. Icon () — Получить/ установить изображение в кнопке. get / set. Horizontal. Alignment () — Получить/установить горизонтальную позицию текста. get / set. Vertical. Alignment () — Получить/установить вертикальную позицию текста. get / set. Displayed. Mnemonic () — Получить/установить мнемонику (подчеркнутый символ), которая в комбинации с кнопкой Alt вызывает нажатие кнопки. JText. Field — компонент Swing, реализующий строку ввода текста. Основные методы класса JText. Field : get/set. Text() — Этот метод получает/устанавливает текст внутри JText. Field.

2014 262 Библиотека S wing JCombo. Box  — комбинированный список — выпадающий список2014 262 Библиотека S wing JCombo. Box — комбинированный список — выпадающий список элементов, в котором пользователь может выбрать ноль или один (и только один) элемент. Основные методы класса JCombo. Box : add. Item() — Добавить элемент к JCombo. Box. get/set. Selected. Index() — Получить/установить индекс выбранного элемента в JCombo. Box. get/set. Selected. Item() — Получить/установить выбранный объект. remove. All. Items() — Удалить все объекты из JCombo. Box. remote. Item() — Удалить конкретный объект из JCombo. Box. Компоненты JCheck. Box и JRadio. Button предоставляют пользователю переключатели для выбора. JRadio. Button обычно группируются вместе для предоставления пользователю возможности выбора только одного варианта из нескольких представленных. Классом, который позволяет группировать вместе компоненты JCheck. Box или JRadio. Button , является класс Button. Group. Он позволяет группировать варианты JRadio. Button таким образом, что при выборе одного, с другого отметка автоматически снимается. Основные методы класса Button. Group : add() — Добавить JCheck. Box или JRadio. Button к Button. Group. get. Elements() — Получить все компоненты в Button. Group , для того, чтобы можно было выполнить итерацию по ним для поиска выбранного.

2014 263 Библиотека S wing Компонент JText. Area  разширяет возможности компонента JText. Field.2014 263 Библиотека S wing Компонент JText. Area разширяет возможности компонента JText. Field. В то время как JText. Field ограничен лишь одной строкой текста, JText. Area позволяет пользователю вводить несколько строк. Дополнительные методы класса JText. Area по сравнению с JText. Field : is/set. Line. Wrap() — Устанавливает, должна ли переноситься строка, если она становится слишком длинной. is/set. Wrap. Style. Word() — Устанавливает, должно ли переноситься слово на следующую строку, если оно слишком длинное. JScroll. Pane — предоставляет Swing-компонент для обработки всех действий по прокрутке, если необходимая информация не может полностью отображаться в каком-либо объекте (например, текст в JText. Area ). JList является полезным компонентом для предоставления пользователю вариантов для множественного выбора. Необходимо использовать JList совместно с JScroll. Pane , поскольку он может предоставлять больше вариантов, чем помещается в видимой области. Основные методы класса JList : get/set. Selected. Index() — Получить/установить выбранную строку списка; в случае со списками с множественным выбором возвращается int[]. get/set. Selection. Mode() — Получить/установить режим выбора в одиночный выбор, одиночный интервал или множественный интервал. set. List. Data() — Установить данные для использования в JList. get/set. Selected. Value() — Получить выбранный объект.

2014 264 Библиотека S wing Менеджерыкомпоновкив. Swing Менеджеры компоновки используются для автоматического позиционирования и2014 264 Библиотека S wing Менеджерыкомпоновкив. Swing Менеджеры компоновки используются для автоматического позиционирования и задания размеров дочерних элементов в контейнере. Компоновщиком является любой объект реализующий интерфейс Layout. Manager или Layout. Manager 2 (поддерживает выравнивание и ограничения). Стандартные компоновщики Swing : Border. Layout — размещает элементы в один из пяти регионов, как было указано при добавлении элемента в контейнер: наверх, вниз, влево, вправо, в центр. По умолчанию элемент добавляется в центр. Если в указанном регионе уже есть элемент, то он замещается новым. Поэтому, когда надо разместить несколько элементов в одном регионе, то их объединяют в один контейнер (обычно JPanel ). По умолчанию в Swing используется менеджер Border. Layout. В нем определены следующие константы для установки компонентов. Border. Layout. NORTH ( верх ) Border. Layout. SOUTH ( низ ) Border. Layout. EAST ( справа ) Border. Layout. WEST ( слева ) Border. Layout. CENTER (заполнить середину до других компонент или до краев)

2014 265 Библиотека S wing Flow. Layout  - размещает элементы по порядку в2014 265 Библиотека S wing Flow. Layout — размещает элементы по порядку в том же направлении, что и ориентация контейнера (слева на право по умолчанию), применяя один из пяти видов выравнивания, указанного при создании менеджера. Grid. Layout — размещает элементы в виде таблицы. Количество столбцов и строк указывается при создании менеджера. По умолчанию одна строка, а число столбцов равно числу элементов. Вся область контейнера разбивается на ячейки и размер каждого элемента устанавливается в размер ячейки. Box. Layout — размещает элементы по вертикали или по горизонтали. Обычно он используется не напрямую, а через контейнерный класс Box. Grid. Bag. Layout , как и Grid. Layout менеджер, устанавливает компоненты в таблицу, но он более гибок, так как предоставляет возможность определять для компонентов разную ширину и высоту колонок и строк таблицы. По существу, Grid. Bag. Layout помещает компоненты в ячейки, и затем использует привилегированные размеры компонентов, чтобы определить, насколько большой должна быть ячейка. Существуют и более сложные менеджеры компоновки такие как Card. Layout , Group. Layout , Spring. Layout.

2014 266 Библиотека S wing Событияиобработкасобытийкомпонентов. Swing В Swing  используется механизм обработки событий,2014 266 Библиотека S wing Событияиобработкасобытийкомпонентов. Swing В Swing используется механизм обработки событий, который называется модель делегирования событий. Источник генерирует событие, которое передается одному или нескольким обработчикам. В рамках данной схемы обработчики лишь ожидают воз никновения события. При возникновении события они обрабатывают его и возвращают управление. Преимущество такого подхода в том, что логика обработки событий отделена от логики пользовательского интерфейса, генерирующего эти события. Элемент интерфейса «делегирует» обработку события отдельному фрагменту кода. В модели делегирования событий обработчик, чтобы получать оповещения о событиях, должен быть зарегистрирован в источнике. Согласно модели делегирования, событие является объектом, описывающим изменения состояния источника. Событие может быть следствием действий пользователя с элементом графического интерфейса или сгенерировано программными средствами. Суперклассом всех событий является java. util. Event. Object. Многие события объявлены в пакете java. awt. event , но не которые содержатся в javax. swing. event.

2014 267 Библиотека S wing Источник события  — это объект,  сгенерировавший его.2014 267 Библиотека S wing Источник события — это объект, сгенерировавший его. Как отмечалось выше, сгенерировав собы тие, источник должен передать его всем зарегистрированным обработчикам. Следовательно, чтобы обработчик получил событие, он должен быть зарегист рирован в источнике. Регистрация осуществляется путем вызова метода add Тип Listener (), принадлежащего источнику (например, add. Action. Listener, add. Key. Listener, add. Mouse. Listener и тп). Для каждого типа события опре делен собственный метод регистрации. Заголовок метода имеет вид, подобный представленному ниже: public void add Тип Listener (Тип Listener el ) Источник должен также предоставлять метод, позволяющий отменить регистрацию обработчика событий определенного типа. Этот метод имеет заголовок, представленный в следующей форме: public void remove Тип Listener( Тип Listener el)

2014 268 Библиотека S wing Обработчик  — это объект,  оповещаемый о возникновении2014 268 Библиотека S wing Обработчик — это объект, оповещаемый о возникновении события. К нему предъявляются два основных требования. Во-первых, чтобы получать оповещение о конкретном типе событий, он должен быть зарегистрирован в одном или нескольких источниках. Во-вторых, он должен реализовывать метод, предназначенный для обработки события. Методы, позволяющие получать и обрабатывать события, определены в интерфейсах, содержащихся в пакетах java. awt. event , javax. swing. event и java. beans. Например, в интерфейсе Action. Listener объявлен метод, который вызывается тогда, когда пользователь щелкает на кнопке или выполняет другое действие, затрагивающее компонент. Это событие может быть обработано любым объектом, при условии, что он реализует интерфейс Action. Listener.

2014 269 Библиотека S wing Общие правила,  которые следует учитывать при обработке событий,2014 269 Библиотека S wing Общие правила, которые следует учитывать при обработке событий, таковы: обработчик должен выполнять свою задачу быстро и возвращать управление. По возможности он не должен осуществлять сложные операции, поскольку это может замедлить работу всего приложения. Пример класса-обработчика нажатий кнопки: class My. Action. Listener implements Action. Listener { public void action. Performed(Action. Event e) { JButton source = (JButton) e. get. Source(); // получаем источник сообщения //(объект — кнопка) String button. Text = source. get. Text (); // получаем из кнопки текст // и показываем диалоговое окно с текстом нажатой кнопки JOption. Pane. show. Message. Dialog(null, » Нажата кнопка » + button. Text); } } Пример назначения обработчика кнопке: JFrame frame = new JFrame («Обработчик сообщений»); frame. set. Default. Close. Operation(JFrame. EXIT_ON_CLOSE); JButton button = new JButton(» Кнопка Один «); button. add. Action. Listener(new My. Action. Listener());