Тема 2 (ООП).ppt
- Количество слайдов: 26
Программирование на языках высокого уровня Принципы ООП
Две парадигмы программирования n Программа = код + данные n Подходы к программированию делятся на n Процессно-ориентированный: n n Программа – код, воздействующий на данные. Программа представляет собой последовательность действий. Процедурные ЯВУ. Объектно-ориентированный: n n n Программа – управляемый данными доступ к коду. Программа представляет собой взаимодействующую совокупность объектов. Объектно-ориентированные ЯВУ.
Абстракция n Абстракция – отвлечение от несущественных для решения задачи деталей объекта n Сложный объект можно представить в виде иерархической классификации, на каждом уровне которой будет своя степень абстракции. n Объектно-ориентированное программирование использует абстракцию для n n преобразования данных традиционной программы в свои объекты; преобразования последовательности действий традиционной программы в систему обмена сообщениями между объектами
ОО-программа n Состоит из объектов n описывающих свое поведение, n имеющих состояние, n откликающихся на сообщения, говорящие им «что нужно делать» , n и посылающие сообщения другим объектам.
Три принципа ООП n Инкапсуляция: n механизм, связывающий код и используемые им данные n и сохраняющий последние в безопасности от внешнего влияния и произвольного доступа. n Доступ к коду и данным производится через определенный интерфейс. n Реализация сокрыта от пользователя. n Наследование n процесс, с помощью которого один объект приобретает свойства другого, n но не лишается возможности доопределить некоторые собственные, уникальные свойства. n Полиморфизм n свойство, позволяющее использовать один интерфейс для общего класса действий. n Каждый объект реализует поведение по-своему, n пользователь использует один и тот же интерфейс для группы разнородных объектов, n а компилятор в каждом конкретном случае принимает решение «откуда взять нужный код» .
Пример наследования
Классы n Класс – основа механизма инкапсуляции. n Содержит структуру (данные или поля) и поведение (код, работающий с данными и разбитый на фрагменты – методы класса) некоторой группы объектов. n Поля и методы – члены класса. n Объект – экземпляр класса, n n имеющий все определенное в классе поведение и конкретные значения данных – состояние. n Класс – логическая конструкция, трафарет, а объект – «физическая реальность» . n Существуют механизмы сокрытия полей и методов от внешнего пользователя. n Классы позволяют избежать повторного кодирования.
Классы в Java n В java-программе весь код и данные находятся внутри класса. n Объявление класса в Java в общем виде: [модификаторы] class Имя_класса [extends Имя_суперкласса] [implements Имя(Список)_интерфейса(ов)] n Модификаторы класса n n n public – спецификатор доступа – указывает, что к данному классу возможен доступ из других пакетов (с помощью оператора import либо указанием квалифицированного имени класса, включающего имя пакета. ) В случае отсутствия public доступ разрешен только внутри текущего пакета abstract – модификатор реализации класса – указывает, что класс не может иметь экземпляров. Класс, имеющий хотя бы один абстрактный метод (т. е. метод без реализации), должен быть abstract. final – модификатор ограничения иерархии классов – указывает что класс не может иметь производных классов (например, класс java. lang. String). n Тело класса заключено в {} и может быть пустым. n Создание объекта класса: A a = new A(param 1, param 2, …); n Доступ к полям и методам объекта осуществляется с помощью оператора «точка» : a. field; a. method();
Пакеты в Java n Пакеты используются для объединения связанных между n n n собой классов, интерфейсов и других пакетов и их защиты. Пакет создает собственное пространство имен (в разных пакетах можно использовать одни и те же имена классов). Квалифицированное имя класса включает имя пакета (например, java. applet. Applet). Пакет импортируется в программу с помощью оператора import, в отличие от include в c++, не связывает с приложением используемые классы, не увеличивает размер откомпилированного файла. Программист может создать собственный пакет с помощью оператора package и поместить в него любое количество классов (интерфейсов). Можно создавать древовидную структуру пакетов.
Приведение типов n n Объект всегда может быть приведен к типу своего суперкласса (в т. ч. неявно). Обратное приведение можно выполнить с помощью оператора явного приведения типа. Любой тип класса может быть приведен к типу класса Object. После приведения объекта к типу суперкласса все переменные и методы собственного класса объекта становятся для него недоступными.
Элементы класса. n Поле – переменная, содержащая данные класса или экземпляра класса. n Метод – это именованный фрагмент исполнимого кода класса, вызов которого возможен как внутри класса, так и для объектов класса. n Все поля и методы доступны для методов данного класса. n Для ограничения доступа к полям и методам из других классов используются спецификаторы доступа: n Открытый (public) – элемент класса доступен везде, где доступен данный класс. n Защищенный (protected) – элемент доступен из классов данного пакета и из любого потомка данного класса. n Пакетный (по умолчанию) – элемент доступен из классов данного пакета. n Закрытый (private) – доступ к элементу разрешен в пределах данного класса.
Разновидности переменных n В классе различают несколько разновидностей переменных: n n n поля класса, которые объявляются вне методов и доступны всем методам класса; локальные переменные блока (метода, конструктора, блока инициализации или операторов {…}, выражения условия для управляющей конструкции цикла for), объявляемые внутри блока, доступные только в нем и существующие только во время его выполнения; параметры методов, конструкторов, обработчиков исключений.
Поля класса n Объявление поля класса имеет вид: [спецификатор доступа] [модификаторы] тип_данных имя_поля [= значение_инициализации]; Спецификаторы доступа (public, protected, private) указываются для каждого объявления отдельно n Модификаторы полей класса: n n n static указывает, что поле принадлежит классу в целом и существует в единственном экземпляре, Такое поле, принято называть статическим полем или просто полем класса. Оно создается при загрузке класса, прекращает существование – при выгрузке. Для обращения к статическому полю создавать экземпляр класса не требуется: System. out. println(); final запрещает изменение значения поля после инициализации. Это константы. Для экономии памяти константы обычно делают статическими. Например, в Integer имеются следующие константы: n n public static final int MAX_VALUE = 2147483647; public static final int MIN_VALUE = -2147483648; transient указывает, что переменная не является частью устойчивого состояния объекта и поэтому не должна записываться на постоянное хранение при сериализации объекта, т. е. записи его состояния в файл. volatile используется в многопоточном программировании. Сообщает компилятору, что к полю могут одновременно обращаться несколько потоков текущего процесса и это поле не следует использовать при оптимизации программы.
Методы класса n Объявление метода: n n [спецификатор доступа][модификатор] тип_возвращаемого_значения имя_метода ([список параметров]) [throws список исключений, бросаемых из метода] Комбинация имени-идентификатора метода и списка параметров называется сигнатурой метода. Спецификаторы доступа (public, protected, private) ограничивают доступ к методу. Параметры перечисляются через запятую в формате type 1 parameter 1, type 2 parameter 2, … В качестве параметров могут быть использованы переменные любых типов, в том числе объекты классов, но: n n переменная простого типа передается по значению, а переменная ссылочного типа – по ссылке. n Если метод должен возвращать какое-либо вычисленное им значение, то в объявлении требуется указать его тип, а тело метода должно содержать оператор return value. Иначе метод должен быть объявлен с ключевым словом void. В таком методе содержится оператор return. n Объекты простого и ссылочного типа возвращаются единообразно.
Модификаторы методов n abstract – модификатор реализации. Абстрактные методы n n n объявляются, но не реализуются в данном классе (не имеют тела) static – модификатор принадлежности. Статический метод служит атрибутом класса в целом, а не частных его экземпляров. n вызывается непосредственно из класса, не требуя создавать экземпляр; n может ссылаться только на статические поля и методы класса; n не может быть переопределен, так как неявно является finalметодом. final – модификатор переопределения. Конечный метод не может быть переопределен в производных классах. По умолчанию private-методы являются final-методами. Для final-класса все методы по умолчанию являются конечными. synchronized – методы для организации работы многопоточных приложений. native – метод, только объявленный в Java-классе, а реализованный как внешняя библиотека в машинно-зависимом коде. Использованию native-методов в апплетах препятствует менеджер безопасности. strictfp обеспечивает одинаковое выполнение операций с плавающей точкой во всех JVM.
Список исключений метода n При выполнении методов Java могут создаваться исключения (объекты типа Exception), связанные с возникновением ошибок. Все исключения должны n либо обрабатываться внутри метода, n либо описываться в объявлении метода после ключевого слова throws (тогда исключение передастся для обработки коду, вызвавшему метод). n Компилятор требует обязательной обработки всех исключений, кроме типа Runtime. Exception. n Пример метода класса Integer, выбрасывающего исключение типа Runtime. Exception: public static int parse. Int(String s) throws Number. Format. Exception
Конструкторы класса n Конструкторы –специальные методы, используемые для инициализации полей создаваемых объектов. n Имя конструктора должно совпадать с именем класса. n Конструктор не возвращает значения. n Конструктор вызывается с помощью оператора new. n Конструктор вызывается после присваивания полям вновь созданного объекта значений по умолчанию и выполнения блоков инициализации. n Класс может содержать несколько конструкторов с различными списками параметров или ни одного. n При отсутствии конструктора компилятор автоматически включает в состав класса конструктор без параметров. n Конструктор без параметров (конструктор по умолчанию) используется при создании объекта и вызывает конструктор непосредственного суперкласса. n Если суперкласс не обладает конструктором без параметров, то возникает ошибка компиляции. n Компилятор не будет автоматически синтезировать для класса конструктор без параметров, если пользователь определил хотя бы один конструктор.
Перегрузка и переопределение методов n Перегруженные (overloading) методы – методы одного класса, имеющие одинаковые имена, но разные сигнатуры. n Можно перегружать конструкторы. n Пример: n n Перегруженные конструкторы класса String. Перегруженные методы Index. Of класса String. n Переопределение (overriding) – замена реализации метода суперкласса в производном классе. n n Сигнатура переопределенного метода должна полностью совпадать с сигнатурой исходного Переопределенный метод нельзя объявлять более защищенным.
Ключевые слова THIS и SUPER n this можно использовать в любом нестатическом методе для ссылки на текущий объект в следующих случаях: n n Если текущий объект обращается к некоторому методу и передает ссылку на себя в качестве параметра. Если требуется устранить неоднозначность при использовании двух переменных с одним именем, одна из которых является полем, другая – локальной переменной. n super используется как ссылка на экземпляр суперкласса с целью обеспечения доступа к его нестатическим полям и методам.
Рекурсия n Метод, написанный на java может быть рекурсивным – вызывать себя внутри своего тела. n Преимущество: упрощение алгоритма. n Недостатки: замедление работы, возможное переполнение стека (в котором при очередном вызове сохраняются параметры предыдущего), опасность бесконечной рекурсии. int factorial(int f) { if (f == 1) return 1; return factorial(f-1); } … // внутри другого метода происходит вызов:
Сборка мусора n В java нет деструкторов – методов, освобождающих память, выделенную для объекта (delete имя в С++) n JVM содержит garbage collector – «сборщик мусора» , который периодически запускается и освобождает те участки памяти, на которые не осталось ссылок. n Задача программиста – в нужные моменты обнулить ссылки на созданные ранее объекты. Через некоторое время объекты будут удалены из памяти. n Garbage collector перед удалением объекта вызывает его метод finalize(), унаследованный от Object. Если программист желает выполнить при удалении объекта класса class. A некоторые действия, он описывает их в теле переопределенного в class. A метода finalize().
Контрольные вопросы class my. Class { public int value; public int square() { return value*value; } } … my. Class a = new my. Class(); a. value = 10; my. Class b; b. value = 5; b = a; a = null; int c = b. square(); b = null; 1. Поясните работу программы (в т. ч. состояние памяти) 2. Найдите ошибку
Контрольные вопросы class Square{ int x; int get. Area(){ return x*x; } } class Rectangle extends Square{ int y; Rectangle(int x, int y){ this. x = x; this. y = y; } int get. Area(){ return x*y; } int get. Difference(){ return get. Area() – super. get. Area(); } } class my. Class { int x, y; Rectangle rect; rect = new Rectangle(6, 4); int a = rect. get. Area(); int b = ((Square)rect). get. Area(); int c = rect. get. Difference(); }
Контрольные вопросы class Point{ int x, y, path; } class Main{ int move(new. X, new. Y, old. X, old. Y){ int path=Math. sqrt(sqr(new. X-old. X)+sqr(new. Y-old. Y)); old. X=new. X; old. Y=new. Y; } void move(new. X, new. Y, Point p){ p. path=Math. sqrt(sqr(new. X-p. x)+sqr(new. Y-p. y)); p. x=new. X; p. y=new. Y; } 1. Поясните работу программы void main(String args[]){ Point p=new Point(); 2. Найдите перегруженные int x=0, y=0; методы int path 1=move(10, x, y); p. move(10, p); 3. Выясните, чему будут равны int path 2=p. path; переменные x, y и поля x, y } объекта p в каждый момент }
Вложенные и внутренние классы n Вложенные классы (nested) определяются внутри n n n определения класса-владельца, в любом его месте (даже внутри метода). Вложенный класс имеет доступ ко всем элементам классавладельца, а класс-владелец к элементам вложенного класса – нет. Бывают двух типов: n статический (static) – не может обратиться к нестатическим элементам класса-владельца напрямую, только через создание объекта. n нестатический – может прямо использовать элементы класса-владельца. Нестатические вложенные классы называются внутренними. Внутренний класс, не имеющий имени, называется анонимным внутренним классом. При компиляции будут созданы отдельные файлы с байткодом (*. class) для всех вложенных классов. Для анонимных классов файл с байт-кодом будет назван Name#N. class
Строки в Java n Класс String содержится в пакете java. lang. Любая строка в Java является объектом и к ней применимы все действия, выполняемые над объектами. n Строку можно создать явно с помощью оператора new или неявно: String str 1 = “Новая строка”; String str 2 = new String (“Новая строка”); n Строки можно объединять, используя оператор конкатенации строк: str 2 = str 1 + “еще одна строка”; n Класс String предназначен для работы со строковыми константами (литералами). Методы класса String не изменяют объект, а создают дополнительный. n Альтернатива – java. lang. String. Buffer, позволяющий создавать изменяемые строковые объекты. n В Java в каждом классе определен наследуемый от Object метод to. String(), который предназначен для преобразования объектов этого класса в строку.


