Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемpotor.baikal.ru
1 1 Введение в объекты Java От моделирования машины к моделированию проблемы… 1. Все есть объект. Объекты - особенные переменные: они не только хранят данные, но и способны выполнить «запрос» на выполнение той или иной операции. Теоретически можно взять любой умозрительный компонент в решаемой проблеме (собак, дома, услугу и т.п.) и представить его как объект в программе. 2. Программа - это связка объектов, говорящих друг другу что делать, посылая сообщения. Чтобы сделать запрос к объекту, вы посылаете сообщение этому объекту. Точнее говоря, сообщение – это запрос на вызов функции, которая принадлежит определенному объекту. 3. Каждый объект имеет свою собственную память, отличную от других объектов. Созданные объекты можно сгруппировать в пакеты, между которыми можно строить сложные связи, «пряча» их позади простых объектов. 4. Каждый объект имеет тип. Каждый объект является экземпляром класса, где класс - это синоним типа. Большинство важных различий характеристик класса в том, какие сообщения он может принимать. 5. Все объекты определенного типа могут принимать одинаковые сообщения. Например, объект типа круг также является объектом более общего типа форма. Значит «круг» гарантированно примет и сможет обработать сообщения, предназначенные для «формы». Признаки объектно-ориентированного программирования (Алан Кей):
2 2 Введение в объекты Java Ключевая идея ОПП: все объекты, хотя являются уникальными, также являются частью некоторых классов объектов и поэтому имеют общие характеристики и характер поведения. Это привело к появлению понятия класс, которое является синонимом понятия тип. Класс описывает набор объектов, которые имеют идентичные характеристики (элементы данных) и черты поведения (функциональность). Поэтому класс реально является типом данных, сформулированным в терминах проблемы. Как только класс создан, можно создать столько объектов этого класса, сколько необходимо, а затем манипулировать этими объектами как элементами, которые существуют в пространстве решаемой проблемы. Одно из предназначений объектно-ориентированного программирования, как и любого другого способа решения задач - это создание связей один-к-одному между элементами (т.е. созданными объектами) в пространстве проблемы. Но как заставить объект стать полезным? Должен существовать способ сделать запрос к объекту, чтобы он что-то сделал.
3 3 Введение в объекты Java Каждый объект имеет интерфейс Объект может реагировать только на определенные запросы, которые определяются его внутренними функциональными возможностями для взаимодействия с «внешним миром» (другими объектами). Т.е. интерфейсом. Объект – «электрическая лампочка» Интерфейс определяет, какой запрос можно выполнить для определенного объекта. При этом внутри описания класса должен существовать программный код, т.е. реализация, для удовлетворения этого запроса. Определенный запрос к объекту вызывает соответствующую функцию: посылаем сообщение (делаем запрос) объекту, а объект определяет, что он должен сделать с этим сообщением (объект исполняет код программы). Имя типа/класса - Light, имя объекта класса Light – lt. Запросы, которые можно сделать для объекта класса Light - это включить его on(), выключить off(), сделать ярче brighten() или темнее dim(). Создаем объект класса Light, определяя ссылку (lt) для объекта и вызываем new для размещения нового объекта этого типа. Для отправки сообщения объекту объявляем имя объекта и присоединяем его к сообщению запроса, разделив их (точкой). Light lt = new Light(); lt.on();
4 4 Введение в объекты Java Спрятанная реализация Разработчик классаПользователь класса private protected public «дружественный» 1.Не допустить пользователя к внутренней части класса, в которой может быть заключено «ноу-хау» 2.Иметь возможность менять закрытую часть класса так, чтобы не влиять на работу с этим классом пользователей Зачем прятать?
5 5 Введение в объекты Java Повторное использование кода 1. Композиция – прямое включение объектов других классов в новый класс, т.е. создание нового типа данных с использованием комбинации объектов существующих типов (классов). Композиция часто объясняет нам существование связей, как, например, в автомобиле существует двигатель. Если сделать часть класса приватными (спецификатор private) для программиста-клиента, который будет использовать класс, разработанный другим программистом, методом композиции, то это позволит разработчику класса менять скрытые члены класса без переделки существующего клиентского кода. Также можно изменить приватную часть класса во время выполнения, это динамическое изменение повлияет только на содержательный результат работы программы клиента.
6 6 Введение в объекты Java Повторное использование кода 2. Наследование – использование интерфейса другого класса, т.е. создание нового типа данных с использованием свойств и функциональности существующего типа (класса). Наследование говорит, что новый класс (класс-наследник, производный класс) имеет тот же тип, что и старый класс (базовый класс, родительский класс, супер-класс). Базовый тип содержит все характеристики и черты поведения, которые есть у всех типов, наследуемых от него. Базовый тип создается для образования ядра идеи программы. От базового типа образуются другие типы для создания разных способов, которыми данное ядро может быть реализовано. Наследуемый тип имеет те же характеристики и черты поведения, что и базовый, но класс-наследник может содержать больше характеристик, чем супер-класс, а также может обрабатывать больше сообщений (или вообще обрабатывать их иначе).
7 7 Введение в объекты Java Например, базовый тип - форма (фигура на плоскости). Каждая форма имеет размер, цвет, положение и т.д. Каждая форма может быть нарисована, стерта, перемещена, окрашена и т.д. От базового типа образуются (наследуются) специфические типы: окружность, квадрат, треугольник и т.д. Каждый класс-наследник, помимо доступных (не private) базовых свойств, может иметь дополнительные характеристики. Функциональность, переходящая из базового класса к наследнику, может быть расширена с помощью добавления уникальных для класса- наследника черт поведения, а также изменена в соответствии со спецификой класса- наследника (например, площадь формы может быть рассчитана по разному).
8 8 Введение в объекты Java Изменение функциональности класса-наследника путем добавления новых функций Изменение функциональности класса-наследника способом перегрузки (изменение поведения функций базового класса) Новый класс имеет тот же тип, что базовый, но может делать несколько больше Новый класс имеет тот же тип, что базовый, но некоторые функции базового класса в классе-наследнике работают по другому
9 9 Введение в объекты Java Эффект полиморфизма Возможность трактовки объекта наследованного типа, как объекта его базового типа позволяет писать код, который не зависит от определенного типа. В примере с формой: функции манипулируют общей формой, не заботясь о том, является ли она окружностью, треугольником или какой-то другой формой, которая еще не была определена. Все формы могут быть нарисованы, стерты и перемещены, так что эти функции просто посылают сообщения объекту формы. Они не беспокоятся о том, как объект обходится с сообщением. Такой код не изменяется при добавлении новых типов. Например, можно наследовать новый подтип формы, называемый пятиугольник, не модифицируя функции, которые работают только с родительской формой. Наследование позволяет объекту класса-наследника пользоваться функциями базового класса. Однако ясно, что рисование как общая концепция функциональности Формы может быть применено к Окружности, к Квадрату или к Треугольнику, но фактически каждый из этих объектов-наследников должен выполнять правильный код в зависимости определенного для него типа. Компилятор не может знать точно какая часть кода должна выполниться… Как это получается ?
10 10 Полиморфизм (динамическое связывание, позднее связывание, связывание во время выполнения). Раннее связывание Полиморфизм Связывание – соединение вызова метода с телом метода.
11 11 Введение в объекты Java Эффект полиморфизма Вызов функции, генерируемый не ООП компилятором, становится причиной того, что вызывается раннее связывание. Это означает, что компилятор генерирует вызов, указывая имя функции, а линковщик транслирует этот вызов в абсолютные адреса кода выполнения. В ООП программа не может определить адрес кода, пока не начнется время выполнения, так что необходимы другие схемы, когда сообщение посылается родительскому объекту. Для решения проблемы Java использует концепцию позднего связывания. Когда вы посылаете объекту сообщение, код, который будет вызван, не определяется, пока не начнется время выполнения. Компилятор не убеждается, что функция существует, а выполняет проверку типа аргумента и возвращаемого значения (weakly typed), но он не знает точный код для выполнения. Для выполнения позднего связывания Java использует специальный бит-код вместо абсолютных вызовов. Этот код рассчитывает адрес тела функции, используя информацию, хранимую в объекте. Таким образом, каждый объект ведет себя различно, в соответствии с содержимым этого специального бит- кода. Когда вы посылаете объекту сообщение, объект фактически вычисляет что делать с этим сообщением.
12 12 Введение в объекты Java Эффект полиморфизма void doStuff(Shape s) { s.draw(); //... s.erase(); } Эта функция говорит любой Форме: «нарисоваться и стереться». Если в некоторой части программы мы используем функцию doStuff( ) : Circle c = new Circle(); Triangle t = new Triangle(); Line l = new Line(); doStuff(c); doStuff(t); doStuff(l); Вызов doStuff( ) автоматически работает правильно, независимо от точного типа объекта. В функцию, которая ожидает Форму, будет передана Окружность, Треугольник, Линия. Так как Окружность является Формой, это можно трактовать, как передачу Формы в doStuff( ). Любое сообщение, которое может послать doStuff( ) Форме, Окружность тоже может принять. В этом случае наследуемый класс трактуется как базовый.
13 13 Введение в объекты Java Когда наследуемый тип трактуется как базовый, происходит обратное преобразование (upcasting) типов. Этот эффект безопасен, однако при преобразовании к базовому типу могут потеряны уникальные функции объекта-наследника Код doStuff( ): s.erase(); //... s.draw(); Говорит: Ты - Форма, я знаю, что ты можешь стирать erase( ) и рисовать draw( ) сама. Сделай это и правильно позаботься о деталях. Это дает возможность избежать программирования с проверкой всех возможных типов, которыми может быть Форма, поскольку необходимо менять программу всякий раз, когда добавляется новый подтип Формы. В коде doStuff( ) вызов draw( ) для Окружности становится причиной вызова другого кода, чем при вызове draw( ) для Квадрата или для Линии. Когда сообщение draw( ) посылается к анонимной Форме, происходит правильное поведение, основанное на действительном типе Формы. Когда компилятор Java компилирует код для doStuff( ), он не может знать точный тип, с которым будет происходить работа. Правильная работа происходит по причине полиморфизма. Компилятор и система времени выполнения управляют деталями. Все что вам нужно - это знать что случится, и что более важно, как с этим работать. Когда вы посылаете объекту сообщение, объект будет делать правильные вещи, даже если используется обратное преобразование.
14 14 Введение в объекты Java Абстрактные базовые классы и интерфейсы Базовый класс может представлять только свой интерфейс для наследуемых классов. Это значит, что пользователь класса может не создавать объект базового класса, а только выполнять обратное преобразование к нему, чтобы использовать интерфейс. Это достигается при создании абстрактного класса, используя ключевое слово abstract. Если кто-либо попробует создать объект абстрактного класса, компилятор предотвратит это. Ключевое слово abstract используется также для описания методов, которые не будут реализованы сразу как напоминание это интерфейсная функция для всех типов, наследуемых от этого класса, но в этом месте она не имеет реализации. Абстрактный метод может быть создан только внутри абстрактного класса. При наследовании такой метод должен быть реализован или наследуемый класс также станет абстрактным. Создание абстрактных методов позволяет помещать методы в интерфейс и не заботиться о возможности создания бессмысленного кода для тела этого метода. Ключевое слово interface дает концепцию абстрактного класса одним шагом, предотвращая будущее определения функций. Интерфейс - очень удобный и часто используемый инструмент, который обеспечивает отличное разделение интерфейса и реализации. При этом можно комбинировать много интерфейсов вместе, в то время как наследование от нескольких обычных или абстрактных классов невозможно.
15 15 Введение в объекты Java
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.