Можно ли заменить "переопределить абстрактные методы" на "реализовать абстрактные методы" в наследовании Java?
В наследовании Java можно ли взаимозаменяемо использовать выражение "переопределение абстрактного метода" с выражением "реализация абстрактного метода"?
В книге "OCA Java SE 8 Programmer I Study Guide", глава 5, стр. 296, вопрос № 15 я встретил следующий вопрос:
Q: Что из следующего верно в отношении конкретного подкласса? (Выберите все подходящие варианты)
- A. Конкретный подкласс может быть объявлен как абстрактный.
- Б. Конкретный подкласс должен реализовывать все унаследованные абстрактные методы.
- C. Конкретный подкласс должен реализовывать все методы, определенные в унаследованном интерфейсе.
- D. Конкретный подкласс не может быть помечен как окончательный.
- E. Абстрактные методы не могут быть переопределены конкретным подклассом.
Мой ответ был B & E. Но в книге сказано, что правильный ответ - только B. Мой вопрос касается именно варианта E. В книге сказано, что вариант E неверен, потому что абстрактные методы должны быть переопределены конкретным подклассом. Первоначально я думал, что абстрактные методы должны быть реализованы до того, как они будут переопределены подклассом. Так почему же опция неверна?
2 ответа
Позвольте мне объяснить каждый пункт по одному.
A. Конкретный подкласс может быть объявлен как абстрактный.
Ответ: неверно.
По определению, конкретные классы - это те, которые can be instantiated
и этот класс can also extends
базовый абстрактный класс.
Б. Конкретный подкласс должен реализовывать все унаследованные абстрактные методы.
Ответ: правильно
Если методы помечены как abstracts
в базовом классе дочерний класс, расширяющий базовый класс, должен убедиться, что все абстрактные методы реализованы. You will otherwise get a compile time error
,
C. Конкретный подкласс должен реализовывать все методы, определенные в унаследованном интерфейсе.
Ответ: неверно
это только тот случай, когда конкретный подкласс имеет directly implemented the interface by this class itself
,
Но в этом случае базовый класс может реализовывать унаследованный интерфейс.Hence, для конкретного подкласса не обязательно реализовывать все методы, присутствующие в базовом классе, в результате наследования от интерфейса.
D. Конкретный подкласс не может быть помечен как окончательный.
Ответ: неверно
Если подкласс помечен как окончательный, то этот класс больше не может быть расширен другими доступными подклассами. Маркировка класса с final
Ключевое слово особенно используется для достижения неизменности.
С помощью неизменяемых классов мы можем вызывать методы доступа (например, методы-получатели), копировать объекты или передавать объекты - но ни один метод не должен позволять изменять состояние объекта. Примеры: String, классы-оболочки, такие как Float, Integer.etc.
E. Абстрактные методы не могут быть переопределены конкретным подклассом.
Ответ: неверно
По определению, абстрактные методы - это методы, которые только объявлены, но не содержат тела или реализации. И поскольку мы не можем создать экземпляр абстрактного класса, мы можем создавать подклассы для реализации этих определенных абстрактных методов.Hence abstract methods are not optional but mandatorily be overridden by a inheriting subclass
,
Абстрактный метод - это метод, который объявлен, но не содержит реализации.
- вы можете переопределить как абстрактные, так и обычные методы внутри абстрактного класса.
- только методы, объявленные как
final
не может быть отменено