Опубликован: 04.12.2009 | Доступ: свободный | Студентов: 8268 / 594 | Оценка: 4.30 / 3.87 | Длительность: 27:27:00
Лекция 2:

Объектно-ориентированное проектирование и платформа NetBeans

Аннотация: Процедурное и объектно-ориентированное программирование. Инкапсуляция. Работа со ссылочными переменными. Сборка мусора. Проекты NetBeans. Пакеты. Уровни видимости классов. Импорт классов. Базовые пакеты и классы Java. Создание в NetBeans простейшего приложения Java. Компиляция файлов проекта и запуск приложения. Структура проекта NetBeans. Создание в NetBeans приложения Java с графическим интерфейсом. Редактор экранных форм. Внешний вид приложения. Ведение проектов. Редактирование меню экранной формы. Создание нового класса. Документирование исходного кода в Java. Основные компоненты пакетов swing и awt. Технологии Java и .Net.
Ключевые слова: программирование, ООП, методология программирования, Java, программа, деятельность, подпрограмма, значение, ПО, вычисленное значение, объект, ссылка, адрес, процедурное программирование, слово, ограничение доступа, инкапсуляция, класс, class member, зарезервированное слово, class, имя класса, объектный тип, объектная переменная, пробел, Окружность, связывание, равенство, конструктор, переменная, динамическое выделение памяти, список, координаты, радиус, связь, тип переменной, доступ, имя переменной, присваивание, теория программирования, переменная класса, методы класса, ячейка, Размещение, память, ссылочный тип, примитивный тип, ячейка с данными, произвольное, приложение, exception, thread, AWT, прямоугольник, синоним, поле, место, сборка мусора, garbage collection, object pascal, логические ошибки, программное обеспечение, сеть, число независимости, файл, package, папка, имя пакета, mac os, friend, общедоступный класс, число классов, Swing, исключение, applet, Abstract Window Toolkit, bean, компонентная модель, JavaBeans, reflection, channel, обратное преобразование, RMI, crypto, sound, парсер, SUN, CORBA, object request broker, architecture, JMX, JNDI, Apache, IETF, Kerberos, OMG, IDE, меню, дерево, класс приложений, двойной щелчок, инструкция, информация, javadoc, метаданные, массив, параметры командной строки, модификатор видимости, права, алгоритм, пространство, вывод, консоль, системные шрифты, пользовательский интерфейс, GUI, graphical user interface, компиляция, пункт, HTML, модуль, архив, JAR, целостность, копирование, закрытая среда, конфигурация, среда разработки, имя окна, shift, исполнение, манифест, экранная форма, RAD, rapid application development, OOD, object-oriented design, интерфейс, private, выход, код завершения, дизайн, палитра компонентов, компонент, Button, мышь, выделенный компонент, система принятия, диалоговое окно, foreground, event handler, NULL, префикс, USER, interface, кадр, figures, constructor, документирование, JDK, пользовательский тип, заголовки, deprecated, warning, summary, enterprise, перенос текста, абсолютно позиционированный элемент, информационное сообщение, параметр, инструментарий, Canvas, anchor, менеджер, якорь, прикладное программирование, язык программирования, Java Beans, visual, delphi, net, безопасность, language, environment, Common Language Runtime, Интернет, ISO, international, standard, оболочка, open source, OPEN, licence, лицензия, заголовок сообщения

2.1. Процедурное и объектно-ориентированное программирование. Инкапсуляция

Для изучения лекции понадобится исходный код.

Объектно-ориентированное программирование (ООП) - это методология программирования, опирающаяся на три базовых принципа:

  • инкапсуляцию,
  • наследование,
  • полиморфизм.

Язык Java является объектно-ориентированным и в полном объеме использует эти принципы. В данном параграфе рассматривается принцип инкапсуляции, наследованию и полиморфизму посвящены отдельные параграфы.

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

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

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

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

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

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

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

Самым простым из указанных в начале параграфа принципов является инкапсуляция. Это слово в общем случае означает "заключение внутрь капсулы". То есть ограничение доступа к внутреннему содержимому снаружи и отсутствие такого ограничения внутри капсулы. В объектном программировании "инкапсуляция" означает использование классов – таких типов, в которых кроме данных описаны подпрограммы, позволяющие работать с этими данными, а также выполнять другие действия. Такие подпрограммы, инкапсулированные в класс, называются методами. Поля данных и методы, заданные в классе, часто называют членами класса (class members).

Класс – это описание того, как будет устроен объект, являющийся экземпляром данного класса, а также какие методы объект может вызывать. Заметим, что методы, в отличие от других подпрограмм, могут напрямую обращаться к данным своего объекта. Так как экземплярами классов ("воплощением" в реальность того, что описано в классе) являются объекты, классы называют объектными типами.

Все объекты, являющиеся экземплярами некоторого класса, имеют одинаковые наборы полей данных ( атрибуты объекта) – но со значениями этих данных, которые свои для каждого объекта. Поля данных - это переменные, заданные на уровне описания класса, а не при описании метода. В процессе жизни объекта эти значения могут изменяться. Значения полей данных объекта задают его состояние. А методы задают поведение объекта. Причем в общем случае на это поведение влияет состояние объекта – методы пользуются значениями его полей данных.

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

Объектные переменные – такие переменные, которые имеют объектный тип. В Java объектные переменные – это не сами объекты, а только ссылки на них. То есть все объектные типы являются ссылочными.

Объявление объектной переменной осуществляется так же, как и для других типов переменных. Сначала пишется тип, а затем через пробел имя объявляемой переменной. Например, если мы задаем переменную obj1 типа Circle, "окружность", ее задание осуществляется так:

Circle obj1;

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

