CodeGym /Blog Java /Random-PL /Przeglądanie pytań i odpowiedzi z rozmowy kwalifikacyjnej...
John Squirrels
Poziom 41
San Francisco

Przeglądanie pytań i odpowiedzi z rozmowy kwalifikacyjnej na stanowisko programisty Java. Część 3

Opublikowano w grupie Random-PL
Cześć! Tak jak nie da się nauczyć latać samolotem bez specjalnego przeszkolenia, tak nie można zostać programistą Java bez spędzenia długich godzin na studiowaniu niezbędnych podstaw teoretycznych. I właśnie nad tym będziemy dzisiaj pracować: będziemy nadal badać pytania pojawiające się podczas rozmów kwalifikacyjnych dla programistów Java i oczywiście będziemy szukać odpowiedzi. Oto pierwsza i druga część tego przeglądu. Nie ma wątpliwości, że możesz zostać dobrym programistą Java bez tych wszystkich pytań. To powiedziawszy, jeśli dobrze rozumiesz wszystkie zawiłości Javy, z pewnością będziesz mieć przewagę i będziesz wyglądać bardziej atrakcyjnie w oczach przyszłego pracodawcy. Przeglądanie pytań i odpowiedzi z rozmowy kwalifikacyjnej na stanowisko programisty Java.  Część 3 - 1

20. Jakie elementy języka umożliwiają enkapsulację?

Przypomnijmy, że enkapsulacja polega na ukryciu szczegółów implementacji klasy. Innymi słowy, gdy używana jest nasza klasa, jej wnętrzności i wewnętrzna logika nie są oczywiste dla osób z zewnątrz. A jakie elementy języka za to odpowiadają? Modyfikatory dostępu , oczywiście! Wszystko, co musimy ukryć, zaznaczamy prywatnym modyfikatorem. Na przykład prywatne pola klasy lub niektóre metody wewnętrzne, które pomagają zaimplementować pewne wewnętrzne funkcje. Do wszystkiego, do czego chcemy zapewnić dostęp zewnętrzny, dodajemy modyfikator dostępu publicznego . Na przykład metoda implementująca pewną funkcjonalność (która może wewnętrznie wykorzystywać wiele metod prywatnych) lub, oczywiście, metody pobierające i ustawiające umożliwiające dostęp do prywatnych pól klasy. Nie wspomnieliśmy jeszcze o modyfikatorach domyślnych i chronionych , których można używać bardziej elastycznie i konkretnie dostosowywać dostęp do niektórych części klas.

21. Jakie elementy języka umożliwiają dziedziczenie?

