У вас вопросы?
У нас ответы:) SamZan.net

Объектно-ориентированное программирование в языке Java

Работа добавлена на сайт samzan.net:

Поможем написать учебную работу

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

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 29.12.2024

5. Объектно-ориентированное программирование.

ЕГО реализация в языке Java. КЛАССЫ И ИНТЕРФЕЙСЫ.

5.1. Парадигмы программирования

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

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

1) пошаговое программирование "сверху-вниз" (нисходящее программирование, при котором вначале, исходя из общих целей алгоритма, программируется и отлаживается"каркас" будущего программного приложения, а затем в него добавляются все детали);,

2) модульность (часто повторяющиеся или логически законченные фрагменты программ оформляют в виде отдельных модулей – функций или подпрограмм),

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

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

Полная автономность модулей позволяет создавать из них библиотеки, чтобы потом использовать их в качестве строительных блоков для программ. Для обеспечения максимальной независимости модулей друг от друга, надо четко отделять процедуры и данные, которые будут вызываться другими модулями,— открытые (public), от вспомогательных, которые используются только внутри модуля. Их называют закрытыми (private). Первые перечисляют в отдельной части модуля — интерфейсе (interface), вторые участвуют только в реализации (implementation) модуля. В разных языках программирования это деление процедур и данных производится по-разному. Например, в языке Turbo Pascal модуль специально делится на интерфейс и реализацию. В языке Java есть специальная конструкция для описания интерфейсов, которая так и называется — interface, но можно написать и абстрактные классы.

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

Развитие модульности привело к появлению понятия объекта, под которым имеют в виду определенный набор взаимосвязанных данных и методов их обработки. Идея представления программы в виде совокупности взаимодействующих объектов дала начало современной парадигме программирования - объектно-ориентированному программированию (object-oriented programming), сокращенно ООП (OOP).

5.2. Принципы объектно-ориентированного программирования,
их реализация в Java

Рассмотрим основные принципы, положенные в основу ООП. Ключевыми для ООП являются понятия объекта и класса.

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

В ООП описание каждой модели выполняется в виде одного или нескольких классов (classes). Класс – это тип, описывающий устройство объектов путем указания всех членов класса, которые могут быть не только данными, но и методами. По технологии Java описания переменных и констант, характеризующих объект, называются полями класса (class fields). Процедуры, описывающие поведение объекта, называются методами класса (class methods). Внутри класса можно описать и вложенные классы (nested classes) и вложенные интерфейсы. Поля, методы и вложенные классы первого уровня являются членами класса (class members). В Java нет вложенных процедур и функций, в теле метода нельзя (в отличие от Pascal) описать другой метод. Класс подобен чертежу или шаблону, по которому можно создать бесконечное множество объектов, обладающих сходными свойствами. Класс имеет программное описание, но его данные не имеют реальных физических адресов в памяти ЭВМ.

Абстрактные методы и классы. При построении сложной иерархии зачастую возникает необходимость вводить такие методы в классы верхнего уровня, которые ещё не могут быть определены. Здесь можно было бы использовать пустые методы, но многие языки ООП предлагают такой специфический механизм, как определение абстрактных методов, т.е. методов без реализации ( для них заданы параметры и тип возвращаемого значения, но нет тела). Абстрактный метод в Java определяется в классах-наследниках. Классы, имеющие хотя бы один абстрактный метод, также называют абстрактными классами. В Java и абстрактные методы, и абстрактные классы отмечаются ключевым словом abstract.  Производные классы, которые не переопределяют все абстрактные методы, также должны быть отмечены как абстрактные. Как и в С++, в Java нельзя создавать объекты абстрактных классов.

Интерфейсы. Высшей степенью абстрактности в Java является интерфейс (interface). Все методы интерфейса абстрактны. Интерфейс не является классом. Класс может наследовать, или расширять (extends) другой класс или реализовывать (implements) интерфейс. Кроме того, интерфейс может наследовать, или расширять другой интерфейс. В Java класс не может наследовать более одного класса, зато может реализовывать сколько угодно интерфейсов. Множественное наследование интерфейсов не запрещено, то есть один интерфейс может наследоваться от нескольких. Интерфейсы можно передавать методам как параметры, но нельзя создавать объекты их типов.

В Java есть стандартные интерфейсы, которые не содержат методов для реализации, а специальным образом обрабатываются JVM. Это интерфейсы:

  •  java.lang.Cloneable
  •  java.io.Serializable
  •  java.rmi.Remote

После того как описание класса закончено, можно создавать конкретные объекты, экземпляры (instances) описанного класса. Объект класса — это конкретная реализация класса. У него данные физически представлены в памяти ЭВМ.

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

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

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

Наследование (inheritance) - это процесс, посредством которого один класс может приобретать (наследовать) свойства другого и добавлять к ним свои данные и методы, характерные только для него.