Создается объект с помощью вызова специальной подпрограммы, задаваемой в классе и называемой конструктором. Конструктор возвращает ссылку на созданный объект. Имя конструктора в Java всегда совпадает с именем класса, экземпляр которого создается. Перед именем конструктора во время вызова ставится оператор new – "новый", означающий, что создается новый объект. Например, вызов

obj1=new Circle();

означает, что создается новый объект типа Circle, "окружность", и ссылка на него (адрес объекта) записывается в переменную obj1. Переменная obj1 до этого уже должна быть объявлена. Оператор new отвечает за динамическое выделение памяти под создаваемый объект.

Часто совмещают задание объектной переменной и назначение ей объекта. В нашем случае оно будет выглядеть как

Circle obj1=new Circle();

У конструктора, как и у любой подпрограммы, может быть список параметров. Они нужны для того, чтобы задать начальное состояние объекта при его создании. Например, мы хотим, чтобы у создаваемой окружности можно было при вызове конструктора задать координаты x, y ее центра и радиус r. Тогда при написании класса Circle можно предусмотреть конструктор, в котором первым параметром задается координата x, вторым – y, третьим – радиус окружности r. Тогда задание переменной obj1 может выглядеть так:

Circle obj1=new Circle(130,120,50);

Оно означает, что создается объект-окружность, имеющий центр в точке с координатами x=130, y=120, и у которой радиус r=50.

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

Отметим еще одно правило, касающееся используемых имен. Как мы помним, имена объектных типов принято писать с заглавной буквы, а имена объектных переменных – с маленькой. Если объектная переменная имеет тип Circle, она служит ссылкой на объекты-окружности. Поэтому имя obj1 не очень удачно – мы используем его только для того, чтобы подчеркнуть, что именно с помощью этой переменной осуществляется связь с объектом, и чтобы читатель не путал тип переменной, ее имя и имя конструктора. В Java принято называть объектные переменные так же, как их типы, но начинать имя со строчной буквы. Поэтому предыдущий оператор мог бы выглядеть так:

Circle circle=new Circle(130,120,50);

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

Circle circle1=new Circle(130,120,50);
Circle circle2=new Circle(130,120,50);

С помощью объектных переменных осуществляется доступ к полям данных или методам объекта: сначала указывается имя переменной, затем точка, после чего пишется имя поля данных или метода. Например, если имя объектной переменной obj1, а имя целочисленного поля данных x, то присваивание ему нового значения будет выглядеть как

obj1.x=5;

А если имя подпрограммы show, у нее нет параметров и она не возвращает никакого значения, то ее вызов будет выглядеть как

obj1.show();

Методы делятся на методы объектов и методы классов. Чаще всего пользуются методами объектов. Они так называются потому, что пользуются полями данных объектов, и поэтому их можно вызывать только из самих объектов. Методы классов, напротив, не пользуются полями данных объектов, и могут работать при отсутствии объекта. Поэтому их можно вызывать как из классов, так и из объектов. Формат вызова: имяКласса.имяМетода(список параметров) или имяОбъекта.имяМетода(список параметров).

При задании метода класса перед его именем необходимо поставить модификатор static – "статический". Это крайне неудачное название, пришедшее в язык Java из C++. Мы никогда не будем называть такие методы статическими, а будем называть их методами класса, как это принято в теории программирования.

Точно так же переменные (поля данных) делятся на переменные объектов и переменные классов. При задании переменной класса перед ее именем необходимо поставить модификатор static. Переменные класса, как и методы класса, можно вызывать как из классов, так и из объектов. Формат вызова: имяКласса.имяПеременной или имяОбъекта.имяПеременной.

Не следует путать классы, объекты и объектные переменные. Класс – это тип, то есть описание того, как устроена ячейка памяти, в которой будут располагаться поля данных объекта. Объект – это содержимое данной ячейки памяти. А в переменной объектного типа содержится адрес объекта, то есть адрес ячейки памяти. Сказанное относится только к языкам с динамической объектной моделью, каким, в частности, является Java. В C++ это не так.

Как уже было сказано, кроме полей данных в классе описываются методы. Несмотря на схожесть задания в классе полей и методов их реальное размещение во время работы программы отличается. Методы не хранятся в объектах, но объекты могут их вызывать. Каждый объект имеет свой комплект полей данных – "носит свои данные с собой". Если имеется сотня объектов одного типа, то есть являющихся экземплярами одного и того же класса, в памяти компьютера будет иметься сотня ячеек памяти, устроенных так, как это описано в классе. Причем у каждого объекта значения этих данных могут быть свои. Например, если объект является окружностью, отрисовываемой на экране, у каждой окружности будет свой набор координат, радиусов и цветов. Если мы будем отрисовывать окружности с помощью метода show(), нет необходимости в каждом объекте хранить код этого метода – он для всех ста объектов будет одним и тем же. Поэтому методы не хранятся в объектах – они хранятся в классах. Класс – более общая сущность, чем объект, и до того, как во время работы программы в памяти компьютера будет создан объект, сначала должен быть загружен в память соответствующий ему класс. В Java имеется возможность создавать переменные типа "класс", и с их помощью обращаться к классам таким образом, как будто это объекты особого рода. Но, в отличие от обычных объектов, такие "объекты" не могут существовать в нескольких экземплярах, и правила работы с ними принципиально отличаются от работы с объектами. Такие сущности называются метаобъектами.

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

Максим Старостин
Максим Старостин

Код с перемещением фигур не стирает старую фигуру, а просто рисует новую в новом месте. Точку, круг.

Muhammad Jalilov
Muhammad Jalilov
Таджикистан
Олег Лупац
Олег Лупац
Россия, Воронеж, Воронежский государственный университет, 1984