To ciekawe i ważne pytanie zostało zadane jednemu z moich czytelników podczas rozmowy telefonicznej na stanowisko programisty Java. Chociaż wiedział, że
w języku Java nie da się stworzyć klasy abstrakcyjnejfinal
, zmieszało go sformułowanie pytania. Odpowiedź jest prosta: nie,
final
w klasie - nie mogą znajdować się metody abstrakcyjne. Dlaczego? Ponieważ gdy tylko zadeklarujesz metodę abstrakcyjną w klasie języka Java, klasa ta automatycznie stanie się abstrakcyjna i
final
nie będzie można utworzyć klasy abstrakcyjnej w języku Java.
final
Oznacza to, że w klasie Java nie mogą znajdować się metody abstrakcyjne .
Wielu programistów Java jest zdezorientowanych, odpowiadając na to pytanie, ze względu na sformułowanie. Nawet jeśli zadający pytanie jest zaznajomiony z ogólną koncepcją, może nie zdawać sobie sprawy, że klasa po zadeklarowaniu w niej metody abstrakcyjnej staje się abstrakcyjna, a klasy abstrakcyjnej nie da się stworzyć w
final
Javie. Ten punkt oddziela to pytanie od bardziej powszechnego i często zadawanego pytania:
czy w Javie można zadeklarować, że klasa jest jednocześnie abstrakcyjna i ostateczna? Przyjrzyjmy się przykładowemu kodowi, aby wykazać, że
final
nie jest możliwe zadeklarowanie metody abstrakcyjnej w klasie -. Stwórzmy klasę o nazwie
Hello.java
, która posiada metodę abstrakcyjną .
public final
Hello
print()
public final class Hello {
public abstract void print();
}
Wpisz ten kod do IDE, otrzymasz następujący komunikat o błędzie, mówią, że
Hello
musi to być klasa abstrakcyjna, aby można było w niej zadeklarować metody abstrakcyjne.
To samo stanie się, jeśli wpiszesz ten kod w Notatniku i skompilujesz go za pomocą narzędzia javac z wiersza poleceń. Zgodnie ze specyfikacją Java, gdy tylko zadeklarujesz metodę abstrakcyjną w klasie, klasa ta stanie się klasą abstrakcyjną, a ponieważ nie możesz utworzyć klasy abstrakcyjnej
final
w Javie, kompilator wygeneruje błąd. Dotyczy to zarówno klas najwyższego poziomu, jak i klas zagnieżdżonych w języku Java. Nawet jeśli zadeklarujesz metodę abstrakcyjną w zagnieżdżonej
final
klasie, błąd będzie taki sam. Inne powiązane pytanie brzmi:
czy klasa abstrakcyjna w Javie może mieć metody statyczne? Odpowiedź: tak, mogą, nie ma problemu z zadeklarowaniem metody statycznej w klasie abstrakcyjnej, ponieważ aby użyć metody statycznej nie trzeba tworzyć instancji klasy, można je wywołać po prostu za pomocą nazwy klasy. Możemy zmodyfikować nasz przykład, aby uwzględnić w klasie
Hello
metodę
main()
, która w Javie jest statyczna, jak pokazano poniżej:
public abstract class Hello {
public abstract void print();
public static void main(String args[]) {
}
}
Jak widać, żaden błąd kompilacji nie jest zgłaszany. Ten kod kompiluje się bez problemów, ponieważ w Javie możesz całkowicie bezpiecznie zadeklarować metodę statyczną w klasie abstrakcyjnej.
Krótkie wnioski Niemożliwe jest zadeklarowanie metody abstrakcyjnej w klasie
final
-. Ponieważ gdy to zrobisz, klasa automatycznie stanie się abstrakcyjna, zgodnie ze specyfikacjami Java. A ponieważ
final
-klasa w Javie nie może być abstrakcyjna, jest to niedopuszczalne, a kompilator zabroni ci tego, zgłaszając błąd. Ale możesz deklarować metody statyczne zarówno w klasach końcowych, jak i abstrakcyjnych, nie ma z tym żadnych problemów.
GO TO FULL VERSION