Такая связь классов называется иерархией классов (hierarchical classification). Ее использование значительно упрощает управление большими потоками информации. Без использования иерархии классов, для каждого большого класса пришлось бы полностью задавать все характеристики, которые бы исчерпывающе его определяли.

Полиморфизм (polymorphism от греческого polymorphos) - это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач. Целью полиморфизма, применительно к ООП, является использование одного имени для задания общих для класса действий. Выполнение каждого конкретного действия определяется типом данных.Частными случаями полиморфизма являются перегрузка и переопределение методов.

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

Переопределение метода (англ. method overriding) в ООП — одна из возможностей языка программирования, позволяющая подклассу или дочернему классу обеспечивать специфическую реализацию метода, уже реализованного в одном из суперклассов или родительских классов. Реализация метода в подклассе переопределяет его реализацию в суперклассе, если у него:

1) одинаковое название и модификаторы,

2) одинаковые параметры или сигнатура, тип возвращаемого результата, что и у метода родительского класса.

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

В Java переопределение методов дано в классическом варианте. Оно подобно использованию виртуальных методов в C++ при помощи ключевого слова Virtual для использования механизмов полиморфизма для позднего связывания. Все методы JAVA изначально виртуальные.

Нельзя переопределять метод в Java (защита от переопределения), если он помечен как final. Способность Java делать выбор метода, исходя из типа объекта во время выполнения, практически реализуется за счет того, что при вызове метода его поиск происходит сначала в данном классе, затем в суперклассе и т.д. до тех пор, пока метод не будет найден или не достигнут Object – суперкласс для всех классов.

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

This в Java (как и в C++) является указателем на текущий объект. Хотя в Java дескрипторы объектов и реализованы в виде указателей, в ней отсутствуют возможности работать непосредственно с указателями. Т.е. нет возможности выполнять над указателями арифметические операции, преобразовать целое число в указатель, а также обратиться к произвольному адресу памяти. Ссылку на объект разрешается передавать через параметр функции. Функция не в состоянии изменить полученную ей таким образом ссылку. Однако пользуясь ссылкой, она может вызвать метод объекта, изменяющий поля этого объекта. Передать функции ссылку на объект базового типа невозможно - такие переменные передаются только по значению. Соответственно, функция не может изменить содержимое переменной, значение которой она получила через свой параметр.

5.3. Классы и интерфейсы.

5.3.1 Классы. Создание класса

Класс – это тип, описывающий устройство объектов путем указания всех членов класса, которые могут быть не только данными, но и методами. По технологии Java описания переменных и констант, характеризующих объект, называются полями класса (class fields). Процедуры, описывающие поведение объекта, называются методами класса (class methods). Внутри класса можно описать и вложенные классы (nested classes) и вложенные интерфейсы. Поля, методы и вложенные классы первого уровня являются членами класса (class members). Класс подобен чертежу или шаблону, по которому можно создать бесконечное множество объектов, обладающих сходными свойствами.

Например:

class Light  {

boolean isLit;

public void on() {

isLit = true;

}

public void off(){

isLit = false;

}

}

Представленный выше класс описывает лампочку. В классе есть два метода: on – для включения  и off – для выключения. Переменная типа boolean isLit показывает true, если лампочка горит и false, если она выключена.

Если мы создадим объект этого класса:

 Light lamp = new Light();

поле isLit примет значение false, т.к. ранее boolean значение не было определено. Напишем конструктор для класса Light. Конструктор – специальный метод, который Java вызывает автоматически при создании объекта. Таким образом гарантируется инициализация объекта. Имя конструктора должно совпадать с именем класса.

class Light  {

boolean isLit;

Light(boolean isLit){

 this.isLit = isLit;

}

public void on() {

isLit = true;

}

public void off(){

isLit = false;

}

}

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

 Light lamp = new Light(true);

Пример 1. Создание класса Light и работа с объектом класса Light

class Light  {

boolean isLit;

Light(boolean isLit){

 this.isLit = isLit;

}

public void on() {

 isLit = true;

}

public void off(){

 isLit = false;

}

}

public class TestClass {

public static void main(String[] args) {

 Light lamp = new Light(true);

 System.out.println(lamp.isLit);

 lamp.off();

 System.out.println(lamp.isLit);

 }

}

5.3.2.Перегрузка методов

Имя конструктора совпадает с именем класса, но зачастую объекты класса  необходимо создавать разными способами. Например, создавать класс стандартно либо на основании некоторого файла. Необходимо использовать два конструктора: один конструктор без аргументов (конструктор по умолчанию), а второй получает в качестве аргумента строку с именем файла. Но они должны называться одинаково – именем класса. Здесь необходимо использовать перегрузку методов для того, чтобы можно было вызывать методы с одинаковыми именами, но с разными аргументами. Применять перегрузку можно как к конструкторам, так и к обычным методам.

В рассмотренном примере добавим к классу конструктор без аргументов:

class Light  {

boolean isLit;

Light (){

 this.isLit = false;

}

Light(boolean isLit){

 this.isLit = isLit;

}

public void on() {

 isLit = true;

}

public void off(){

 isLit = false;

}

}

Теперь для создания объекта типа Light можно использовать два конструктора. Один – по умолчанию, переменная isLit при этом будет принимать значение false, другой – с аргументом типа Boolean, с помощью которого можно задать значение isLit вручную.

Пример 2. Перегрузка конструктора.

class Light  {

 boolean isLit;

Light (){

 this.isLit = false;

}

Light(boolean isLit){

 this.isLit = isLit;

}

public void on() {

 isLit = true;

}

public void off(){

 isLit = false;

}

}

public class TestClass {

public static void main(String[] args) {

 Light lamp = new Light();

 System.out.println(lamp.isLit);

 lamp.on();

 System.out.println(lamp.isLit);

 Light lamp1 = new Light(true);

 System.out.println(lamp1.isLit);

 lamp1.off();

 System.out.println(lamp1.isLit);

 }

}

5.3.3.Композиция и наследование

Иногда вместо создания класса с нуля имеет смысл воспользоваться ранее созданным классом. При этом можно выделить два механизма.

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

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

Для указания, что класс наследует от другого класса, используется ключевое слово extends, а затем имя базового класса. Тем самым автоматически создается доступ ко всем полям и методам базового класса.

Пример 3. Использование композиции с базовым классом Light.

class Dimmer extends Light{

int brightness;

public void setBright(int bright){

 brightness = bright;

}

}

Создан класс Dimmer из базового класса Light, к нему добавлены поле brightness и метод setBright().

Пример 4. Наследование от базового класса Light.

class Light  {

boolean isLit;

Light (){

 this.isLit = false;

}

Light(boolean isLit){

 this.isLit = isLit;

}

public void on() {

 isLit = true;

}

public void off(){

 isLit = false;

}

}

class Dimmer extends Light{

int brightness;

public void setBright(int bright){

 brightness = bright;

}

}

public class TestClass {

public static void main(String[] args) {

 Dimmer lamp = new Dimmer();

 System.out.println(lamp.isLit);

 lamp.on();

 System.out.println(lamp.isLit);

 lamp.setBright(15);

 System.out.println(lamp.brightness);

 }

}

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

class Dimmer extends Light{

 int brightness;

@Override

public void on(){

 isLit = true;

 brightness = 15;

}

public void setBright(int bright){

 brightness = bright;

}

}

Был переопределен метод on(). Теперь он не просто включает лампу, но и выставляет яркость равную 15. Запись @Override перед переопределяемым методом не является ключевым словом и используется для того, чтобы предупредить компилятор о том, что производится переопределение метода. Если по ошибке будет выполнена перегрузка метода, то компилятор выдаст ошибку.

5.3.3.Спецификаторы доступа.

В Java есть три спецификатора доступа public, private и protected.

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

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

Ключевое слово protected означает, что член класса является закрытым (private) для пользователя класса, но для всех, кто наследует от класса, и для соседей по пакету он доступен.

Обычно все поля класса помечаются как private, а все методы – public.

5.4. Интерфейсы

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

Для обозначения абстрактных классов и методов используется ключевое слово abstract. Абстрактный метод не завершён; он состоит только из объявления и не имеет тела.

Класс, содержащий абстрактные методы, называется абстрактным и должен обозначаться ключевым словом abstract.

Сделаем класс Light абстрактным:

abstract class Light  {

boolean isLit;

public abstract void on();

public abstract void off();

}

Теперь, если наследовать от класса Light, нам обязательно нужно определить методы on() и off(). Таким образом, класс Dimmer будет выглядеть так:

class Dimmer extends Light{

 int brightness;

public void on(){

 isLit = true;

 brightness = 15;

}

public void off(){

 isLit = false;

 brightness = 0;

}

public void setBright(int bright){

 brightness = bright;

}

}

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

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

Для создания интерфейса используют ключевое слово interface вместо class. Для создания класса, реализующего определённый интерфейс, используется ключевое слово implements.

Сделаем из класса Light интерфейс:

interface Light  {

void on();

void off();

}

Заметьте, что каждый метод интерфейса ограничивается простым объявлением. Вдобавок ни один метод интерфейса не объявлен со спецификатором public, все методы автоматически являются открытыми. Класс Dimmer будет реализовывать интерфейс Light:

class Dimmer implements Light{

boolean isLit;

int brightness;

public void on(){

 isLit = true;

 brightness = 15;

}

public void off(){

 isLit = false;

 brightness = 0;

}

public void setBright(int bright){

 brightness = bright;

}

}

