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