Top.Mail.Ru

Перечень уроков по Java

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

 

 

Основные принципы ООП

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

 Основной принцип инкапсуляции заключается в запрещении прямого доступа к полям экземпляра данного класса методам других классов.

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

Наследование - создание нового класса на базе уже имеющегося, или базового класса.

Наследование вводит иерархию "от общего  к частному’. Эта технология предполагает создание общих классов,  на базе которых создаются конкретные  классы,  причем в этих конкретных классах автоматически повторяется код общего класса.

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

 

Формальное объявление и определение класса

 

<мд> class  имя (параметры) {

 // поля класса

<мд> <тип> имя переменной;

<мд> <тип> имя переменной;

<мд> static <тип> имя переменной;

//конструктор по умолчанию

<мд<имя класса> (){ код}

//конструктор с параметрами

<мд< имя класса > (параметры) { код}

//методы объекта

<мд> <тип> <имя метода>(параметры) { код }

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

<мд> static <тип> <имя метода>(параметры) { код }

}

где:

<мд> - модификатор доступа : public, private, protected, final, static

private -  доступ только в методах данного класса. Доступа из объектов нет!

protected - доступ только в методах класса, пакета, в классах-наследниках (они могут располагаться в других пакетах).

public - доступ из любых классов и объектов

final: метод, класс окончательный и не может быть изменен

static:  общее поле или метод для всех объектов класса.

 Модификатор по умолчанию. Отсутствие модификатора у поля или метода класса предполагает применение к нему модификатора по умолчанию. Такие поля или методы видны всем классам в текущем пакете.

Объявление конструкторов

 Конструкторэто особый вид метода, который служит для инициализации созданных объектов.

  • Имя конструктора должно совпадать с именем класса.
  • Конструктор не возвращает никакого значения. То есть тип возвращаемого им значения — всегда void.
  • Перед именем конструктора нельзя использовать модификаторы: abstract, static, final.
  • Если в классе не описан ни один конструктор, то компилятор автоматически создается конструктор по умолчанию. Этот конструктор не имеет параметров.
  • Если затем в такой класс добавляется конструктор (не важно, с параметрами или без), то конструктор по умолчанию больше не создается.

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