JavaRush /Java блог /Random UA /Питання-відповідь: чи можна у final-класі визначити абстр...

Питання-відповідь: чи можна у final-класі визначити абстрактні методи?

Стаття з групи Random UA
Це цікаве і важливе питання поставабо одному з моїх читачів під час телефонної співбесіди на посаду Java-розробника. Хоча він і знав, що робити абстрактний клас final-ьним в мові Java не можна , його збентежило формулювання питання. Відповідь проста: ні, в final-класі не може бути абстрактних методів. Чому? А тому, що як тільки ви оголошуєте абстрактний метод у класі мови Java, цей клас автоматично стає абстрактним, а зробити абстрактний клас ' finalьним у мові Java не можна. Значить, абстрактних методів у finalкласі Java бути не може.
Питання-відповідь: чи можна у final-класі визначити абстрактні методи?  - 1
Багато Java-розробників плутаються при відповіді це питання через формулювання. Навіть якщо людина, якій поставабо питання, знайомий із загальною концепцією, вона може не збагнути, що клас після оголошення в ньому абстрактного методу стає абстрактним, а зробити абстрактний клас finalу мові Java не можна. Цей момент відокремлює це питання від більш поширеного питання, що часто задається: чи можна в Java оголосити клас абстрактним і фінальним одночасно? Розглянемо один приклад коду, щоб продемонструвати, що у final-класі неможливо оголосити абстрактний метод. Нехай у Hello.javaнас є public finalклас під назвою Hello, в якому є абстрактний метод print().
public final class Hello {
  public abstract void print();
}
Наберіть цей код в IDE, ви отримаєте таке повідомлення про помилку, мовляв, Helloмає бути абстрактним класом, щоб у ньому можна було оголошувати абстрактні методи.
Питання-відповідь: чи можна у final-класі визначити абстрактні методи?  - 2
Питання-відповідь: чи можна у final-класі визначити абстрактні методи?  - 3
Те саме відбудеться, якщо ви введете цей код у блокноті і скомпілюєте його за допомогою утиліти javac з командного рядка. Відповідно до специфікацій Java, як тільки ви оголошуєте всередині класу абстрактний метод, цей клас стає абстрактним класом, а якщо зробити абстрактний клас 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, так і в абстрактних класах, жодних проблем із цим немає.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