вторник, 14 июня 2016 г.

A programmer: Java #1: OOP basics

Как я говорил, есть необходимость быстро разобраться с основами Java, поэтому буду писать о своих успехах вне обычного еженедельного графика.

Итак, начал, естественно, с основ объектно-ориентированного программирования. Основами являются: наследование, инкапсуляция и полиморфизм. Все было понятно, кроме полиморфизма. На помощь пришли такие ресурсы:

 - Объясните что такое полиморфизм простыми словами ?
 - ООП. Полиморфизм
 - Java-course. Полиморфизм
 - Объектно-ориентированное программирование. Полиморфизм
 - Полиморфизм для начинающих
 - Java. Урок 24. Полиморфизм

Последний оказался самым полезным (вместе со вчерашним видео).

Итак, основы объектно-ориентированного программирования:

В ООП все есть объект - некая сущность, обладающая состоянием и поведением. То есть это нечто, что может существовать, иметь какие-то свойства и как-то себя вести. В отличие от функционального программирования, конструктивной единицей программы являются не функции, а объекты. При этом объекты создаются, преобразовываются и уничтожаются в процессе выполнения программы, вне этого, в коде существуют только классы - описания объектов, сами объекты - экземпляры класса.

Классы составляют иерархическую структуру, в которой происходит наследование свойств классов более высокого уровня (родительских классов) классами более низкого уровня (классами-наследниками). Это есть наследование.

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

Полиморфизм - возможность иметь разную реализацию у объектов с одинаковым интерфейсом = возможность вызывать методы подкласса (наследника) через суперкласс (родителя). Звучит не очень понятно, но суть в том, что если мы имеем ряд разных объектов одного типа (например: "квадрат", "круг", "треугольник" типа "фигуры") и мы хотим с ними что-то сделать (например, нарисовать), то мы можем обратиться к методу, описанному в классе "фигура", который с каждой фигурой сделает нужное действие (например, рисование), переопределенное для каждого из объектов. То есть мы говорим, обращаясь к классу "фигуры" - "нарисуй", а какую именно - определяет подкласс. Для этого, очевидно, необходимо наследование. Такой подход, во-первых, позволяет не прописывать действие для каждого случая. А во-вторых, методу родительского класса не обязательно знать, как именно он будет преопределен в наследнике и, соответственно, что именно в конце концов будет выполнено. Это позволяет в родительском классе "запланировать" некоторые свойства, которые потом, возможно, нужно будет как-то реализовать в наследниках.

Как-то так. А вообще картинка прошлого поста объясняет.

Комментариев нет: