Основные принципы объектно ориентированного программирования.

20-01-2020

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

Абстракция является основой объектно ориентированного программирования и позволяет работать с объектами, не вдаваясь в особенности их реализации. Так, для описания класса «Студент» имеет смысл рассматривать такие характеристики объектов, как фамилия, имя, отчество, номер зачетной книжки, номер курса, номер группы, оценки. Не имеет смысла оценивать, например, внешние данные или характер.

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

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

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

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

Полиморфизм – возможность объектов с одинаковой спецификацией иметь различную реализацию. Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций».

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

Класс и объект

Итак, класс – это шаблон, или прототип, по которому создаются объекты.

Синтаксис определения класса следующий:

[модификаторы доступа] class Имя_Класса {

//Тело класса, содержащее описание переменных и методов
..

}

Соглашение об именах классов.

Рекомендуется в качестве имени класса использовать существительные или фразы с использованием латинского шрифта, состоящие из нескольких существительных, имеющие смысл в используемом контексте. Все слова, входящие в имена, должны начинаться с большой буквы. Например: Student, Circle, SocketFactory, FileInputStream.

Создание экземпляров класса

Чтобы создать экземпляр класса (объект), надо:

  1. Объявить объект данного класса, указав имя класса и идентификатор данного объекта.
  2. Создать объект, т.е. выделить память и проинициализировать объект с помощью оператора “new”.

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

//Объявляем 3 экземпляра класса Circle: c1,c2,c3

Circle c1,c2,c3;

// Выделение памяти и создание экземпляров класса:
 с1 = new Circle();
 c2 = new Circle(3.0);
 c3 = new Circle(1.0,"зелёный")

 // Объекты можно объявлять и создавать в одном предложении:

 Circle c4 = new Circle(4.5, "голубой");

Если объект объявлен, но не создан, он имеет особое значение, которое называется null.

Оператор «Точка»

Переменные и методы, принадлежащие классу, называются переменными-членами (полями) и методами-членами данного класса. Чтобы обратиться к переменной-члену класса или методу-члену класса, надо:

  1. Указать идентификатор требуемого объекта.
  2. Использовать оператор «точка» (.) и указать член класса – переменную или метод.

Таким образом, пусть мы имеем класс AClass с переменной aVariable и методом aMethod(), а также объект данного класса anInstance, следует пользоваться обращением anInstance.aVariable и anInstance.aMethod().

Переменные-члены и методы-члены класса

Переменные-члены класса (поля) имеют имя (идентификатор) и тип и содержат значение данного типа.

Соглашение об именах переменных. В качестве имени переменной (поля) рекомендуется использовать существительное или фразу, составленную из нескольких существительных. Первое слово пишется маленькими буквами, а последующие должны начинаться с большой буквы, например, fontSize, roomNumber, xMax, yMin. Обратим внимание, что имя переменной начинается с маленькой буквы, а имя класса – с большой.

Формальный синтаксис для определения переменной в Java:

[модификаторДоступа] тип имяПеременной [= начальноеЗначение];

[модификаторДоступа] тип имяПеременной1 [=начальноеЗначение1],
                    [тип имяПеременной2 [=начальноеЗначение 2]] ... ;

Например,

private double radius;
public int length=1, width=1;

Синтаксис объявления метода в Java:

[модификаторДоступа] типВозвращаемогоЗначения имяМетода
([списокПараметров]) {
// тело метода (реализация) ......
}

Например,

public double getArea() {
  return radius*radius*Math.PI
}

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

Пример объектно ориентированного программирования

Рассмотрим класс Сircle – круг. Он содержит 2 переменные: radius типа double и цвет– color –типа String, а также 3 метода: getRadius(), getColor() и getArea(). При этом знаком "-" пометим закрытые свойства и методы, а "+" - открытые.

Circle
-radius:double=1.0
-color:String="green"
+getradius():double
+getColor():String
+getArea():double

Три объекта класса Сircle , названные с1, с2, с3, должны быть созданы со значениями сооответствующих членов класса.

c1:Circle
-radius=1.0
-color="green"
+getradius():double
+getColor():String
+getArea():double
c2:Circle
-radius=2.0
-color="blue"
+getradius():double
+getColor():String
+getArea():double
c3:Circle
-radius=3.0
-color="black"
+getradius():double
+getColor():String
+getArea():double

Посмотрим как это будет реализовано в Java (Код для описания класса Circle будет храниться в файле “Circle. java”):

//Определим класс Circle
 public class Circle {
   //переменные с уровнем доступа private
   private double radius;
   private String color;
 //конструкторы (перегружаемые)
   public Circle(){ //1-й конструктор
     radius=1.0;
     color="green";
   }

      public Circle(double r){ //2-й конструктор
     radius=r;
     color="green";
   }

     public Circle(double r, String c){ //3-й конструктор
     radius=r;
     color=c;
   }

   // методы с уровнем доступа public
   public double getRadius(){
     return radius;
   }

   public String getColor(){
     return color;
   }

   public double getArea(){
     return radius*radius*Math.PI
   }
}

Если мы попробуем сейчас скомпилировать «Circle.java» в «Circle.class», то мы получим ошибку:

$ java Circle
Error: Could not find or load main class Circle

ибо класс Circle не имеет метода main(), поэтому класс Circle нельзя запустить на выполнение как программу. Описание класса Circle может быть использовано как строительный блок для других программ. Тестирующая программа для класса TestCircle – файл TestCircle.java Напишем класс TestCircle, который использует класс Circle. Класс TestCircle имеет класс main() и может быть выполнен.

public class TestCircle {// сохарнить как TestCircle.java
public static void main(String[] arg) {// точка входа для выполнения программы
//создаём объект класса Circle с именем с1 (используя 3-й конструктор)
Circle c1 = new Circle(1.0,"green");
System.out.println("Radius = "+c1.getRadius()+" Color - " +c1.getColor()+ " Area= " + c1.getArea());

Circle c2 = new Circle(2.0);
System.out.println("Radius = "+c2.getRadius()+" Color - " +c2.getColor()+ " Area= " + c2.getArea());

Circle c3 = new Circle();
System.out.println("Radius = "+c3.getRadius()+" Color - " +c3.getColor()+ " Area= " + c3.getArea())
}
}

Скомпилируем TestCircle.java в TestCircle.class. Выполним TestCircle и изучим результат:

Radius = 1.0 Color - green Area = 3.141592653589793
Radius = 2.0 Color - green Area = 12.566370614359172
Radius = 1.0 Color - green Area = 3.141592653589793

Литература

  1. О.И. Гуськова, "ООП в Java", Москва, 2018