Java. Введение в объектно-ориентированное программирование

Суть объектно-ориентированного програмиирования заключается в представлении программы в виде взаимодействия объектов. Объект это какая-то либо сущность с определенными свойствами и определенными операциями над ней.
Объекты были изначально созданы для моделирования реальности: многие вещи вокруг нас можно представить как объект. Например, книгу, которую вы читали недавно, можно представить как объект со свойствами «имя», «автор», «возрастной рейтинг», «текст книги», «число страниц», и т. д. Над книгой можно совершать операции вроде «прочитать книгу», «сжечь книгу», и т. п.
В терминологии языка программирования Java эти «свойства» называются полями, а операции над объектами называются методами.
Поскольку Java является языком со статической типизацией, любой объект должен быть создан по какому-то шаблону. В Javе такие шаблоны являются классами. Класс описывает какие поля могут быть у какого-то типа объекта и какие операции опредены над ним.
Разница между классом и объектом аналогична разнице между понятием «машина» и тойотой камри припаркованной у 5 дома на улице Чебуреково.

Рассмотрим процедуру создание своего класса объектов c полями в Java.
class Book {
  String name;
  String authorName;
  int ageRequirement;
  String text;
  int pageCount;
}

Этот код создает класс «Book». У объектов класса «Book» есть два целочисленных свойства (c именами «ageRequirement» и «pageCount») и три свойства типа «String» (с именами «name», «authorName» и «pageCount»).
Общий синтаксис создания класса c полями выглядит следующим образом.

class <имя класса> {
<тип первого свойства> <имя первого свойства>
<тип второго свойства> <имя второго свойства>

<тип последнего свойства> <имя последнего свойства>
}


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

Операции над объектами в Jave называются методами. Методы похожи на математические функции: они могут принимать аргументы и возвращать значение. С другой стороны, методы в Jave также имеют доступ ко всем полям объекта.

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

    class Book
    {
        String name;
        String authorName;
        int ageRequirement;
        String text;
        int pageCount;
        // создаем метод print
        void print(int age)
        {
            System.out.println(«Имя: » +name);
            System.out.println(«Автор: » +authorName);
            System.out.println(«Число страниц: » +Integer.toString(ageRequirement);
            // здесь будет код проверки
        }
    }
 Разберем синтаксис создания метода

1) Первой строкой метода является его сигнатура.
2) Первым пишется возвращаемый тип метода. У нас метод не возвращает какого-то значения, поэтому пишем void
3) Затем в сигнатуре идет название метода («print»).
4) В скобках идет перечисление аргументов. Аргументы пишутся через запятую. Для каждого аргумента указываются его тип и название через пробел. В нашем случае аргумент только один, у него тип int и название «age», поэтому запятых нет.
5) После этого идет код метода в фигурных скобках. Для возврата значение из метода нужно написать «return <значение>;». В примере метод ничего не возвращает, так что return можно не писать. Чтобы досрочно завершить выполнения метода можно написать «return;».
6) В самом классе мы можем обращаться к полям объекта этого класса по имени.

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

Поля и методы можно сделать публичными с помощью модификатора доступа «public». Существует еще модификатор «private», который делает поле приватным. Он необязателен, так как все поля и методы приватные по умолчанию. Вот пример использования модификаторов public и private.
    class Book
    {
        public String name;
        String authorName;
        private int ageRequirement;
        String text;
        public int pageCount;
        int getTextLength()
        {
            return text.length();
        }

        public int getAverageLetterCount()
        {
            return getTextLength() / pageCount;
        }

        private int getDifficuiltyLevel()
        {
            return 5 * ageRequirement * text.Length();
        }

    }

В этой версии класса Book поля «name» и «pageCount» стали открытыми для чтения и модификации в других объектах. Метод getAverageLetterCount() также доступен для вызова из объектов других классов. Все остальные поля и методы остаются приватными и доступны только в методах этого класса. В публичном методе getAverageLetterCount() мы можем вызвать приватный метод getTextLength(), так как getAverageLetterCount() принадлежит самому классу. А вот из метода другого класса сделать так не выйдет.

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

В уроках до этого обсуждалось создание классов, которые являются шаблонами для создания объектов. В этом же уроке будут описан процесс создания и использования самих объектов.

Ссылки
В языке Java переменная никогда не может хранить объект. Вместо этого, в Jave существуют ссылки, которые указывают на расположение объекта в памяти.
Синтаксис создания переменной типа ссылка на объект выглядит следующем образом:
<Имя класса> <имя переменной>;
Стоит отметить, что мы сразу же указываем класс, на объекты которого будет указывать ссылка.

Пример: переменная с именем «b», указывающая на класс Book:

Book b;

Точно также можно создавать и поля класса (там можно дописать модификатор доступа). Можно создавать массивы ссылок и возвращать их из методов. Пример:

public class Libary {
  public Book[] books;
  public Book findBookWithName(String name) {
//код, который находит нужную книгу
  }
};


Вывод: с ссылками во многом можно работать также, как и с переменными других элементарных типов (int, long, double...).