JavaRush /Blog Java /Random-PL /10 abstrakcyjnych klas i interfejsów, pytania do wywiadu ...

10 abstrakcyjnych klas i interfejsów, pytania do wywiadu w języku Java

Opublikowano w grupie Random-PL
Klasy abstrakcyjne i interfejsy są bardzo popularne we wszystkich obiektowych językach programowania. I prawie w każdej rozmowie kwalifikacyjnej w języku Java spotykasz się z przynajmniej jednym pytaniem na ten temat. Interfejsy są wymieniane częściej ze względu na ich popularność wśród projektantów oprogramowania, ale od czasu do czasu pojawiają się także pytania dotyczące klas abstrakcyjnych. O te ostatnie najczęściej pytają osoby ubiegające się o stanowisko młodszych programistów, np. z nie więcej niż dwuletnim doświadczeniem w programowaniu w Javie, natomiast pytania o interfejsy najczęściej pojawiają się podczas rozmów kwalifikacyjnych z osobami, których doświadczenie przekroczyło już cztery lata. Zazwyczaj są one zadawane w połączeniu z innymi pytaniami dotyczącymi wzorców projektowych w języku Java, takimi jak wzorce Dekorator lub Fabryka. 10 abstrakcyjnych klas i interfejsów Pytania do wywiadu w języku Java — 1W tym artykule przyjrzymy się częstym pytaniom dotyczącym klas abstrakcyjnych i interfejsów, które zadawane są na różnych poziomach rozmów w języku Java. Większość z nich nie powinna sprawić trudności nawet początkującemu programiście Java. Są to głównie pytania czysto merytoryczne, ale niektóre z nich, takie jak różnice między klasami abstrakcyjnymi a interfejsami w Javie lub kiedy wybrać klasę abstrakcyjną zamiast interfejsu , mogą być dość trudne. Oferujemy kilkanaście ciekawych pytań na ten temat.
Jeśli kiedykolwiek podczas rozmowy kwalifikacyjnej zadano Ci pytanie lub musiałeś zadać jakieś wartościowe pytanie dotyczące klas abstrakcyjnych i interfejsów, ale nie ma go na tej liście, podziel się nim w komentarzach.

1. Czy klasa abstrakcyjna może mieć konstruktory w Javie?

Tak, w klasie abstrakcyjnej w Javie możesz deklarować i definiować konstruktory. Ponieważ nie ma możliwości tworzenia instancji klas abstrakcyjnych, taki konstruktor można wywołać jedynie podczas tworzenia łańcucha konstruktorów, czyli podczas tworzenia instancji określonej klasy implementacyjnej. Ale wyobraź sobie, że osoba przeprowadzająca wywiad zadaje następnie pytanie: jaki jest sens istnienia konstruktora, jeśli i tak nie można utworzyć instancji klasy abstrakcyjnej? Chodzi o to, że nadal można go używać do ustawiania początkowych wartości wspólnych zmiennych zadeklarowanych w klasie abstrakcyjnej i wykorzystywanych przez różne implementacje. Nawet jeśli nie zadeklarujesz żadnego konstruktora, kompilator doda domyślny konstruktor bez argumentów do klasy abstrakcyjnej. Bez tego podklasa nie zostanie skompilowana, ponieważ pierwsza instrukcja dowolnego konstruktora jest niejawnym wywołaniem super()domyślnego konstruktora nadklasy w Javie.

2. Czy klasy abstrakcyjne w Javie mogą implementować interfejsy? Czy muszą wdrożyć wszystkie metody?

Tak, klasy abstrakcyjne mogą implementować interfejsy przy użyciu metody implements. Ponieważ są one abstrakcyjne, nie są wymagane do implementacji wszystkich metod. Zalecaną praktyką jest posiadanie abstrakcyjnej klasy bazowej i interfejsu służącego do deklarowania typu. Przykładem jest interfejs java.util.Listi odpowiadająca mu klasa abstrakcyjna java.util.AbstractList. Ponieważ AbstractListimplementuje wszystkie popularne metody, określone implementacje (takie jak LinkedListi ArrayList) nie muszą implementować wszystkich metod, jak miałoby to miejsce, gdyby Listbezpośrednio implementowały interfejs. To rozwiązanie łączy w sobie zaletę korzystania z interfejsu do deklarowania typu z elastycznością klasy abstrakcyjnej umożliwiającej implementację wszystkich typowych zachowań w jednym miejscu. W książce Joshuy Blocha „Java. Efektywne programowanie” zawiera doskonały rozdział poświęcony tematyce wykorzystania interfejsów i klas abstrakcyjnych w Javie, dla lepszego zrozumienia warto go przestudiować.

3. Czy klasa abstrakcyjna może być ostateczna?

Nie on nie może. Słowo kluczowe finaloznacza, że ​​klasa znajduje się na szczycie hierarchii i nie może mieć potomków. A klasa abstrakcyjna bez spadkobierców jest kulistym koniem w próżni, ponieważ nie da się stworzyć instancji abstract class. Zatem, jeśli klasa jest jednocześnie abstracti final, to nie ma ona elementów potomnych i nie można jej utworzyć. Kompilator Java zgłosi błąd, jeśli utworzysz klasę abstracti final.

4. Czy klasa abstrakcyjna w Javie może mieć metody statyczne?

Tak, klasy abstrakcyjne mogą deklarować i definiować metody statyczne. Konieczne jest jedynie przestrzeganie ogólnych zasad tworzenia metod statycznych w Javie, ponieważ są one niepożądane w projektowaniu obiektowym, ponieważ przesłanianie metod statycznych w Javie nie jest możliwe. Metody statyczne w klasie abstrakcyjnej są bardzo rzadkie, ale jeśli istnieją ku temu dobre powody, nic nie stoi na przeszkodzie, aby z nich skorzystać.

5. Czy możliwe jest utworzenie instancji klasy abstrakcyjnej?

Nie, nie możesz tego zrobić. Istotą klasy abstrakcyjnej jest to, że nie jest ona kompletna i musi zostać uzupełniona w klasach potomnych. Oznacza to, że ta klasa nie jest gotowa do użycia. Może na przykład brakować implementacji niektórych metod. Ponieważ klasa nie jest gotowa do użycia, nie można utworzyć jej obiektu. Można jednak utworzyć instancje dziedziców klasy abstrakcyjnej. Kompilator Java zgłosi błąd, jeśli program spróbuje utworzyć instancję klasy abstrakcyjnej.

6. Czy klasa abstrakcyjna musi mieć metody abstrakcyjne?

Nie, klasa abstrakcyjna nie może mieć żadnych metod abstrakcyjnych. Możesz utworzyć abstrakcję klasy w Javie, po prostu używając słowa kluczowego abstractw jej deklaracji. Kompilator wymusi wszelkie ograniczenia strukturalne, takie jak zakaz tworzenia instancji tej klasy. Nawiasem mówiąc, kwestia, czy w klasie abstrakcyjnej lub interfejsie powinny znajdować się metody abstrakcyjne, jest kontrowersyjna. Wydaje mi się, że klasa abstrakcyjna powinna mieć metody abstrakcyjne, ponieważ jest to pierwsza rzecz, o której programista myśli, widząc klasę abstrakcyjną. To dobrze wpisuje się w zasadę minimalizacji niespodzianek.

7. Jakie są różnice pomiędzy klasą abstrakcyjną a interfejsem w Javie?