Dziedziczenie to mechanizm pozwalający na tworzenie klas w oparciu o inną klasę. Java ma do tego słowo kluczowe Extends . Załóżmy na przykład, że mamy klasę Cat i chcemy utworzyć klasę podrzędną Lion . W kodzie będzie to wyglądać mniej więcej tak:
public class Lion extends Cat
A to oznacza, że ​​klasa Lion dziedziczy wszystkie metody i zmienne klasy Cat , za wyjątkiem zmiennych statycznych. Kolejnym elementem języka odpowiedzialnym za dziedziczenie jest super . Jest to odniesienie podobne do tego . Słowo kluczowe this odnosi się do obiektu, w którym się odwołuje. Super słowo kluczowe odnosi się do rodzica bieżącego obiektu. Zwykle używa się super :
  1. Aby wywołać konstruktora nadklasy. Na przykład klasa Cat ma wewnętrzną zmienną nazwy , którą należy zainicjować w konstruktorze. W konstruktorze klasy Lion będzie to wyglądać następująco:

    public Lion(final String name) {
       super(name);
    }

  2. Odwoływanie się do pól i metod elementu nadrzędnego. Przykładowo w klasie Kot mamy zainicjowane pole wieku :

    public class Cat {
       int age = 10;

Ale mamy to samo zainicjowane pole w Lion :
public class Lion extends Cat {
   int age = 15;
A jeśli w obiekcie Lion chcemy odwołać się do zmiennej wieku obiektu nadrzędnego, musimy to zrobić za pomocą super :
super.name

22. Jakie elementy języka odpowiadają za polimorfizm?

Polimorfizm to zdolność obiektu z jedną sygnaturą do przybierania wielu form (wiele implementacji). Przeglądanie pytań i odpowiedzi z rozmowy kwalifikacyjnej na stanowisko programisty Java.  Część 3 - 2Możemy śmiało stwierdzić, że za polimorfizm odpowiedzialne są słowa kluczowe Java implements i Extends . Kiedy mamy interfejs, implements pozwala nam zapewnić jedną możliwą implementację, ale nie musi to być jedyna implementacja, prawda? Przyjrzyjmy się jeszcze raz, jak wygląda używanie narzędzi :
public class Cat implements Animal
Następnie w klasie Cat musimy zaimplementować wszystkie metody abstrakcyjne w interfejsie Animal . Dziedziczenie również: w klasie potomnej możemy zastąpić istniejącą implementację metody. Oznacza to, że w przypadku wielu klas podrzędnych możemy mieć kilka różnych przesłonięć tej samej metody. Lub nadklasa może być abstrakcyjna i mieć określoną metodę, która musi zostać zaimplementowana w specjalny sposób w każdej ze swoich klas potomnych. Innymi słowy, ta metoda będzie miała wiele różnych implementacji. Adnotacja @Override również może nam w tym pomóc. Jest on umieszczony nad zaimplementowanymi metodami i wskazuje, że chcemy zaimplementować lub zastąpić (jeśli implementacja już istnieje w nadklasie) konkretną metodę nadklasy lub interfejsu. Jest to opcjonalne i pomaga łatwiej wykryć błędy. Używasz tej adnotacji, aby poinformować kompilator, że chcesz zastąpić/zaimplementować metodę nadklasy/interfejsu. Kompilator upewni się wtedy, że nie popełniłeś błędów w sygnaturze metody.

23. Co to jest SOLIDNE? Podaj przykłady

SOLID to akronim pięciu podstawowych zasad projektowania OOP Roberta Martina. S (Zasada pojedynczej odpowiedzialności) : stwierdza, że ​​klasa powinna mieć tylko jeden cel/odpowiedzialność. Innymi słowy, nie powinieneś tworzyć klas, które robią wszystko. Jeśli to zrobisz, możesz odtworzyć antywzorzec „Boskiego Obiektu”. Jeśli masz obiekt Cat , powinien on zawierać metody służące wyłącznie do interakcji z jego wewnętrzną funkcjonalnością, ale nie powinien zawierać żadnej logiki biznesowej niezwiązanej z tą instancją. Na przykład jakiś mechanizm przechowywania obiektów tego typu. Funkcjonalność tę (zewnętrzną w stosunku do encji Cat ) należy przenieść do innych klas lub usług, których zadaniem jest zapewnienie logiki biznesowej dla odpowiednich obiektów. O (Zasada otwarta-zamknięta) : Zasada ta jest opisana w następujący sposób: jednostki oprogramowania (klasy, moduły, funkcje itp.) powinny być otwarte na rozbudowę, ale zamknięte na modyfikację. Załóżmy na przykład, że potrzebujemy funkcjonalności podobnej do funkcjonalności naszej istniejącej klasy Cat , ale nieco różniącej się od niej . Zamiast zmieniać funkcjonalność klasy Cat i tym samym łamać kod wszędzie tam, gdzie jest już używany, możemy zastosować dziedziczenie lub kompozycję . W ten sposób osiągamy nasz cel, jakim jest modyfikacja funkcjonalności klasy Cat , i robimy to bez zmiany samej klasy i bez psucia czegokolwiek. L (Zasada podstawienia Liskowa) : jest to zasada podstawienia Barbary Liskov. Zasada mówi, że funkcja przyjmująca typ podstawowy powinna móc używać podtypów tego typu podstawowego, nie wiedząc, co się dzieje. Na przykład naszą klasę Cat należy zastąpić dowolnym jej potomkiem, powiedzmy Lionem , bez zasadniczej zmiany jej zachowania. Ogólna logika (zachowanie) pozostaje taka sama, ale zmieniają się szczegóły implementacji określonych funkcjonalności. I (Zasada segregacji interfejsów) : zasada ta stwierdza, że ​​lepiej mieć wiele wyspecjalizowanych (wąsko ukierunkowanych) interfejsów niż jeden uniwersalny. Załóżmy na przykład, że programista implementuje jakiś interfejs. Potrzebują tylko jednej z jej metod, ale interfejs ma dziewięć dodatkowych metod, które nie są związane z logiką wymaganej metody. W takim przypadku programista będzie musiał wdrożyć dziesięć metod interfejsu, z których dziewięć jest dla nich zbędnych! Zamiast tego lepiej stworzyć dziesięć różnych interfejsów, które można wdrożyć w razie potrzeby. Cóż, jeśli nie dziesięć, to kilka, każda z metodami ściśle powiązanymi z jednym celem interfejsu. D (Zasada inwersji zależności): Zasada mówi, że moduły wyższego poziomu nie powinny zależeć od modułów niższego poziomu. Zasada ta stwierdza również: „Abstrakcja nie powinna zależeć od szczegółów. Szczegóły powinny zależeć od abstrakcji”. Musimy zbudować naszą logikę, odwołując się do interfejsów i przekazując konkretne obiekty klas, które implementują wymagany interfejs. Załóżmy na przykład, że mamy interfejs Cat i pewne implementacje, powiedzmy Lion i HouseCat . Budujemy naszą logikę specjalnie do interakcji z interfejsem Cat . Dopiero wtedy zastępujemy interfejs konkretną implementacją ( Lion lub HouseCat ), ale nie odwrotnie.

24. Co to jest klasa, obiekt i interfejs?

Przypomnijmy, że Java jest językiem OOP. Oznacza to, że programy Java są budowane w oparciu o interakcje między obiektami. Program jest jak mrowisko, w którym każda mrówka jest obiektem. Przeglądanie pytań i odpowiedzi z rozmowy kwalifikacyjnej na stanowisko programisty Java.  Część 3 - 3Obiekty to zbiory danych zawierające różne metody (funkcje) umożliwiające interakcję z danymi wewnętrznymi. Klasy to instrukcje lub szablony służące do tworzenia obiektów. Oznacza to, że możemy mieć wiele obiektów zbudowanych według tych samych instrukcji, ale wypełnionych różnymi (lub tymi samymi) danymi. Biorąc przykład z życia codziennego, możemy powiedzieć, że klasa to projekt budynku, a obiekt to budynek zbudowany specjalnie według tego projektu. Interfejsy są podobne do klas, ale nie możemy ich używać do tworzenia obiektów. Ich celem jest dodanie abstrakcji do Javy. Dokładniej, dodają elastyczności relacji między klasami i obiektami. Przez elastyczność rozumiemy opisany wcześniej polimorfizm i abstrakcję, która stwarza wiele możliwości budowania wewnętrznej architektury aplikacji.

25. Co to jest klasa POJO? Podaj przykład takiej klasy

Przeglądanie pytań i odpowiedzi z rozmowy kwalifikacyjnej na stanowisko programisty Java.  Część 3 - 4POJO (Plain Old Java Object) to prosty obiekt klasy, który nie dziedziczy po żadnej konkretnej klasie i nie implementuje żadnych interfejsów usług poza tymi, które są potrzebne w modelu biznesowym. Innymi słowy, klasa POJO to po prostu klasa bez specjalnych wymagań. Jedynym wymaganiem jest brak różnych bajerów związanych z określonymi ramami. Z reguły klasy te nie dziedziczą innych klas (z wyjątkiem klas POJO w tym samym pakiecie), nie implementują interfejsów (czasami robi się wyjątek dla interfejsów znaczników ze standardowej biblioteki takich jak Serializable czy Cloneable ), nie używają adnotacji i nie zależą od bibliotek stron trzecich. Zauważmy, że POJO może mieć metody zawierające logikę biznesową i dowolnego rodzaju konstruktory. Jeśli dopuścimy adnotacje nie zmieniające semantyki klasy (tj. adnotacje, których brak nie zmienia przeznaczenia ani logiki obiektu), to POJO mogą zawierać również encje JPA i obiekty DTO deserializowane z XML lub JSON , których reguły są określone w adnotacjach. Kolejną rzeczą, o której należy pamiętać w odniesieniu do klas POJO , jest to, że dobrze jest zastąpić ich metody równości i hashCode , ponieważ może to pomóc im lepiej spełniać swoją rolę. Przykład klasy POJO :
public class User {
   private Long id;
   private String firstName;
   private String lastName;
   private Long age;

   public User(final Long id, final String firstName, final String lastName, final long age) {
       this.id = id;
       this.firstName = firstName;
       this.lastName = lastName;
       this.age = age;
   }

   public Long getId() {
       return this.id;
   }

   public String getFirstName() {
       return this.firstName;
   }

   public String getLastName() {
       return this.lastName;
   }

   public Long getAge() {
       return this.age;
   }

   @Override
   public boolean equals(final Object o) {
       if (this == o) return true;
       if (o == null || this.getClass() != o.getClass()) return false;
       final User user = (User) o;
       return Objects.equals(this.id, user.id) &&
               Objects.equals(this.firstName, user.firstName) &&
               Objects.equals(this.lastName, user.lastName) &&
               Objects.equals(this.age, user.age);
   }

   @Override
   public int hashCode() {
       return Objects.hash(this.id, this.firstName, this.lastName, this.age);
   }
}

26. Jakie elementy może zawierać klasa?

Klasa może zawierać następujące elementy:
  • pola instancji;
  • pola statyczne;
  • blok inicjujący;
  • statyczny blok inicjujący;
  • konstruktory (domyślnie zawsze deklarowany jest pusty konstruktor);
  • metody;
  • metody statyczne;
  • różne adnotacje (które można zastosować do samej klasy lub jej części składowych);
  • leki generyczne ;
  • dziedziczenie innych klas ( ekstensje ) lub implementacje interfejsów ( implementy ).

27. Opowiedz nam o dziedziczeniu w Javie. Jaka jest specyfika super słowa kluczowego?

Powyżej mówiłem wcześniej o dziedziczeniu i słowie kluczowym super w Javie. Wspomnę jeszcze o kilku ważnych kwestiach:
  1. Możemy dziedziczyć tylko jedną klasę: Java nie ma w Javie wielokrotnego dziedziczenia. Wraz z pojawieniem się metod domyślnych w Javie 8 stwierdzenie to stanie się bardzo kontrowersyjne.
  2. Dziedziczone są także prywatne metody i pola. Po prostu nie można uzyskać do nich dostępu z klasy podrzędnej (ale jeśli na przykład mamy pole prywatne i publiczne lub chronione moduły pobierające i ustawiające, możemy ich użyć, aby uzyskać dostęp do pola).
  3. Klasy końcowe nie mogą być dziedziczone.
  4. metod final nie można zastąpić (ale można je dziedziczyć i przeciążać).
  5. metody i zmienne statyczne nie są dziedziczone (ponieważ są dołączone do klas, a nie obiektów).
  6. Podczas dziedziczenia klas abstrakcyjnych należy zaimplementować ich metody abstrakcyjne lub klasę potomną również należy zadeklarować jako abstrakcyjną.
  7. Jeśli w klasie nadrzędnej znajdują się konstruktory inne niż domyślne, należy je przesłonić w klasie potomnej (ale nad nimi nie jest napisane @Override ).
  8. Możesz rozszerzyć modyfikator dostępu na przesłonięte metody w klasie potomnej: private -> default -> protected -> public .
  9. Metody zastępowane w klasie podrzędnej mogą generować węższe wyjątki, na przykład: Wyjątek -> IOException -> FileNotFoundException.
Przeglądanie pytań i odpowiedzi z rozmowy kwalifikacyjnej na stanowisko programisty Java.  Część 3 - 5

28. Czym są sygnatury metod? Podaj przykłady poprawnych i błędnych podpisów

Sygnatura metody to nazwa metody oraz typy parametrów wejściowych (kolejność parametrów ma znaczenie). Sygnatura metody nie zawiera wartości zwracanej ani wyjątków zgłaszanych przez metodę. Przykład prawidłowego podpisu:
doSomething(int, double, double)
Przykład błędnego podpisu:
void doSomething(int firstArg, int secondArg) throws Exception
Sygnatura metody w połączeniu z typem zwracanym i listą zgłoszonych wyjątków nazywana jest kontraktem metody . To wszystko na dzisiaj! Do zobaczenia później!
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION