ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ НА 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 реализован
собственный сборщик мусора, обеспечивающий удаление из памяти своих
объектов.