To najważniejsze i jedno z najbardziej klasycznych pytań na rozmowie kwalifikacyjnej w języku Java. Nie zliczę, ile razy widziałem to pytanie podczas rozmów kwalifikacyjnych w języku Java na wszystkich poziomach. To pytanie czyni to pytanie interesującym w szczególności ze względu na możliwość przedstawienia przykładu przez wnioskodawcę. Udzielenie odpowiedzi na pytania dotyczące podstaw programowania obiektowego, takich jak abstrakcja, enkapsulacja, polimorfizm i dziedziczenie, jest łatwe, ale jeśli chodzi o tak subtelne niuanse, kandydaci do pracy często są zdezorientowani i mówią pierwszą rzecz, która przychodzi im na myśl. Odpowiedź na to pytanie zasługuje na osobny artykuł (zwłaszcza po zmianach w Javie 8), jednak w skrócie:
  • Interfejs opisuje jedynie zachowanie (metody) obiektu, ale nie posiada stanów (pól) (z wyjątkiem public static final), podczas gdy klasa abstrakcyjna może je posiadać.

  • Klasa abstrakcyjna jest dziedziczona (rozszerza), a interfejs jest implementowany (implementuje). Możemy dziedziczyć tylko jedną klasę, ale implementować dowolną liczbę interfejsów. Interfejs może rozszerzać (rozszerzać) inny interfejs/interfejsy.

  • Klasy abstrakcyjne są używane, gdy istnieje relacja „jest-a”, to znaczy podklasa rozszerza podstawową klasę abstrakcyjną, a interfejsy mogą być implementowane przez różne klasy, które w ogóle nie są ze sobą powiązane.

8. Kiedy ma sens preferowanie klasy abstrakcyjnej od interfejsu i odwrotnie?

Jest to kontynuacja poprzednich pytań dotyczących klas abstrakcyjnych i interfejsów. Jeśli wiesz, jakie są ich różnice składniowe, odpowiedź na to pytanie nie sprawi ci problemów, ponieważ są one czynnikiem decydującym przy podejmowaniu decyzji. Ponieważ dodanie nowej metody do opublikowanego interfejsu jest prawie niemożliwe, lepiej jest użyć klasy abstrakcyjnej w przypadku potencjalnej potrzeby dalszego rozwoju. Tworzenie klas abstrakcyjnych w Javie jest łatwiejsze niż tworzenie interfejsów. Podobnie, jeśli interfejs ma zbyt wiele metod i implementacja ich wszystkich staje się prawdziwym problemem, lepiej utworzyć klasę abstrakcyjną dla domyślnej implementacji. Ten wzorzec jest stosowany w pakiecie kolekcji Java, klasa abstrakcyjna AbstractListzapewnia domyślną implementację dla platformy List. Użyj klas abstrakcyjnych, jeśli:
  • Chcesz udostępnić kod pomiędzy kilkoma blisko powiązanymi klasami.

  • Można by oczekiwać, że klasy rozszerzające klasę abstrakcyjną będą miały wiele wspólnych metod lub pól albo będą wymagały modyfikatorów dostępu innych niż public(na przykład protectedi private).

  • Chcesz zadeklarować pola niestatyczne lub не-finalpola. Pozwala to na zdefiniowanie metod, które mogą uzyskać dostęp i zmienić stan obiektu, do którego należą.
Użyj interfejsów, jeśli:
  • Oczekujesz, że niepowiązane klasy zaimplementują Twój interfejs. Na przykład interfejsy Comparablei Cloneablesą implementowane przez wiele niepowiązanych klas.

  • Chcesz zdefiniować zachowanie określonego typu danych, ale nie obchodzi Cię, kto go implementuje.

  • Chcesz użyć dziedziczenia wielu typów.

9. Co to jest metoda abstrakcyjna w Javie?

Metoda abstrakcyjna to metoda bez ciała. Po prostu deklarujesz metodę bez jej definiowania, używając słowa kluczowego abstractw deklaracji metody. Wszystkie metody zadeklarowane wewnątrz interfejsu w języku Java są domyślnie abstrakcyjne. Oto przykład metody abstrakcyjnej w Javie:
public void abstract printVersion();
Teraz, aby zaimplementować tę metodę, musisz rozszerzyć klasę abstrakcyjną i zastąpić tę metodę.

10. Czy klasa abstrakcyjna w Javie może zawierać metodę main?

Tak, klasa abstrakcyjna w Javie może zawierać metodę main, ponieważ jest to po prostu kolejna metoda statyczna, a klasę abstrakcyjną można wykonać przy użyciu metody main, o ile nie utworzysz jej instancji. To wszystko, co chciałem ci powiedzieć. I pamiętaj: klasy abstrakcyjne i interfejsy to kluczowe decyzje projektowe w procesie analizy i projektowania zorientowanego obiektowo i należy je oczywiście stosować z należytą ostrożnością, jeśli chcesz stworzyć elastyczny system.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION