Модуль 2. Урок 1. Введение в ООП.

Для сохранения прогресса вступите в курс. Войти или зарегистрироваться.

alt text Внимание. В слайде была ошибка. Имя класса может начинаться со знака доллара ($).


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

  • все в этом мире представляется как отдельный объект
  • каждый объект может иметь свое состояние (иметь поля)
  • каждый объект может выполнять некоторые действия
  • программа - взаимодействие этих объектов

До появления ООП

  • дизайн программ - "сверху вниз"
    • высокая сложность кода
    • сложность растет обратно пропорционально до завершения проекта
    • а это живой код или "макароны"? - сложно поддерживать
    • новые фичи разрабатывать невозможно

Появление ООП

  • разработка идет "снизу вверх"
    • описываются объекты и действия с ними
    • такой код:
      • легко тестировать
      • стабильный
      • легко поддерживать
      • легко читаемый
    • правильный дизайн до разработки!

В мире java все является объектом.

Важные этапы в разработке

  • нужно понять задачу (то есть разработать высокоуровневую архитектуру того, что собираетесь делать)
  • для этого лучше всего использовать UML (спец язык, на котором при помощи диаграмм описывается архитектура)
  • пройти design review (показать кому-либо, кто в курсе что необходимо)
  • если есть готовая диаграмма, можно приступать к кодированию
  • пройти code review (показать тому, кто разбирается)

Что же такое класс

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

  • Класс обозначается ключевым словом class. И имя файла, в котором написан этот класс, должно совпадать с именем класса, без учета расширения .java. Например, для класса по имени MyClass файл будет называться вот так: MyClass.java. (синтаксис)

  • Имя класса всегда пишется с большой буквы! (синтаксис)

  • Если в имени класса больше одного слова, то каждое из них пишется с большой буквы —> CamelStyle. (стиль кода)

  • Поля и методы не могут существовать за пределами тела класса. (синтаксис)

  • Каждый метод имеет свое тело. Условные операторы if различные циклы и все, что выделяется в отдельный блок кода — тоже может иметь свое тело. И тела эти всегда заключены в фигурные скобки:

{
// некий код
} 

(синтаксис)

  • Эти блоки кода могут быть вложены друг в друга несколько раз. Например:
class CamelStyle {

    public void doSomething() {
        for (int i = 0; i < 10; i++) {
            if (i < 5) {
                System.out.println("Первая половина");
            } else {
                System.out.println("Вторая половина");
            }
        }
    }

}

(синтаксис)

Изучите внимательно обозначение тел блоков кода.

  • Количество открытых и закрытих скобок в классе должно быть попарно одинаковым. Иначе компилятор не поймет где чье тело. (синтаксис)

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

Разберем структуру класса на примере в коде:

1 class CamelStyle {
2
3 ••••String stringMassage = "некая полезная строка, как поле класса";
4 ••••Object forExample = new Object();
5
6 ••••public void doSomething() {
7 ••••••••System.out.println(stringMassage);
8 ••••••••System.out.println(forExample);
9 ••••}
10 
11}

(Циферки и точки тут для удобства объяснения. Их копировать не нужно!)

  • Ключевое слово class в строке 1 обозначает начало класса.
  • CamelStyle это имя класса.
  • { это открывающая фигурная скобка. Отступает на один пробел от имени класса. За ней начинается тело класса. Эта скобка не может существовать без своей закрывающей компаньонки }! Абсолютно вся суть класса содержиться между этими скобками. Пустой класс выглядел бы вот так: class CamelStyle {} (это скомпилируется).
  • строка 2 — это отступ от объявления класса. Его отсутсвие не приведет к ошибке компиляции. Но он необходим для удобства чтения кода.
  • } закрывающая скобка должна быть всегда на уровне первого слова в объявлении класса, метода и т.д. Например в данном примере закрывающая скобка класса находиться в строке 11, а закрывающая скобка метода в строке 9. Обратите внимание на их расположение относительно открывающих скобок.
  • String stringMassage = "некая полезная строка, как поле класса"; строка 3 и Object forExample = new Object(); строка 4 — это поля класса. Начало их записи с отступом в четыре пробела от уровня класса.
  • В пятой строке пусто для визуального отделения метода от полй.
  • public void doSomething() {... строка 6 — это начало метода. Обратите внимание, что у него свои фигурные скобки, свое тело. Но метод весь находиться внутри тела класса. О методах продолжим в дальнейших уроках. Эта строка так же начинается на четыре пробела дальше от уровня класса.
  • System.out.println(stringMassage); строка 7 и System.out.println(forExample); строка 8 — это команды для вывода на экран. Они вложены в метод doSomething и имеют отступ в четыре пробела от уровня метода.
  • И в десятой строке отступ перед закрывающей класс скобкой.

Практика offline

  1. Потренируйтесь самостоятельно компилировать класс CamelStyle. Командой javac CamelStyle.java. Возмите, по очереди, оба варианта этого класса из текста выше.

    Попробуйте поудалять или попереставлять скобки. Посмотрите на ошибки компилятора. И обязательно почитайте их! Так вы быстро привыкните понимать вывод компилятора об ошибках, т.к. вы знаете где вы их сделали.

    А если вам хочется этот класс не только скомпилировать но и запустить на исполнение — то для этого нужен main-метод, с которого начинается любая программа.

    Я его оформил в отдельном классе:

    class MainTest {
    
        public static void main(String[] args) {
            CamelStyle camelStyle = new CamelStyle();
            camelStyle.doSomething();
        }
    
    }
    

    Оба класса лежат в одной папке. Компилируются командой javac MainTest.java CamelStyle.java или просто javac MainTest.java — компилятор автоматом скомпилирует нужный , используемый в MainTest.java, класс CamelStyle.java.

    Запускать на исполнение нужно только тот класс, который содержит в себе main-метод. В данном случае это будет так: java MainTest. Напоминаю: расширение файла для команды java не пишем!

  2. Перенесите main-метод в CamelStyle.java. Скомпилируйте и запустите на исполнение программу уже без участия MainTest.java.

Полезные ссылки:


Дополнительная практика по теме:

1. [Написать класс с одним методом](https://ru.hexlet.io/challenges/m1e0p0)
2. [Написать класс согласно UML-диаграмме](https://ru.hexlet.io/challenges/m1e0p1)

Группы для общения:

Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →