Прежде чем мы продолжим, давайте разберемся со словарным значением абстрактного слова. «существующий в мысли или как идея, но не имеющий физического или конкретного существования».
Модификатор Abstract применим только для методов и классов, но не для переменных.
Абстрактные методы. Когда реализация метода различается от дочернего к дочернему, мы объявляем этот метод как абстрактный в родительском классе. Объявив абстрактный метод в родительском классе, мы можем дать указания дочернему классу, например, какие методы они должны обязательно реализовать. Объявление абстрактного метода должно заканчиваться точкой с запятой, иначе компилятор выдаст ошибку компиляции: абстрактные методы не могут иметь тела.
Абстрактный метод никогда не говорит о реализации, где, как если бы какой-либо модификатор говорил о реализации, тогда модификатор будет врагом абстракции, и эти комбинации модификаторов всегда недопустимы с абстрактными методами.
Пример 1: Метод не может быть одновременно окончательным и абстрактным. Модификатор final ограничивает переопределение метода в дочерних классах, но абстрактные методы всегда реализуются в дочернем классе.
Пример 2: переопределение невозможно со статическими методами (это делает статический метод скрытым). Если вы объявляете метод в абстрактном классе, вы должны переопределить этот метод в дочернем классе. Статические члены являются элементами времени компиляции, но переопределение происходит во время выполнения (полиморфизм времени выполнения). Следовательно, абстрактный метод не может быть статическим.
На изображении ниже показаны недопустимые комбинации с абстрактными модификаторами.
Абстрактный класс:Для любого класса Java, если нам не разрешено создавать объект, такой тип класса, который мы должны объявить с помощью модификатора abstract, который для создания экземпляра абстрактного класса не является возможный.
В чем разница между абстрактным классом и абстрактным методом?
- Если класс содержит хотя бы один абстрактный метод, то соответствующий класс должен быть обязательно объявлен с модификатором abstract. Потому что реализация класса не завершена (из-за абстрактного метода внутри нее) и, следовательно, не может создать объект для класса.
- Несмотря на то, что класс не содержит никакого абстрактного метода, мы все равно можем объявить класс абстрактным. Класс HttpServlet является абстрактным, но не содержит абстрактных методов.
Некоторые ключевые выводы из абстрактного класса:
- Это не может быть создано.
- Он может иметь как абстрактные, так и неабстрактные методы.
- Он может иметь конструкторы, статические и окончательные методы.
- Подклассы могут расширять только один абстрактный класс за раз (используйте интерфейсы, чтобы преодолеть это)
- Если класс расширяет абстрактный класс, то мы обязательно должны предоставить реализацию для каждого абстрактного метода родительского класса. Если мы этого не сделаем, нам нужно объявить дочерний класс абстрактным и передать бремя реализации его дочерним классам.
Примечание. Интерфейсы не могут иметь конструкторов, в отличие от абстрактного класса. Почему?
Я объясню эту деталь в статье об интерфейсе, а пока предположим, что интерфейс — это полная абстракция класса.
Но зачем классу Abstract есть конструктор, если мы не можем создать экземпляр объекта?
- Абстрактные классы имеют
constructors
, и эти конструкторы всегда вызываются при создании экземпляра конкретного подкласса. Мы знаем, что когда мы собираемся создать экземпляр класса, мы всегда используем конструктор этого класса. Теперь каждый конструктор вызывает конструктор своего суперкласса с неявным вызовомsuper()
. - Мы знаем, что конструкторы также используются для инициализации полей класса. Мы также знаем, что абстрактные классы могут содержать поля, и иногда их нужно как-то инициализировать с помощью конструктора.
Почему абстрактный класс может содержать метод final, если final и abstract являются недопустимыми комбинациями?
Примечание. Класс Final не может содержать абстрактные методы, тогда как абстрактный класс может содержать метод final.
"недопустимая комбинация модификаторов: abstract и final" возникает, когда мы пытаемся передать оба модификатора классу или методу. Здесь внутри абстрактного класса у нас может быть конечный метод. Окончательный метод внутри абстрактного класса или любого класса в этом отношении совершенно прекрасен, пока окончательный метод не является абстрактным.
В другом случае мы обязаны сделать класс абстрактным, если он содержит абстрактный метод, который приводит к «недопустимой комбинации модификаторов» для конечного класса.
Хлопайте и делитесь 😁. Вы можете связаться со мной в LinkedIn, Twitter и Instagram.