ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ НА JAVA

Одна из самых важных тем при изучении любого объектно-

ориентированного языка - это понятие класса и приемы объектно-

ориентированного программирования.

Класс                 это         базовый         элемент         объектно-ориентированного

программирования. Он представляет собой шаблон для создания объектов, экземпляров класса. Класс объединяет в себе методы и поля, которые

описывают поведение объекта этого класса.

 

Пример, который наглядно показывает, что собой представляет объектно-

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

следующим образом:

cla*s *ircle

{

}

Пока описанный класс не имеет ни одного поля и ни одного метода.

Теперь добавим в описанный класс поля для координат центра окружности и

радиуса, которые определяют окружность:

cl*ss Circl*

{

i** x, y, Radius;

}

Теперь объекты (экземпляры) этого класса могут иметь свои собственные

значения этих полей.

Любая программа на Jav* - это класс, который имеет метод mai*().

Причем имя этого класса должно полностью совпадать с именем файла. Создадим основной класс программы МуАррl и сохраним его в файле

МуАррl.java:

class МуАррl

{

p*blic static v*id *ain (String argv[])

{

}

}

Теперь добавим к этой программе описанный класс Circ*e и создадим

несколько объектов этого класса в методе *ai*() класса МуАрр*:

class МуАррl

{

public static void main (*tring arg*[])

{

Cir*le c1, **;

c1 = new Ci*cl*();

c2 = *e* Citcle();

c1.x = 100; c1.y = 90; c1.Rad*** = 20;

c2.x = *00; c2.y = 100; c2.*adius = 20;

}

}

 

class Circle

{

int *, *, Radius;

}

В этом примере мы имеем две разные окружности. У каждой из них есть

свой радиус и свои координаты центра.

Для того, чтобы определить какие-нибудь действия над экземплярами

класса Circle в нем нужно определить соответствующие методы. Например, метод *how() (показать) и *ide() (спрятать) окружность. При выполнении своей работы эти методы будут пользоваться свойствами класса Circle, т.е. координатами центра и радиусом. В этих методах описываем соответственно

прорисовку окружности и ее сокрытие.

Не останавливаясь на реализации этих методов, подчеркнем, что главное

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

переменными.

publ*c voi* show()

{

// рисуем окружность

}

 

public v*i* hide()

{

// убираем окружность

}

Можно определить еще несколько методов этого класса. Предположим,

нужно реализовать объекты часы - Clock, которые будут состоять из окружности и одной секундной стрелки, движущейся по этой окружности. В этом случае подойдет уже описанный класс Circle. Для того чтобы использовать его со всеми его свойствами и методами в новом классе Clock,

воспользуемся                   таким                  понятием                 объектно-ориентированного

программирования, как наследование. Создадим класс-потомок *lock, который

унаследует методы и свойства класса Cir*le.

cl*ss Clock *xtends Ci*cle

{

}

Теперь у класса Clock есть все те свойства, которые были в классе Circle:

это координаты центра и радиус. Для того, чтобы реализовать в полной мере класс Clo*k, необходимо объявить еще одно поле. Это поле будет хранить текущую позицию секундной стрелки. Так как полный оборот стрелки 60

секунд, то для этого свойства будет достаточно разрядности типа byte.

clas* Clock extends *ircle

{

b*te sPos;

}

После этого к классу Clock добавляем методы s*art() и stop(), которые

будут запускать и останавливать часы. Прорисовка часов реализуется в

соответствии со значениями полей х, у, Radi*s и sPos.

p*blic void start()

{

//запустить часы, начиная со значения sP*s

}

 

public void s*op()

{

//остановить часы, при этом не обнуляя значение свойства s*os

}

На примере класса Clock познакомимся более подробно с понятием

конструктора в Java. Конструктор - это тот же метод класса, имя которого совпадает с именем класса. Он используется для инициализации свойств класса и при выполнении необходимых действий при создании экземпляра класса. В нашем случае важно при создании экземпляра объекта Cloc* задать начальные значения всем свойствам этого класса, в том числе и начальной позиции секундной стрелки часов sPos. Для создания конструктора определим метод

класса Clock с таким же именем:

Cloc* (*nt px, int p*, in* pRa*ius, int psPos)

{

x = px;

y = *y;

Radius = pRad*us;

SPos = psPos

}

Важно, что конструктор ничего не должен возвращать.

Итак, наш класс в общем виде будет выглядеть следующим образом:

class Clo*k *xt*nds Cir*le

{

int s*os;

 

*lock(int p*, int py, int pRa*iu*, int psPos)

{

x = px;

y = py;

Radius = **adius;

sPo* = *s**s

}

 

public void start()

{

// запустить часы, начиная со значения *Po*

}

 

publ*c void stop()

{

// остановить часы, при этом не обнуляя значение свойства s*o*

}

}

В итоге имеем два класса: Ci**le и Cl**k. Методы и свойства класса Circle

наследуются классом Cl*c*.

Приведем пример использования класса C*o*k в методе *ain() какого-

нибудь из классов основной программы:

publi* *tatic vo*d ma**(String arg*[])

{

*lock cl;

*l = newClock(*50, 150, 50, *);

cl.sta*t(); // часы пошли.

Этот метод лучше реализовывать в отдельном треде (потоке), чтобы затем

можно было

// из любого места основной программы их остановить.

}

Относительно конструкторов важно отметить, что в Java реализован

собственный сборщик мусора, обеспечивающий удаление из памяти своих

объектов.