Вопросы для проверки знаний.

1.  В  чем заключается основная идея  парадигмы процедурного программирования ?

2.  Каковы общие принципы парадигмы структурного программирования ?

3.  Какова главная идея парадигмы модульного программирования ?

4. Каковы основные принципы, положенные в основу объектно-ориентированного программирования ?

5. Что называют классом в объектно-ориентированном программировании ?

6. Что называют объектом в объектно-ориентированном программировании ?

7. Что называют абстрактными методами и классами ?

8. Что называют интерфейсом ?

9. Каковы три основных понятия в ООП ?

10. В чем заключается смысл инкапсуляции ?

11. В чем заключается смысл наследования классов в ООП ?

12. В чем состоит общая идея полиморфизма ?

13. Что называют перегрузкой метода ?

14. Что называют переопределением метода ?

15. Как  в Java реализована защита от переопределения методов ?

16. Как в Java практически производится выбор метода ?

17. Каково в Java назначение указателя This ?

18. Какой метод называют конструктором? Какую функцию он выполняет? Каков механизм его вызова в Java ?

19. В чём отличие композиции и наследования?

20. Зачем используется запись @Override ?

21. Какие в Java есть три спецификатора доступа и каково их назначение ?

22. Как создать интерфейс и класс, его реализующий ?

Контрольная работа 3. Классы и интерфейсы в Java

1. Создать интерфейс Instrument. Интерфейс имеет два метода play() и adjust(). Создать два класса Guitar и Drum, реализующих данный интерфейс. При выполнении методов на консоль выводится названия метода и класса, вызвавшего метод, например, при выполнении метода play() класса Drum на консоли появится:

Drum play()

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

2. Дан класс Circle:

class Circle {

   // свойства класса

   public double x; // абсцисса центра

   public double y; // ордината центра

   public double r; // радиус

   // методы класса

   // выводит на экран параметры окружности

   public void printCircle() {

       System.out.println("Окружность с центром ("+x+";"+y+") и радиусом "+r);

   }    

   // перемещает центр, движение окружности

   public void moveCircle(double a, double b) {

       x = x + a;

       y = y + b;

   }

   // масштабируем, выполняем преобразование подобия с коэффициентом k

   public void zoomCircle(double k) {

       r = r * k;

   }    

}

2. Создайте в классе Circle метод, вычисляющий длину окружности.

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

3.Создать класс MyRect. Класс должен иметь:

а) 4 поля для обозначения координат двух точек в пространстве,

б) конструктор с 4 входными параметрами,

в) метод setMyRect с 4 входными параметрами для установки новых координат прямоугольника и

г)  метод toString, выводящий строку с координатами прямоугольника.

Наследовать от MyRect класс MyColorRect. Он должен иметь поле Color и метод setColor. При вызове метода toString объектом типа MyColorRect помимо координат выводится также значение цвета.

В методе main создать объект типа MyRect, задать ему координаты с помощью конструктора, вызвать метод toString(). Затем создать объект типа MyColorRect, задать ему координаты, цвет и вызвать метод toString().

4. Создать интерфейс для выполнения простых арифметических операций. Создать класс, реализующий этот интерфейс.

5. Создать интерфейс для расчёта тригонометрических функций (cos, sin, tg, ctg). Создать класс, реализующий этот интерфейс.




1. задание сдать к 29
2. тема Цели объекты и процесс маркетингового исследования
3. для взрослых и детей.html
4. Спокойное сияние слоновая кость 199 р
5. тематичні моделі прогнозування динамічних рядів у дилінгових інформаційних системах Спеціальність 0
6. Мы любим тебя таким каков ты есть всегда Никогда не ставьте свою любовь к ребенку в зависимость от его
7. Расчет воздухонагревателя доменной печи
8. .Область применения
9.  развитие теории методов анализа
10. В части II будут рассмотрены некоторые вопросы практической реализации и дан обзор отдельных решений прош
11. Магматизм и магматические горные породы
12.  Товароведная характеристика сметаны [4] 1
13. Выявление типов смеха в романе Ф.М. Достоевского Преступление и наказание.html
14. тематическом описании свойств исследуемых объектов по результатам их изучения выборочным методом на основе
15. средневзвешенный индекс или уровень цен на товары и услуги формирующие валовой национальный продуктКоэфф
16. Перемещение Команда ГЛАВНАЯ] РЕДАКТИРОВАНИЕ] ПЕРЕНЕСТИ {MOVE} Переместить стулья к столу- выбрать од
17. і В спеціальних установах для дітей із порушеннями психофізичного розвитку навчальновиховну корекц
18. Команда ветвления, команда повторения
19. Учение Фрейда
20. Концепція відносності простору-часу