
Практикум_презентация(1).ppt
- Количество слайдов: 97
Основы ООП. Практикум Панов Александр Игоревич Московский физико-технический институт
Семинар 1. TIOBE Index http: //www. tiobe. com/index. php/content/paperinfo/tpci/index. html 01. 02. 2018 2
Семинар 1. ООП на примере языка Java n n n C 1995 г. 5 версий – последняя JDK 1. 7 Поддержка Sun – Oracle http: //docs. oracle. com/javase/7/docs/ Программы транслируются в байт-код, выполняемый виртуальной машиной Java (JVM) Сборка мусора garbage collector (GC) Java. SE, Java. EE, Java. FX, Android Ориентация на web и mobile 01. 02. 2018 3
Семинар 1. Компоненты языка Java 01. 02. 2018 4
Семинар 1. Лексика языка. Кодировка Unicode - u 1 B 05 n Пробелы, комментарии, double a = 1, b = 1, c = 6; double D = b * b - 4 * a * c; if (D >= 0) { double x 1 = (-b + Math. sqrt (D)) / (2 * a); double x 2 = (-b - Math. sqrt (D)) / (2 * a); } n int x = 2; int y = 0; /* if (x > 0) y = y + x*2; else y = -y - x*4; */ y = y*y; // + 2*x; 01. 02. 2018 5
Семинар 1. Лексика языка. Ключевые слова и идентификаторы Идентификаторы – это имена, которые даются различным элементам языка для упрощения доступа к ним. Имена имеют пакеты, классы, интерфейсы, поля, методы, аргументы и локальные переменные. Computer, COLOR_RED, _, a. Very. Long. Name. Of. The. Method n Ключевые слова – это зарезервированные слова, состоящие из ASCII -символов и выполняющие различные задачи языка. abstract double int strictfp boolean else interface super break extends long switch byte final native synchronized case finally new this catch float package throw char for private throws class goto protected transient const if public try continue implements return void default import short volatile do instanceof static while n 01. 02. 2018 6
Семинар 1. Лексика языка. Литералы и операторы Литералы позволяют задать в программе значения для числовых, символьных и строковых выражений, а также null-литералов: q целочисленный (integer) - int, long - 137; q дробный (floating-point) – float, double - 3. 14; q булевский (boolean) – boolean - true; q символьный (character) – char – ‘G’; q строковый (string) – String – “строчка”; q null-литерал (null-literal). n Операторы используются в различных операциях – арифметических, логических, битовых, операциях сравнения и присваивания. = > < ! ~ ? : == <= >= != && || ++ -- + - * / & | ^ % << >> >>> += -= *= /= &= |= ^= %= <<= >>>= n 01. 02. 2018 7
Семинар 1. Лексика языка. Пример программы public class Demo { /** * Основной метод, с которого начинается * выполнение любой Java программы. */ public static void main (String args[]) { System. out. println("Hello, world!"); } } javac Demo. java Demo 01. 02. 2018 8
Семинар 2. ООП. Процедурноориентированная методология n n n Процедурная – алгоритмическая Алгоритм – это способ решения вычислительных и других задач, точно описывающий определенную последовательность действий, которые необходимо выполнить для достижения заданной цели. Большие задачи разбиваются на подзадачи – процедуры public main(int argc){ printf(“Hello!”); } n n Переиспользование библиотек процедур Модули как совокупности процедур – структурное программирование 01. 02. 2018 9
Семинар 2. ООП. Объекты Гради Буч: Объект - это мыслимая или реальная сущность, обладающая характерным поведением и отличительными характеристиками и являющаяся важной в предметной области. Каждый объект имеет состояние, обладает четко определенным поведением и уникальной идентичностью. n n n Состояние: в любой момент времени состояние объекта включает в себя перечень (обычно статический) свойств объекта и текущие значения (обычно динамические) этих свойств. Человек сидит и у него есть удочка. Поведение: для каждого объекта существует определенный набор действий, которые с ним можно произвести. Файл в ОС можно открыть, создать и т. п. Уникальность: в машинном представлении под параметром уникальности объекта чаще всего понимается адрес размещения объекта в памяти; уникальность объекта состоит в том, что всегда можно определить, указывают две ссылки на один и тот же объект или на разные объекты. Даже одинаковые монеты (абсолютно все их атрибуты одинаковы: год выпуска, номинал и т. д. ), они по-прежнему остаются разными монетами. 01. 02. 2018 10
Семинар 2. ООП. Классы n n n Совокупность атрибутов и их значений характеризует объект. Все объекты одного и того же класса описываются одинаковыми наборами атрибутов. Все объекты одного и того же класса обладают одинаковым поведением q q n n n Пример 1: разные объекты класса «Монеты» Пример 2: конюшня и лошадь как объекты одного класса Класс имеет имя, которое относится ко всем объектам этого класса. В классе вводятся имена атрибутов, которые определены для объектов (атрибуты=свойства=поля). Класс является шаблоном поведения объектов (методы) Класс может иметь конструктор (constructor) - выполняется при создании объектов. Класс может иметь деструктор (destructor) - выполняется при уничтожении объектов. 01. 02. 2018 11
Семинар 2. ООП. Инкапсуляция (encapsulation) - это сокрытие реализации класса и отделение его внутреннего представления от внешнего (интерфейса). Внутри объекта данные и методы могут обладать различной степенью открытости (или доступности). n n Открытые члены класса составляют внешний интерфейс объекта - это та функциональность, которая доступна другим классам. Закрытыми обычно объявляются все свойства класса, а также вспомогательные методы, которые являются деталями реализации и от которых не должны зависеть другие части системы. Модульность - благодаря сокрытию реализации за внешним интерфейсом класса можно менять внутреннюю логику отдельного класса, не меняя код остальных компонентов системы. 01. 02. 2018 12
Семинар 2. ООП. Наследование (inheritance) - это отношение между классами, при котором класс использует структуру или поведение другого класса (одиночное наследование), или других (множественное наследование ) классов. Наследование вводит иерархию "общее/частное", в которой подкласс наследует от одного или нескольких более общих суперклассов. 01. 02. 2018 13
Семинар 2. ООП. Задача Пример: Предположим, мы хотим создать векторный графический редактор, в котором нам нужно описать в виде классов набор графических примитивов - Point, Line, Circle, Box и т. д. У каждого из этих классов определим метод draw для отображения соответствующего примитива на экране. Хотим: Написать код, который при необходимости отобразить рисунок будет последовательно перебирать все примитивы, на момент отрисовки находящиеся на экране, и вызывать метод draw у каждого из них. 01. 02. 2018 14
Семинар 2. ООП. Решение 1. //создание пустого массива, который может // содержать объекты Point с максимальным // объемом 1000 Point[] p = new Point[1000]; Line[] l = new Line[1000]; Circle[] c = new Circle[1000]; Box[] b = new Box[1000]; . . . // предположим, в этом месте происходит заполнение всех массивов соответствующими объектами . . . for(int i = 0; i < p. length; i++) { //цикл с перебором всех ячеек массива. вызов метода draw() в случае, если ячейка не пустая. if(p[i]!=null) p[i]. draw(); } for(int i = 0; i < l. length; i++) { if(l[i]!=null) l[i]. draw(); } for(int i = 0; i < c. length; i++) { if(c[i]!=null) c[i]. draw(); } for(int i = 0; i < b. length; i++) { I f(b[i]!=null) b[i]. draw(); } 01. 02. 2018 15
Семинар 2. ООП. Решение 2. Point p[] = new Point[1000]; p[0] = new Circle(); p[1] = new Point(); p[2] = new Box(); p[3] = new Line(); . . . for(int i = 0; i < p. length; i++) { if(p[i]!=null) p[i]. draw(); } 01. 02. 2018 16
Семинар 2. ООП. Полиморфизм (polymorphism) - положение теории типов, согласно которому имена (например, переменных) могут обозначать объекты разных (но имеющих общего родителя) классов. Процедурный полиморфизм предполагает возможность создания нескольких процедур или функций с одним и тем же именем, но разным количеством или различными типами передаваемых параметров - перегрузка (overloading) функций. void println() // переход на новую строку void println(boolean x) // выводит значение //булевской переменной (true или false) void println(String x) // выводит строку - значение // текстового параметра. 01. 02. 2018 17
Семинар 2. ООП. Агрегация – связь классов // определение класса Fish public class Fish { // определения поля home // (ссылка на объект Aquarium) private Aquarium home; public Fish() { } } // определение класса Aquarium public class Aquarium { // определения поля inhabitants // (массив ссылок на объекты Fish) private Fish inhabitants[]; public Aquarium() { } } 01. 02. 2018 18
Семинар 2. ООП. Ассоциация – связь классов public class Programmer { private Computer computers[]; public Programmer() { } } public class Computer { private Programmer programmers[]; public Computer() { } } 01. 02. 2018 19
Семинар 3. I/O. Чтение с консоли import java. util. Scanner; public class Input. Exp { public static void main(String[] args) { String name; int age; Scanner in = new Scanner(System. in); // Reads a single line from the console // and stores into name variable name = in. next. Line(); // Reads a integer from the console // and stores into age variable age = in. next. Int(); in. close(); // Prints name and age to the console System. out. println("Name : " + name); System. out. println("Age : " + age); } } 01. 02. 2018 20
Семинар 3. I/O. Чтение из файла import java. io. File. Input. Stream; import java. io. File. Not. Found. Exception; import java. util. Scanner; public class Scanner. Read. File { public static void main(String[] args) { try { File. Input. Stream file. Stream = new File. Input. Stream("test. txt"); // Create a new Scanner object which will read the data // from the file passed in. To check if there are more // line to read from it we check by calling the // scanner. has. Next. Line() method. We then read line one // by one till all line is read. Scanner scanner = new Scanner(file. Stream); while (scanner. has. Next. Line()) { String line = scanner. next. Line(); System. out. println(line); } } catch (File. Not. Found. Exception e) { e. print. Stack. Trace(); } } } 01. 02. 2018 21
Семинар 3. Типы данных. Объявление Простые или примитивные: q целочисленные (byte, short, int, long, char), q дробные (float, double), q булевые (boolean) n Объектные или ссылочные: q массивы, q классы Переменная: имя+тип+значение n int a; int b = 0, c = 3 + 2; int d = b + c; int e = a = 5; final double pi=3. 1415; 01. 02. 2018 22
Семинар 3. Типы данных. Примитивные vs ссылочные Примитивные типы хранят значения: int a = 5; // объявляем первую переменную и // инициализируем ее int b = a; // объявляем вторую переменную и // приравниваем ее к первой a = 3; // меняем значение первой print(b); // проверяем значение второй Объектные типы хранят ссылки: class Point { int x, y; public Point(int i, int j) { } public void print() { System. out. println(x + ", " + y); } } Point p 1 = new Point(3, 5); Point p 2=p 1; p 1. x=7; print(p 2. x); 01. 02. 2018 Point p 1 = new Point(3, 5); Point p 2=p 1; p 1 = new Point(7, 9); print(p 2. x); p 2=null; 23
Семинар 3. Типы данных. Операции со ссылочными типами Обращение к полям и методам объекта Point p 1 = new Point(3, 5); print(p 1. x); p 1. print(); Оператор instanceof Parent p = new Child(); // проверяем переменную p типа Parent // на совместимость с типом Child print(p instanceof Child); Операции сравнения == и != Point p 1=new Point(2, 3); Point p 2=p 1; Point p 3=new Point(2, 3); print(p 1==p 2); print(p 1==p 3); Оператор конкатенации со строкой + System. out. println("The point: " + p 1); 01. 02. 2018 24
Семинар 3. Типы данных. Класс Object Каждый класс в Java неявно наследуется от класса Object. В нем определены некоторые методы, которые, таким образом, есть у любого класса. equals() - служит для сравнения объектов по значению, а не по ссылке. Point p 7=new Point(2, 3); Point p 8=new Point(2, 3); print(p 1. equals(p 2)); hash. Code() – представить любой объект целым числом Point p 7=new Point(2, 3); Point p 8=new Point(2, 3); print(p 7. hash. Code() == p 8. hash. Code()); to. String() - позволяет получить текстовое описание любого объекта Point p 7=new Point(2, 3); System. out. println(p 7. to. String()); 01. 02. 2018 Point@92 d 351 25
Семинар 3. Типы данных. Класс String занимает в Java особое положение: n Экземпляры только этого класса можно создавать без использования ключевого слова new. n Каждый строковый литерал порождает экземпляр String, и это единственный литерал (кроме null), имеющий объектный тип. String s 1 = "abc"; String s 2 = "abc"; String s 3 = "a"+"bc"; print(s 1==s 2); print(s 1==s 3); Много полезных методов: length(), split(String regex), substring(int begin. Index, int end. Index), to. Char. Array(), char. At(int index) и др. 01. 02. 2018 26
Семинар 3. Требования к проекту. Общие n n n Разработка в команде из 3 -4 человек, что рекомендуется, или в одиночку Презентация выбранного проекта с четкой формулировкой будущих работ каждого участника Согласование архитектуры проекта Каждый участник должен соблюсти все технические требования Проект должен быть доведен до планируемого рабочего состояния Презентация по итогам завершения проекта – что получилось, что нет 01. 02. 2018 27
Семинар 3. Требования к проекту. Технические обязательные n n Обработка ошибок как внутренних, так и ошибок непредвиденного использования Применение многопоточного программирования, как минимум на уровне отделения рабочих процессов от интерфейса пользователя Использование в команде системы контроля версий (Subversion или Git. Hub) Соблюдение требований к оформлению кода (форматирование, комментарии и т. п. ) 01. 02. 2018 28
Семинар 3. Требования к проекту. Технические рекомендуемые n n n Наличие пользовательского интерфейса (GUI) Наличие файлов сборки одной из систем сборки (Ant или Maven) Использование среды разработки (IDE: Eclipse или др. ) Использование Code Review Соблюдение Code Style 01. 02. 2018 29
Семинар 3. Возможные темы проектов n n n n «Микро-фотошоп» - набор фильтров для обработки изображений различных типов «Редактор формул» - набор формул и их сохранение, пример - Math. Type «Реактор» - моделирование работы гомогенного (для начала) урановографитого ядерного реактора «Столкновение тел» - моделирование помолекулярного столкновения малых тел с учетом различных взаимодействий «Графики функций» - построение графиков функций, заданных разным способом - аналитически, участками и т. п. «Графы и сети» - программа для работы с сетямиграфами разного типа, нахождение кратчайших путей и т. п. «Дорожное движение» - моделирование дорожного движения в городе с некоторой картой каким-либо способом (гидродинамика, агентный подход и т. п. ) 01. 02. 2018 30
Семинар 3. Возможные темы проектов n n n «Фракталы» - построение множеств Жюлиа для различных отображений, исследование критических точек «Экология» - двумерная трехкомпонентная экологическая модель «Жизнь» - генетический вариант игры жизнь, обобщение клеточных автоматов «Электростатика» - расчет полей и потенциалов системы зарядов «Чат» - программа обмена мгновенными сообщениями - чат, многопользовательский «Танчики» - многопользовательская игра «танчики» с ботами 01. 02. 2018 31
Семинар 4. Имена. Пакеты n n Пакеты (packages) в Java – это способ логически группировать классы В файловой системе они представлены директориями Аналогично директории, пакет может внутри кроме классов содержать и другие пакеты – свои элементы Примеры: java. lang, com. sun. misc, ru. mipt. dgap. cs 025. project 01. 02. 2018 32
Семинар 4. Имена n n Простое имя классов, полей и методов дается при объявлении: Object, String, Point, to. String(), PI, Inner. Class Чтобы получить составное имя, надо к имени родителя, в котором находится элемент, через точку добавить простое имя элемента: java. lang. Object, java. lang. reflect. Method, com. myfirm. Main. Class, ref. to. String(), java. lang. Math. PI, Outer. Class. Inner. Class 01. 02. 2018 33
Семинар 4. Имена. Область видимости n У каждого имени есть область видимости (scope) class Pointer { int x, y; int get. X() { return x; // простое имя } } class Test { void main() { Pointer p = new Pointer(); p. x = 3; // составное имя } } 01. 02. 2018 34
Семинар 4. Имена. Classpath Не всегда удобно хранить все файлы в одном каталоге n Удобно распространять классы в виде JAR (Java ARchive) или ZIP архивов, для ускорения загрузки через сеть n Существует специальная переменная окружения classpath (по аналогии с path) - ее значение должно состоять из путей к каталогам или архивам, разделенных точкой с запятой. ; c: javaclasses; d: lib3 Dengine. zip; d: libfire. jar n 01. 02. 2018 35
Семинар 4. Модуль компиляции n n n Модуль компиляции (compilation unit) хранится в текстовом. java -файле и является единичной порцией входных данных для компилятора. Он состоит из трех частей: q объявление пакета ; q import -выражения; q объявления верхнего уровня. Порядок работы import: q сначала просматриваются выражения, импортирующие типы; q затем другие типы, объявленные в текущем пакете, в том числе в текущем модуле компиляции; q наконец, просматриваются выражения, импортирующие пакеты. Область видимости объявления верхнего уровня по умолчанию - пакет 01. 02. 2018 36
Семинар 4. Области видимости n n n Область видимости доступного пакета – вся программа Областью видимости импортированного типа являются все объявления верхнего уровня в этом модуле компиляции Областью видимости класса верхнего уровня является пакет, в котором он объявлен Область видимости элементов классов – это все тело типа, в котором они объявлены, доступ через имя класса или зарезервированные слова this и super Аргументы метода, конструктора или обработчика ошибок видны только внутри этих конструкций и не могут быть доступны извне Область видимости локальных переменных начинается с момента их инициализации и до конца блока, в котором они объявлены 01. 02. 2018 37
Семинар 4. Перекрытие областей видимости "Затеняющее" объявление (Shadowing) class Human { n int age; // возраст void set. Age(int age) { this. age = age; // верное присвоение! } } 01. 02. 2018 38
Семинар 4. Перекрытие областей видимости "Заслоняющее" объявление (Obscuring) import java. awt. *; n public class Obscuring { static Point Test = new Point(3, 2); public static void main(String s[]) { System. out. print(Test. x); } } class Test { static int x = -5; } 01. 02. 2018 39
Семинар 4. Соглашения по именованию n n n Имя каждого пакета начинается с маленькой буквы и представляет собой, как правило, одно недлинное слово, возможно с подчеркиванием (com. sun. image. codec. jpeg, org. omg. CORBA. ORBPackage, oracle. jdbc. driver) Имена типов начинаются с большой буквы и могут состоять из нескольких слов, каждое следующее слово также начинается с большой буквы (Human, High. Green. Oak, Array. Index. Out. Of. Bounds. Exception, Runnable, Serializable, Cloneable) Имена методов должны быть глаголами и обозначать действия, которые совершает данный метод. Имя должно начинаться с маленькой буквы, но может состоять из нескольких слов, причем каждое следующее слово начинается с заглавной буквы. Существует ряд принятых названий для методов: q если методы предназначены для чтения и изменения значения переменной, то их имена начинаются, соответственно, с get и set, например, для переменной size это будут get. Size() и set. Size(); q метод, возвращающий длину, называется length(), например, в классе String ; q имя метода, который проверяет булевское условие, начинается с is, например, is. Visible() у компонента графического пользовательского интерфейса; q метод, который преобразует величину в формат F, называется to. F(), например, метод to. String(), который приводит любой объект к строке. 01. 02. 2018 40
Семинар 4. Соглашения по именованию n n n Поля класса имеют имена, записываемые в том же стиле, что и для методов, начинаются с маленькой буквы, могут состоять из нескольких слов, каждое следующее слово начинается с заглавной буквы. Имена должны быть существительными, например, поле name в классе Human, или size в классе Planet. Имена констант состоят из последовательности слов, сокращений, аббревиатур. Записываются они только большими буквами, слова разделяются знаками подчеркивания (PI, MIN_VALUE, MAX_VALUE, COLOR_RED, COLOR_GREEN, COLOR_BLUE) Имена локальных переменных, параметров методов и обработчиков ошибок, как правило, довольно короткие, но, тем не менее, должны быть осмыслены. Например, можно использовать аббревиатуру (имя cp для ссылки на экземпляр класса Color. Point ) или сокращение ( buf для buffer ). Распространенные однобуквенные сокращения: q byte b; q char c; q int i, j, k; q long l; q float f; q double d; q Object o; q String s; q Exception e; // объект, представляющий ошибку в Java 01. 02. 2018 41
Семинар 4. CVS – Control Version Systems Система контроля версий – комплекс программного обспечения для обеспечения коллективной работы с исходным кодом, а так же отслеживания изменений в нем. Типичные задачи, которые позволяет решить система контроля версий: n Узнать, что я поменял с момента последней «живой» копии? n Получить исходник установленной месяц назад системы. n Параллельная работа 2 -х и более человек над одним исходником. Выбираем из двух систем контроля версий: n Subversion n GIT/Git. Hub 01. 02. 2018 42
Семинар 5. Объектная модель. Модификаторы доступа вводятся для защиты, или избавления, пользователя от излишних зависимостей от деталей внутренней реализации public class Human { public int age; } Human h = get. Human(); // получаем ссылку int i=h. age; // ошибка!! public class Human { private int age; // метод, возвращающий значение age public int get. Age() { return age; } // метод, устанавливающий значение age public void set. Age(int a) { age=a; } } Human h = get. Human(); int i=h. get. Age(); // обращение через метод 01. 02. 2018 43
Семинар 5. Объектная модель. Зачем модификаторы доступа public class Human { // поле получает новый тип double private/* int */double age; // старые методы работают с округлением значения public int get. Age() { return (int) Math. round(age); } public void set. Age(int a) { age = a; } // добавляются новые методы для работы с типом double public double get. Exact. Age() { return age; } public void set. Exact. Age(double a) { age = a; } } 01. 02. 2018 44
Семинар 5. Объектная модель. Модификаторы доступа В Java модификаторы доступа указываются для: n классов объявления верхнего уровня; n элементов класса (полей, методов, внутренних типов); n конструкторов классов. Все четыре уровня доступа имеют только элементы типов и конструкторы. Это: n public; n private; n protected; n если не указан ни один из этих трех типов, то уровень доступа определяется по умолчанию (default). 01. 02. 2018 45
Семинар 5. Объектная модель. Объявление класса [public] [final] class Valid. Class. Name [extends Parent. Class. Name] { [public, private, protected] [static] [final] int val. Name [=0]; [public, private, protected] [static] [final] My. Type val. Name 2 [=null]; [public, private, protected] Valid. Class. Name([int param. Name][, [final] My. Type param. Name 2][…]) [throws Exception. Name]{ [super(…); ]…. . } [public, private, protected] [static] [final] [void, int, My. Type] method. Name([int param. Name][, [final] My. Type param. Name 2][…]) [throws Exception. Name]{ [super. method. Name(…); ]…. } } 01. 02. 2018 46
Семинар 6. Объектная модель. Контексты выполнения К статическому контексту выполнения относятся: n статические методы, n статические поля. Остальные части кода относятся к динамическому контексту: n обычные методы, n обычные поля, n конструкторы. 01. 02. 2018 47
Семинар 6. Объектная модель. Контексты выполнения class Test { public void process() { } public static void main(String s[]) { // process(); - ошибка! // у какого объекта его вызывать? Test test = new Test(); test. process(); // так правильно } } 01. 02. 2018 48
Семинар 6. Объектная модель. This и super public class Parent { int value; public Parent(int value) { this. value = value; } public int get. Value() { return value; } } 01. 02. 2018 49
Семинар 6. Объектная модель. This и super class Child extends Parent { public Child(int value) { super(value); } // переопределение метода public int get. Value() { // обращение к методу родителя return super. get. Value() + 1; } public static void main(String s[]) { Child c = new Child(5); System. out. println(c. get. Value()); } } 01. 02. 2018 50
Семинар 6. Объектная модель. Abstract // Базовая арифметическая операция public abstract class Operation { public abstract int calculate(int a, int b); } // Сложение class Addition extends Operation { public int calculate(int a, int b) { return a+b; } } // Вычитание class Subtraction extends Operation { public int calculate(int a, int b) { return a-b; } } 01. 02. 2018 51
Семинар 6. Объектная модель. Abstract class Test { public static void main(String s[]) { Operation o 1 = new Addition(); Operation o 2 = new Subtraction(); o 1. calculate(2, 3); o 2. calculate(3, 5); } } 01. 02. 2018 52
Семинар 6. Объектная модель. Interface public interface Drawable extends Colorable, Resizable { public final static int RIGHT = 1; int LEFT = 2; int UP = 3; int DOWN = 4; public abstract void move. Right(); void move. Left(); void move. Up(); void move. Down(); } 01. 02. 2018 53
Семинар 6. Объектная модель. Использование интерфейсов public interface Insect. Consumer { void consume. Insect(Insect i); } // росянка расширяет класс растение class Sundew extends Plant implements Insect. Consumer { public void consume. Insect(Insect i) { //. . . } } // ласточка расширяет класс птица class Swallow extends Bird implements Insect. Consumer { public void consume. Insect(Insect i) { //. . . } } 01. 02. 2018 54
Семинар 6. Объектная модель. Использование интерфейсов // муравьед расширяет класс млекопитающее class Ant. Eater extends Mammal implements Insect. Consumer { public void consume. Insect(Insect i) { //. . . } } // служащий, отвечающий за кормление, // расширяет класс служащий class Feed. Worker extends Worker { // с помощью этого метода можно накормить // и росянку, и ласточку, и муравьеда public void feed. On. Insects(Insect. Consumer consumer) { consumer. consume. Insect(new Insect()); } } 01. 02. 2018 55
Семинар 6. Объектная модель Ссылочный тип обладает следующими элементами: n непосредственно объявленными в его теле; n объявленными в его родительском классе и реализуемых интерфейсах, кроме: q private -элементов; q "скрытых" элементов (полей и статических методов, скрытых одноименными элементами); q переопределенных (динамических) методов. 01. 02. 2018 56
Семинар 7. Преобразование типов Тип устанавливается на основе структуры применяемых выражений и типов литералов, переменных и методов, используемых в этих выражениях. long a = 3; a = 5 + 'A' + a; print("a=" + Math. round(a / 2 F)); int b=1; byte c=(byte)-b; int i=c; 01. 02. 2018 57
Семинар 7. Преобразование типов. Примитивные типы В Java предусмотрено семь видов приведений: n тождественное (identity): print((My. Flat. Impl)(get. City(). get. Street(). get. House(). get. Flat())); n расширение примитивного типа (widening primitive) - автоматические: long d=111111 L; float f = d; a = (long) f; print(d); n сужение примитивного типа (narrowing primitive) – явно, т. к. можно потерять данные: print((byte)383); print((byte)384); print((byte)-384); char ch=40000; print((short)ch); 01. 02. 2018 58
Семинар 7. Преобразование типов. Объектные типы class Parent { int x; } class Child extends Parent { int y; } class Child 2 extends Parent { int z; } 01. 02. 2018 59
Семинар 7. Преобразование типов n расширение объектного типа (widening reference) – автоматически: Parent p 1=new Child(); Parent p 2=new Child 2(); Parent p 3=null; n сужение объектного типа (narrowing reference) – явно, т. к. может быть Class. Cast. Exception: Parent p = new Child(); Child c = (Child) p; // преобразование будет успешным. Parent p 2 = new Child 2(); Child c 2 = (Child) p 2; // во время исполнения возникнет ошибка! if (p 2 instanceof Child) { Child c 3 = (Child) p 2; } 01. 02. 2018 60
Семинар 7. Преобразование типов. Оставшиеся случаи n n преобразование к строке (String) – автоматически любые типы; запрещенные преобразования (forbidden): q q q 01. 02. 2018 переходы от любого ссылочного типа к примитивному, от примитивного - к ссылочному (кроме преобразований к строке); тип boolean нельзя привести ни к какому другому типу, кроме boolean (за исключением приведения к строке); невозможно привести друг к другу типы, находящиеся не на одной, а на соседних ветвях дерева наследования и др. 61
Семинар 7. Ошибки. Исключительные ситуации Ошибки могут возникать как по причине недостаточной внимательности программиста (отсутствует нужный класс, или индекс массива вышел за допустимые границы), так и по независящим от него причинам (произошел разрыв сетевого соединения, сбой аппаратного обеспечения, например, жесткого диска и др. ). При возникновении исключительной ситуации управление передается от кода, вызвавшего исключительную ситуацию, на ближайший блок catch (или вверх по стеку) и создается объект, унаследованный от класса Throwable, или его потомков (см. диаграмму иерархии классов-исключений), который содержит информацию об исключительной ситуации и используется при ее обработке. 01. 02. 2018 62
Семинар 7. Ошибки. Обработка ошибок try { if (p. x == 0) { throw new Some. Exception. Class(); } else { throw new Another. Exception. Class(); } //. . . } catch (Some. Exception. Class e) { // от менее общих к более общим //. . . } catch (Another. Exception. Class e) { //. . . } finally { } 01. 02. 2018 63
Семинар 7. Ошибки. Проверяемые и непроверяемые исключений 01. 02. 2018 64
Семинар 9. Коллекции Все классы коллекций унаследованы от различных интерфейсов, которые определяют поведение коллекции. Иными словами интерфейс определяет «что делает коллекция» , а конкретная реализация «как коллекция делает то что определяет интерфейс» . При разработке приложений рекомендуется, там где это возможного, использовать интерфейсы, т. к. это: nпозволяет легко заменять реализацию интерфейса, с целью повышения производительности, например, nпозволяет разработчику сконцентрироваться на задаче, а не на особенностях реализации. Интерфейсы коллекций: Map
Семинар 9. Коллекции. Обзор 01. 02. 2018 66
Семинар 9. Коллекции. Collection В интерфейсе Collection
Семинар 9. Коллекции. Списки 01. 02. 2018 68
Семинар 9. Коллекции. List Методы интерфейса List
Семинар 9. Коллекции. Queue Методы интерфейса Queue
Семинар 9. Коллекции. Сортировка public class Student { private int id. Student; private float mean. Mark; public Student(float m, int id) { mean. Mark = m; id. Student = id; } public Student() { } public float get. Mark() { return mean. Mark; } public int get. Id. Student() { return id. Student; } } 01. 02. 2018 71
Семинар 9. Коллекции. Сортировка Array. List
Семинар 9. Коллекции. Множества 01. 02. 2018 73
Семинар 9. Коллекции. Set Класс Hash. Set
Семинар 9. Коллекции. Карты 01. 02. 2018 75
Семинар 9. Коллекции. Set Интерфейс Map
Семинар 10. Потоки. Зачем? n n Выполнение задач, где действительно требуется выполнять несколько действий одновременно: сервер общего пользования, активные игры (опрашивание клавиатуры и других устройства ввода) и т. д. Вычислительное устройство – лишь один из ресурсов, необходимых для выполнения задач. Всегда есть оперативная память, дисковая подсистема, сетевые подключения, периферия и т. д. , которые необходимо делить. Пример: пользователю требуется распечатать большой документ и скачать большой файл из сети. Более гибко управлять выполнением задач: реализация кнопки Cancel, регулирование приоритетами и т. п. Обслуживающие потоки: автоматический сборщик мусора в Java запускается в виде фонового (низкоприоритетного) процесса – демон (daemon). 01. 02. 2018 77
Семинар 10. Потоки. Thread public class My. Thread extends Thread { public void run() { // некоторое долгое действие, вычисление long sum = 0; for (int i = 0; i < 1000; i++) { sum += i; } System. out. println(sum); } } My. Thread t = new My. Thread(); t. start(); 01. 02. 2018 78
Семинар 10. Потоки. Runnable Public class My. Runnable implements Runnable { public void run() { // некоторое долгое действие, вычисление long sum = 0; for (int i = 0; i < 1000; i++) { sum += i; } System. out. println(sum); } } Runnable r = new My. Runnable(); Thread t = new Thread(r); t. start(); 01. 02. 2018 79
Семинар 10. Потоки. Приоритеты public class Thread. Test implements Runnable { public void run() { double calc; for (int i = 0; i < 50000; i++) { calc = Math. sin(i * i); if (i % 10000 == 0) { System. out. println(get. Name() + " counts " + i / 10000); } } } public String get. Name() { return Thread. current. Thread(). get. Name(); } 01. 02. 2018 80
Семинар 10. Потоки. Приоритеты public static void main(String s[]) { // Подготовка потоков Thread t[] = new Thread[3]; for (int i = 0; i < t. length; i++) { t[i] = new Thread(new Thread. Test(), "Thread " + i); } // Запуск потоков for (int i = 0; i < t. length; i++) { t[i]. start(); System. out. println(t[i]. get. Name() + " started"); } } } 01. 02. 2018 81
Семинар 10. Потоки. Приоритеты public static void main(String s[]) { // Подготовка потоков Thread t[] = new Thread[3]; for (int i = 0; i < t. length; i++) { t[i] = new Thread(new Thread. Test(), "Thread " + i); t[i]. set. Priority(Thread. MIN_PRIORITY + (Thread. MAX_PRIORITY - Thread. MIN_PRIORITY) / t. length* i); } // Запуск потоков for (int i = 0; i < t. length; i++) { t[i]. start(); System. out. println(t[i]. get. Name() + " started"); } } 01. 02. 2018 82
Семинар 10. Потоки. Демон class Thread. Test implements Runnable { // Отдельная группа, в которой будут // находиться все потоки Thread. Test public final static Thread. Group GROUP = new Thread. Group("Daemon demo"); // Стартовое значение, указывается при создании объекта private int start; public Thread. Test(int s) { start = (s % 2 == 0) ? s : s + 1; new Thread(GROUP, this, "Thread " + start). start(); } public static void main(String s[]) { new Thread. Test(16); new Daemon. Demo(); } 01. 02. 2018 83
Семинар 10. Потоки. Демон public void run() { // Начинаем обратный отсчет for (int i = start; i > 0; i--) { try { Thread. sleep(300); } catch (Interrupted. Exception e) { } // По достижении середины порождаем // новый поток с половинным начальным // значением if (start > 2 && i == start / 2) { new Thread. Test(i); } } } } 01. 02. 2018 84
Семинар 10. Потоки. Демон class Daemon. Demo extends Thread { public Daemon. Demo() { super("Daemon demo thread"); set. Daemon(true); start(); } public void run() { Thread threads[] = new Thread[10]; while (true) { 01. 02. 2018 85
Семинар 10. Потоки. Демон // Получаем набор всех потоков из // тестовой группы int count = Thread. Test. GROUP. active. Count(); if (threads. length < count) threads = new Thread[count + 10]; count = Thread. Test. GROUP. enumerate(threads); // Распечатываем имя каждого потока for (int i = 0; i < count; i++) { System. out. print(threads[i]. get. Name() + ", "); } System. out. println(); try { Thread. sleep(300); } catch (Interrupted. Exception e) {} } 01. 02. 2018 86
Семинар 11. Потоки. Работа с памятью Основные операции, доступные для потоков при работе с памятью: n use – чтение значения переменной из рабочей памяти потока; n assign – запись значения переменной в рабочую память потока; n read – получение значения переменной из основного хранилища; n load – сохранение значения переменной, прочитанного из основного хранилища, в рабочей памяти; n store – передача значения переменной из рабочей памяти в основное хранилище для дальнейшего хранения; n write – сохраняет в основном хранилище значение переменной, переданной командой store. Последовательность команд подчиняется следующим правилам: n все действия, выполняемые одним потоком, строго упорядочены, т. е. выполняются одно за другим; n все действия, выполняемые с одной переменной в основном хранилище памяти, строго упорядочены, т. е. следуют одно за другим. 01. 02. 2018 87
Семинар 11. Потоки. Volatile Модификатор поля volatile устанавливает более строгие правила работы со значениями переменных. n Если поток собирается выполнить команду use для volatile переменной, то требуется, чтобы предыдущим действием с этой переменной было обязательно load, и наоборот – операция load может выполняться только перед use. Таким образом, переменная и главное хранилище всегда имеют самое последнее значение этой переменной. n Если поток собирается выполнить команду store для volatile переменной, то требуется, чтобы предыдущим действием над этой переменной было обязательно assign, и наоборот – операция assign может выполняться, только если следующей будет store. Таким образом, переменная и главное хранилище всегда имеют самое последнее значение этой переменной. n Наконец, если проводятся операции над несколькими volatile переменными, то передача соответствующих изменений в основное хранилище должна проводиться строго в том же порядке. 01. 02. 2018 88
Семинар 11. Потоки. Блокировки Операции блокировки объекта в хранилище: n lock – установить блокировку, только один поток в один момент времени может установить блокировку на некоторый объект; n unlock - снять блокировку, если до того, как этот поток выполнит операцию unlock, другой поток попытается установить блокировку, его выполнение будет приостановлено до тех пор, пока первый поток не отпустит ее. После успешно выполненного lock рабочая память очищается и все переменные необходимо заново считывать из основного хранилища. Аналогично, перед операцией unlock необходимо все переменные сохранить в основном хранилище. 01. 02. 2018 89
Семинар 11. Потоки. Synchronized public class Thread. Test implements Runnable { private static Thread. Test shared = new Thread. Test(); public void process() { for (int i = 0; i < 3; i++) { System. out. println(Thread. current. Thread(). get. Name() + " " + i); Thread. yield(); } } public void run() { shared. process(); } public static void main(String s[]) { for (int i = 0; i < 3; i++) { new Thread(new Thread. Test(), "Thread-" + i). start(); } } } 01. 02. 2018 90
Семинар 11. Потоки. Synchronized public void run() { synchronized (shared) { shared. process(); } } Thread-0 0 Thread-0 1 Thread-0 2 Thread-1 0 Thread-1 1 Thread-1 2 Thread-2 0 Thread-2 1 Thread-2 2 01. 02. 2018 91
Семинар 11. Потоки. Deadlock public class Deadlock. Demo { // Два объекта-ресурса public final static Object one = new Object(), two = new Object(); public static void main(String s[]) { // Создаем два потока, которые будут // конкурировать за доступ к объектам // one и two Thread t 1 = new Thread() {…}; Thread t 2 = new Thread() {…}; // Запускаем потоки t 1. start(); t 2. start(); } } 01. 02. 2018 92
Семинар 11. Потоки. Deadlock Thread t 1 = new Thread() { public void run() { // Блокировка первого объекта synchronized (one) { Thread. yield(); // Блокировка второго объекта synchronized (two) { System. out. println("Success!"); } }; 01. 02. 2018 93
Семинар 11. Потоки. Deadlock Thread t 2 = new Thread() { public void run() { // Блокировка второго объекта synchronized (two) { Thread. yield(); // Блокировка первого объекта synchronized (one) { System. out. println("Success!"); } }; 01. 02. 2018 94
Семинар 11. Потоки. Wait-set Каждый объект в Java имеет wait-set - набор потоков исполнения. n Любой поток может вызвать метод wait() любого объекта и таким образом попасть в его wait-set. n Выполнение такого потока приостанавливается до тех пор, пока другой поток не вызовет у этого же объекта метод notify. All(), который пробуждает все потоки из wait-set. n Метод notify() пробуждает один случайно выбранный поток из данного набора. Любой из них может быть вызван потоком у объекта только после установления блокировки на этот объект. То есть либо внутри synchronized -блока с ссылкой на этот объект в качестве аргумента, либо обращения к методам должны быть в синхронизированных методах класса самого объекта. 01. 02. 2018 95
Семинар 11. Потоки. Wait-set class Wait. Thread implements Runnable { private Object shared; public Wait. Thread(Object o) { shared = o; } public void run() { synchronized (shared) { try { shared. wait(); } catch (Interrupted. Exception e) { } System. out. println("after wait"); } } … } 01. 02. 2018 96
Семинар 11. Потоки. Wait-set public static void main(String s[]) { Object o = new Object(); Wait. Thread w = new Wait. Thread(o); new Thread(w). start(); try { Thread. sleep(100); } catch (Interrupted. Exception e) { } System. out. println("before notify"); synchronized (o) { o. notify. All(); } } 01. 02. 2018 97