Це цікаве і важливе питання задали одному з моїх читачів під час телефонної співбесіди на посаду Java-розробника. Хоча він і знав, що зробити абстрактний клас
Багато Java-розробників плутаються при відповіді на це питання через формулювання. Навіть якщо людина, якій задали це питання, знайома із загальною концепцією, вона може не зрозуміти, що клас, після оголошення в ньому абстрактного методу, стає абстрактним, а зробити абстрактний клас
Те ж саме станеться, якщо ви введете цей код у блокноті та скомпілюєте його за допомогою утиліти javac із командного рядка. Згідно зі специфікаціями Java, як тільки ви оголошуєте всередині класу абстрактний метод, цей клас стає абстрактним класом, а оскільки зробити абстрактний клас
final
-ьним у мові Java неможливо, його збила з пантелику формулювання питання. Відповідь проста: ні, у final
-класі не може бути абстрактних методів. Чому? Бо як тільки ви оголошуєте абстрактний метод у класі мови Java, цей клас автоматично стає абстрактним, а зробити абстрактний клас final
’ьним у мові Java неможливо. Тому абстрактних методів у final
-класі Java бути не може.

final
у мові Java неможливо.
Цей момент відрізняє це питання від більш поширеного та часто задаваного питання: чи можна у Java оголосити клас одночасно абстрактним і фінальним?
Розглянемо один приклад коду, щоб продемонструвати, що у final
-класі неможливо оголосити абстрактний метод. Нехай у Hello.java
у нас є public final
клас під назвою Hello
, у якому є абстрактний метод print()
.
public final class Hello {
public abstract void print();
}
Наберіть цей код у IDE, ви отримаєте таке повідомлення про помилку, мовляв Hello
має бути абстрактним класом, щоб у ньому можна було оголошувати абстрактні методи.


final
у Java неможливо, компілятор згенерує помилку.
Це справедливо як для класів верхнього рівня, так і для вкладених класів у мові Java. Навіть якщо оголосити абстрактний метод у вкладеному final
-класі, помилка буде та ж сама.
Ще одне питання, що випливає звідси: чи можуть у абстрактного класу в мові Java бути статичні методи?
Відповідь: так, можуть, жодних проблем із оголошенням статичного методу у абстрактному класі немає, оскільки для використання статичного методу не потрібно створювати екземпляр класу, їх можна викликати просто за допомогою імені класу.
Можна модифікувати наш приклад, щоб включити до класу Hello
метод main()
, що є у мові Java статичним, як показано нижче:
public abstract class Hello {
public abstract void print();
public static void main(String args[]) {
// якийсь код
}
}
Як ви бачите, жодної помилки під час компіляції не видається. Цей код компілюється без проблем, оскільки у Java можна спокійно оголошувати статичний метод у абстрактному класі.
Короткі висновки
У final
-класі неможливо оголосити абстрактний метод. Тому що як тільки ви це зробите, клас автоматично стає абстрактним, згідно зі специфікаціями Java. А оскільки final
-клас в Java не може бути абстрактним, це недопустимо, і компілятор заборонить вам таку дію, видавши помилку. Але оголошувати статичні методи можна як у final, так і у абстрактних класах, жодних проблем із цим немає.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