Вводный курс. Язык программирования Java
- Вводный курс. Язык программирования Java
- Просмотров: 8911
14. Объектно-ориентированное программирование. Классы
Объектно-ориентированное программирование (ООП) – технология разработки сложного программного обеспечения, в которой программа строится в виде совокупности объектов и их взаимосвязей. Технологии ООП предшествовала технология структурного программирования – технология программирования, в которой программа строится на основе подпрограмм (процедур и функций), каждая из которых решает отдельную подзадачу.
Java представляет собой полностью объектно-ориентированный язык. Объектно-ориентированная программа состоит из объектов и взаимодействий объектов между собой. Взаимодействие реализовано через сообщения, которые объекты посылают друг другу. Каждый объект представляет модель реального мира и характеризуется состоянием (набором собственных данных) и поведением – методами, которые изменяют его состояние (значения этих данных). Объединение данных и действий, производимых над этими данными, в единое целое, которое называется объектом – является одним из основных принципов ООП. Построение объекта как модели изучаемой сущности определяется постановкой задачи.
В программе для представления объекта используется понятие класса.
Классы
Вот несколько определений класса, позволяющих посмотреть на определение класса с разных сторон.
- Класс является типом данных, определяемым пользователем и представляет собой структуру в виде данных и функций для работы с данными.
- Класс - это шаблон поведения объектов определенного типа с заданными параметрами, определяющими состояние.
- Формально Класс — это шаблон, по которому будет сделан объект.
Создание объекта на основе некоторого класса называется созданием экземпляра (instance) этого класса.
Вот пример. Форма для изготовления печенья – это класс, а само печенье это объект или экземпляр класса. Печенье имеет размеры, цвет, состав – это поля класса.
И так, класс – шаблон для создания объектов. В классе описываются данные, которыми смогут обладать объекты данного класса. Эти данные называются полями. Также в классе описываются методы. Методы предназначены для чтения или изменения данных объекта. Прямой доступ к полям объекта невозможен. Обратиться к полям можно только через методы класса. Методы класса могут применяться только к объектам данного класса. В теле каждого метода доступны свойства того объекта, для которого метод был вызван.
Конструктор — это особый вид метода, который служит для инициализации (выделения памяти и задания начальных значений) созданных объектов. Поэтому говорят, конструктор предназначен для создания объекта.
Пример. Создадим класс точка на плоскости, с именем Point. Класс должен иметь поля x, y – координаты точки на плоскости, а также конструктор, создающий точку и следующие методы:
печать координат точки на плоскости,
метод вычисления расстояния точки от начала координат,
метод перемещения точки на заданные расстояния по осям x и y.
public class Point {
// положение точки на плоскости определяется
// двумя координатами: x и у - поля класса
int x; //координата x
int y; //координата y
// Конструктор создает точку с заданными координатами
// int X, int Y – формальные параметры метода
Point(int X, int Y)
{
x=X;
y=Y;
}
// все методы работают только с полями этого класса
// Метод вычисляющий расстояние между двумя точками
public double getDistance() {
return Math.sqrt( x*x + y*y );
}
// Метод перемещения точки на расстояния dx,dy
public void Move(int dx, int dy)
{
x += dx;
y += dy;
}
//Метод, выводящий координаты точки на экран
public void Print()
{
System.out.println("x="+x +" y="+y);
}
}
Далее, создадим объект класса Point и вызовем методы класса.
public class MyPoint {
public static void main(String[] args) {
// Создаём объект класса точек с помощью конструктора x=2, y=5
Point p= new Point(2,5);
System.out.println("Начальные координаты точки");
//печатаем координаты точки
p.Print();
//вычисляем расстояние от начала координат
double len = p.getDistance();
System.out.println("расстояние от начала координат= "+len);
//перемещаем точку на dx= 5, dy =5
p.Move(5, 5);
System.out.println("Координаты после перемещения");
//печатаем координаты точки
p.Print();
//вычисляем расстояние от начала координат
len = p.getDistance();
System.out.println("расстояние от начала координат= "+len);
}
}
Результат работы:
Начальные координаты точки
x=2 y=5
расстояние от начала координат= 5.385164807134504
Координаты после перемещения
x=7 y=10
расстояние от начала координат= 12.206555615733702
Основные принципы ООП
Инкапсуляция - объединение в одном объекте данных и методов их обработки.
Основной принцип инкапсуляции заключается в запрещении прямого доступа к полям экземпляра данного класса методам других классов.
- Программы должны взаимодействовать с данными объекта только с помощью методов этого объекта.
- Это значит, что в классе можно полностью изменить способ хранения данных, сохранив методы их обработки, и при этом остальные объекты смогут работать с объектами этого класса, как прежде
Наследование - создание нового класса на базе уже имеющегося, или базового класса.
Наследование вводит иерархию "от общего к частному’. Эта технология предполагает создание общих классов, на базе которых создаются конкретные классы, причем в этих конкретных классах автоматически повторяется код общего класса.
Полиморфизм – свойство, которое позволяет использовать одно и тоже имя функции для решения двух и более схожих, но технически разных задач.
Формальное объявление и определение класса
<мд> class имя (параметры) {
// поля класса
<мд> <тип> имя переменной;
<мд> <тип> имя переменной;
…
<мд> static <тип> имя переменной;
//конструктор по умолчанию
<мд> <имя класса> (){ код}
//конструктор с параметрами
<мд> < имя класса > (параметры) { код}
//методы объекта
<мд> <тип> <имя метода>(параметры) { код }
//методы класса
<мд> static <тип> <имя метода>(параметры) { код }
}
где:
<мд> - модификатор доступа : public, private, protected, final, static
private - доступ только в методах данного класса. Доступа из объектов нет!
protected - доступ только в методах класса, пакета, в классах-наследниках (они могут располагаться в других пакетах).
public - доступ из любых классов и объектов
final: метод, класс окончательный и не может быть изменен
static: общее поле или метод для всех объектов класса.
Модификатор по умолчанию. Отсутствие модификатора у поля или метода класса предполагает применение к нему модификатора по умолчанию. Такие поля или методы видны всем классам в текущем пакете.
Объявление конструкторов
Конструктор — это особый вид метода, который служит для инициализации созданных объектов.
- Имя конструктора должно совпадать с именем класса.
- Конструктор не возвращает никакого значения. То есть тип возвращаемого им значения — всегда void.
- Перед именем конструктора нельзя использовать модификаторы: abstract, static, final.
- Если в классе не описан ни один конструктор, то компилятор автоматически создается конструктор по умолчанию. Этот конструктор не имеет параметров.
- Если затем в такой класс добавляется конструктор (не важно, с параметрами или без), то конструктор по умолчанию больше не создается.
Вызов конструктора происходит особым образом — с помощью оператора new. При обращении к конструктору создается новый объект, после чего конструктор выполняется, осуществляя инициализацию полей класса.