JavaRush /Blog Java /Random-PL /Pytanie i odpowiedź: Czy możliwe jest zdefiniowanie metod...

Pytanie i odpowiedź: Czy możliwe jest zdefiniowanie metod abstrakcyjnych w końcowej klasie?

Opublikowano w grupie Random-PL
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, finalw 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 finalnie będzie można utworzyć klasy abstrakcyjnej w języku Java. finalOznacza to, że w klasie Java nie mogą znajdować się metody abstrakcyjne .
Pytanie i odpowiedź: Czy możliwe jest zdefiniowanie metod abstrakcyjnych w końcowej klasie?  - 1
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 finalJavie. 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 finalnie jest możliwe zadeklarowanie metody abstrakcyjnej w klasie -. Stwórzmy klasę o nazwie Hello.java, która posiada metodę abstrakcyjną . public finalHelloprint()
public final class Hello {
  public abstract void print();
}
Wpisz ten kod do IDE, otrzymasz następujący komunikat o błędzie, mówią, że Hellomusi to być klasa abstrakcyjna, aby można było w niej zadeklarować metody abstrakcyjne.
Pytanie i odpowiedź: Czy możliwe jest zdefiniowanie metod abstrakcyjnych w końcowej klasie?  - 2
Pytanie i odpowiedź: Czy możliwe jest zdefiniowanie metod abstrakcyjnych w końcowej klasie?  - 3
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 finalw 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 finalklasie, 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 Hellometodę 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ой-то kod
  }
}
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.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION