Абстрактные классы в Java
Абстрактные классы в Java используются для создания классов, которые могут содержать абстрактные методы – методы без реализации, которые должны быть переопределены в подклассах. Абстрактный класс не может быть инициирован, то есть мы не можем создать объекты этого класса. Зато он может содержать как абстрактные методы, так и обычные методы с реализацией.
Для чего же вообще нужны классы, экземпляры которых мы не можем создать? Чтобы получше понять суть абстрактных классов рекомендую сначала прочитать статью Зачем нужно наследование в ООП. Там я приводил пример, в котором 3 класса Маг, Охотник и Воин наследуются от одного единственного класса Person, что помогло нам избавиться от дублирования кода. Этот класс скорее вспомогательный, объекты класса Person вряд ли пригодятся нам для написания кода, поэтому, чтобы сделать наш код еще лучше, можно сделать этот класс абстрактным, дописав к нему ключевое слово abstract.
Казалось бы, для чего нам ставить такие ограничения и запрещать создавать экземпляр класса Person? В действительности этот класс является некоей заготовкой для классов наших персонажей (Маг, Охотник, Рыцарь). Сам по себе объект класса Person не имеет никакого смысла в концепции компьютерной игры, а поэтому стоит избавить других своих коллег-разработчиков от соблазна создать его. Ну или не допустить это создание по случайности.
Абстрактные методы
Что еще есть в абстрактном классе, так это абстрактные методы. А что такое абстрактные методы по аналогии с абстрактными классами? Барабанная дробь... Правильно! Это методы, у которых нет реализации. Создавая абстрактный метод, мы подразумеваем, что наследники этого класса будут реализовывать этот метод.
Например, давайте добавим в класс Person метод makeBattleCry(), который позволит наследникам этого класса реализовывать боевой клич. Раз объекта класса Person существовать не будет, то и незачем ему его реализовывать. Поэтому можем смело сделать этот метод абстрактным, давая понять, что этот он будет использоваться другими классами наследниками и при этом каждый наследник будет его использовать по-своему (принцип полиморфизма).
На 10 строчке я добавил абстрактный метод makeBattleCry(). Обращаю внимание - у этого метода нет тела (нет фигурных скобок после названия). Оно ему и не нужно, зато теперь среда разработки подсказывает мне о кое-каких проблемах, несложно догадаться, что мне теперь нужно создать эти методы в моих классах-наследниках, добавив конкретную реализацию для каждого класса отдельно.
Планирую реализовать эти методы в следующей статье, которая будет посвящена полиморфизму... to be continued.
А здесь подведем итог:
Абстрактные классы могут содержать абстрактные и неабстрактные методы, переменные экземпляров и конструкторы. Абстрактные классы не могут иметь свои объекты.
Если остались какие-то вопросы или что-то нужно разобрать подробнее, буду признателен комментарию, постараюсь дописать и привести примеры)