JavaRush /Blog Java /Random-PL /Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla ...

Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java. Część 5

Opublikowano w grupie Random-PL
Cześć cześć! Obecnie programiści Java są bardzo poszukiwani. Oczywiście nie mogę zapewnić Ci wakatu, ale postaram się pomóc Ci zdobyć nową wiedzę i uzupełnić pewne luki. Dlatego nadal analizujemy ponad 250 pytań do rozmowy kwalifikacyjnej dla programisty Java. Linki do poprzednich części analizy znajdują się na końcu artykułu.Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 5 - 1

39. Czym są modyfikatory dostępu w Javie? Nazwij je. Do czego są używane?

Modyfikatory dostępu opisałem wcześniej w pytaniu o elementy enkapsulacji Java. Ale i tak ci przypomnę. Modyfikatory dostępu w Javie to słowa kluczowe opisujące poziom dostępu przyznanego konkretnemu komponentowi Java. Modyfikatorami dostępu mogą być:
  • public - element z tym modyfikatorem będzie publicznie dostępny. Te. pola i metody, klasy zadeklarowane z modyfikatorem public są widoczne dla innych klas zarówno z bieżącego pakietu, jak i z pakietów zewnętrznych;
  • chroniony - element z tym modyfikatorem będzie dostępny z dowolnego miejsca w bieżącej klasie bieżącego pakietu lub w klasach potomnych, nawet jeśli znajdują się one w innych pakietach;
  • default lub brakujący modyfikator — ten modyfikator jest używany niejawnie, gdy w ogóle nie określono modyfikatora dostępu. Jest podobny do poprzedniego, z tą różnicą, że widoczność jest dozwolona w klasach potomnych znajdujących się w innych pakietach;
  • private jest najbardziej prywatnym ze wszystkich modyfikatorów, umożliwiającym dostęp do elementu tylko w ramach bieżącej klasy.
Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 5 - 2

40. Wymień główną cechę metod statycznych i zmiennych

Bardzo dziwne sformułowanie - „metody zmienne”. Z pewnością dotyczy to metod zwykłych, niestatycznych. Zatem główna różnica polega na tym, że metody statyczne należą do tej klasy i tak naprawdę w przypadku nich nie trzeba tworzyć instancji tej klasy: można ją wywołać jedynie przy użyciu typu klasy. Na przykład mamy statyczną metodę głaskania kota:
public class CatService {
   public static void petTheCat(Cat cat) {
       System.out.println("Погладить кота - " + cat.getName());
   }
Nie potrzebujemy instancji klasy CatService , aby ją wywołać :
Cat cat = new Cat(7, "Bobi");
CatService.petTheCat(cat);
Chociaż zwykłe metody są powiązane z obiektem (należą do) i aby je wywołać, musisz mieć instancję (obiekt), na której zostanie wywołana metoda. Na przykład kot ma metodę niestatyczną - miauczenie:
class Cat {
   public void mew() {
       System.out.println("Meow! Meow! Meow!");
   }
Aby wywołać tę metodę, potrzebujemy konkretnej instancji kota:
Cat cat = new Cat(7, "Bobi");
cat.mew();

41. Jakie są główne ograniczenia dotyczące metod statycznych i „zmiennych”?

Jak powiedziałem wcześniej, głównym ograniczeniem zwykłej metody jest to, że zawsze musi istnieć jakaś instancja, w której metoda zostanie wywołana. Jednak metoda statyczna tego nie wymaga, ale nie może odwoływać się do odniesienia this - do elementów bieżącego obiektu - ponieważ bieżący obiekt dla niego nie istnieje.

42. Co oznacza słowo kluczowe static? Czy metodę statyczną można zastąpić lub przeciążyć?

Element wyznaczony słowem kluczowym static nie należy do obiektu klasy, ale raczej do klasy i jest ładowany wraz z ładowaniem samej klasy. Elementy statyczne są jedynymi dla całego programu, a elementy zwykłe są jedynymi dla konkretnego obiektu. Statyczne mogą być:
  • pola klas;
  • blok inicjujący klasę;
  • metoda klasowa;
  • wewnętrzne klasy klasy (jednak jest to nadal tautologia).
Metody statycznej nie można przesłonić: należy ona do klasy i nie jest dziedziczona, ale jednocześnie może zostać przeciążona.

43. Czy metoda może być jednocześnie statyczna i abstrakcyjna?

Wspominałem już o tym w poprzednim artykule: metoda nie może być jednocześnie abstrakcyjna i statyczna. Abstrakcyjność metody oznacza, że ​​należy ją zastąpić w następniku. Jednocześnie metoda statyczna należy do klasy i nie można jej zastąpić: spowoduje to sprzeczność, którą kompilator zobaczy i zacznie przeklinać. Jeśli masz taką sytuację, powinieneś poważnie zastanowić się nad poprawnością architektury swojej aplikacji (w końcu ewidentnie jest z nią coś nie tak).Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 5 - 3

44. Czy można używać metod statycznych pomiędzy zwykłymi? Nawzajem? Dlaczego?

Metody statyczne można stosować w zwykłych, ponieważ nic nie stoi na przeszkodzie. Jednocześnie niemożliwa jest sytuacja odwrotna: metoda statyczna nie może używać zwykłej metody bez odniesienia do konkretnej instancji tej klasy. I jak pamiętamy, odwołanie this nie jest dostępne dla członków klasy statycznej: konkretnych obiektów klasy może być tyle, ile chcesz, a każdy z nich będzie miał w sobie odniesienie do siebie - this . A jak w takim razie rozumiesz, z którego konkretnego linku musisz skorzystać? Ale nie ma mowy. Dlatego elementy statyczne nie mogą odnosić się do elementów niestatycznych, bez odniesienia do konkretnego obiektu. W rzeczywistości metoda statyczna może używać metody niestatycznej tylko wtedy, gdy zawiera odwołanie do określonego obiektu. Na przykład ten, który przyszedł jako argument:
public static void petTheCat(Cat cat) {
   System.out.println("Погладить кота - " + cat.getName());
}
Widzimy tutaj, że metoda statyczna petTheCat wywołuje normalną, niestatyczną metodę obiektu Cat - getName .

45. Co to jest interfejs? Czy może istnieć ostateczny interfejs?

Jak pamiętamy, w Javie nie ma dziedziczenia wielokrotnego. Interfejsy są dla niego czymś w rodzaju alternatywy. Interfejs wygląda jak bardzo uproszczona klasa. Definiują funkcjonalność bez konkretnej implementacji, która jest implementowana przez klasy, które implementują (implementują) te interfejsy. Przykład interfejsu:
public interface Animal {
    void voice();
}
Przykład implementacji interfejsu przez klasę:
class Cat implements Animal {

   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
}
Najważniejszą rzeczą, którą musisz wiedzieć o korzystaniu z interfejsów, jest:
  1. Metody interfejsu powinny zawierać wyłącznie nagłówek, bez określonej treści metody, tj. musi być abstrakcyjny (ale bez użycia słowa kluczowego streszczenie ) . Wyjątkiem są metody statyczne i domyślne, które wymagają treści metody.
  2. Klasa może implementować wiele interfejsów (jak mówiłem, jest to alternatywa dla wielokrotnego dziedziczenia), które są zapisywane oddzielone przecinkami: klasa Lion implementuje Animal, Wild .
  3. Interfejsy tworzone są za pomocą słowa kluczowego -interfejs .
  4. Podczas implementowania interfejsu przez klasę używane jest słowo kluczowe - implements .
  5. Klasa implementująca określony interfejs musi implementować wszystkie swoje metody abstrakcyjne lub musi zadeklarować się jako abstrakcyjna.
  6. Głównym celem stosowania interfejsów jest implementacja polimorfizmu (zdolności obiektów do przybierania wielu form).
  7. Z reguły modyfikatory dostępu dla metod nie są zapisywane w interfejsie: domyślnie są one publiczne i nie można określić innych modyfikatorów niż publiczne . Od wersji Java 9 można używać prywatnych modyfikatorów metod.
  8. Zmienne interfejsu są domyślnie statyczne i końcowe , innymi słowy stałymi: zawsze muszą być inicjowane bezpośrednio w interfejsie.
  9. Nie można utworzyć obiektu interfejsu.
Odpowiedź na pytanie, czy interfejsy mogą być ostateczne, oczywiście nie. Przecież sama istota interfejsów ma zostać zaimplementowana. A jak wszyscy dobrze pamiętamy, final na poziomie klasy sprawia, że ​​nie jest on dziedziczony, a w przypadku interfejsu niemożliwy do wdrożenia. Po co nam interfejs, którego nie da się wdrożyć i używać? Zgadza się – nie ma takiej potrzeby! I kompilator tak myśli)) Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 5 - 4Znaczenie pojawiło się dopiero wraz z wprowadzeniem metod statycznych w interfejsach z Javą 8, ale nie zmieniło to faktu, że interfejs nie może być ostateczny. O interfejsach mówiłem bardzo powierzchownie, bo... to szeroki temat. Więcej na ten temat przeczytasz w artykułach o interfejsach w Javie i różnicy pomiędzy klasami abstrakcyjnymi a interfejsami .

46. ​​​​Gdzie mogę zainicjować pola statyczne?

Pola statyczne można inicjować:
  • bezpośrednio po deklaracji, poprzez znak równości = ;
  • w statycznym bloku inicjującym;
  • w niestatycznym bloku inicjującym, ale musisz pamiętać, że za każdym razem, gdy tworzony jest obiekt, to pole zostanie nadpisane przez ten blok inicjujący;
  • w konstruktorze klasy. Za każdym razem, gdy wywoływany jest ten konstruktor (to znaczy, gdy za jego pomocą tworzony jest obiekt), pole to zostanie nadpisane;
  • w metodach statycznych;
  • w metodach niestatycznych;
  • w wewnętrznych klasach statycznych i niestatycznych, lokalnych i anonimowych.

47. Czym są zajęcia anonimowe?

Klasy anonimowe to klasy, które nie mają własnego typu. O czym ja mówię? Kiedy rozmawialiśmy o interfejsach, wspomniałem, że nie można utworzyć obiektu interfejsu: można utworzyć jedynie obiekt klasy, która implementuje interfejs. Co jeśli nie chcesz implementować interfejsu w klasie, ale nadal potrzebujesz obiektu typu interfejs? I najprawdopodobniej będzie to pojedynczy przypadek użycia tego obiektu. I nie musisz tworzyć pełnoprawnej klasy implementacyjnej. Jak to zrobisz? Prawidłowy! Poprzez anonimową klasę! Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 5 - 5Powiedzmy, że mamy interfejs Animal :
public final interface Animal {
   public void voice();
}
Jeśli chcemy utworzyć instancję tego interfejsu poprzez anonimową klasę:
Animal cat = new Animal() {
   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
};
I wtedy możesz bezpiecznie używać tego obiektu i jego zaimplementowanej metody - głosu . Oznacza to, że anonimowa klasa implementuje ten interfejs i wszystkie jego abstrakcyjne metody tu i teraz. W przeciwnym razie nie będziemy mogli utworzyć obiektu interfejsu/klasy abstrakcyjnej, ponieważ istnieją metody niezaimplementowane/abstrakcyjne. Jak wspomniałem, klasy anonimowe służą nie tylko do implementacji abstrakcyjnych metod interfejsu, ale także do implementacji abstrakcyjnych metod klasy abstrakcyjnej. Takie podejście sprawdza się w sytuacjach, gdy obiekt jest używany jednorazowo lub dana implementacja metod jest potrzebna tylko raz i nie ma potrzeby tworzenia osobnej klasy, która będzie implementować wymaganą klasę/interfejs abstrakcyjny. Ale zauważę również, że korzystanie z klas anonimowych jest rzadkim zjawiskiem w pracy: z reguły nadal preferowane są zwykłe klasy. Więcej o zajęciach anonimowych przeczytasz w tym artykule .

48. Czym są klasy prymitywne?

Dla mnie jest to bardzo dziwne pytanie i być może jest to pytanie-pułapka, ponieważ w Javie nie ma czegoś takiego jak klasy prymitywne: może z wyjątkiem koncepcji typów pierwotnych, którą już rozważaliśmy wcześniej. Jak pamiętamy, w Javie istnieje 8 typów pierwotnych - byte , short , int , long , float , double , char , boolean .Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 5 - 6

49. Co to jest klasa „opakowująca”?

Głównym problemem związanym z używaniem typów pierwotnych w Javie jest to, że nadal nie są one klasami, a Java jest nadal językiem OOP. Oznacza to, że programy napisane w tym języku sprowadzają się do interakcji między obiektami. Cóż, prymitywy nie są przedmiotami. Nie mają metod, nawet standardowych z klasy Object . Cóż, co by było, gdybyśmy musieli użyć prymitywu jako klucza w Mapie ? Następnie musisz wywołać metodę hashCode . Można tam również wywołać metodę równości . Co wtedy? Momentów, w których powinna być klasa, a nie prymityw może być bardzo, bardzo wiele, co sprawia, że ​​prymitywy stają się nieużywanymi i niepożądanymi elementami w programie, bo to burzy samą ideę OOP. Ale nie wszystko jest tak złe, jak się wydaje. W końcu Java ma koncepcję prymitywnego opakowania. Każdy typ pierwotny ma klasę analogową:
  • bajt -> Bajt.klasa
  • krótki -> Krótki.klasa
  • int -> Liczba całkowita.klasa
  • długi -> Długi.klasa
  • float -> Float.class
  • double -> Double.class
  • char -> Klasa.postaci
  • wartość logiczna -> Wartość logiczna.klasa
Jest to reprezentacja typów prostych, ale w formie pełnoprawnych klas z wieloma różnorodnymi i funkcjonalnymi metodami. Dla wygody korzystania z tych klas wprowadzono pojęcia autoboxingu i unboxingu. Autoboxing - w razie potrzeby automatyczna konwersja typu pierwotnego na klasę analogową (na przykład int na Integer ). Rozpakowywanie to proces odwrotny do poprzedniego: automatyczna konwersja prymitywnej klasy opakowania na typ pierwotny (na przykład Integer na int ). Dzięki wprowadzeniu prymitywnych klas wrapperów oraz procesom autoboxingu i unboxingu , typy pierwotne mogły stać się pełnoprawnymi członkami języka OOP – Java. Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 5 - 7Aby dowiedzieć się więcej na ten temat, gorąco polecam przeczytanie tego artykułu .

50. Co to jest klasa zagnieżdżona? Kiedy się go używa?

Klasa zagnieżdżona to klasa wewnętrzna, która jest członkiem innej klasy. W Javie istnieją 4 typy takich klas wewnętrznych: 1. Klasa wewnętrzna Ten typ klasy jest deklarowany bezpośrednio w treści innej klasy. Zagnieżdżona klasa wewnętrzna może uzyskać dostęp do dowolnego prywatnego pola lub metody instancji klasy zewnętrznej. Jako przykład stwórzmy zoo, w którym będziemy mieli zwierzę - zebrę:
public class Zoo {
   class Zebra {
       public void toFeed(String food) {
           System.out.println("Дать зебре - " + food);
       }
   }
}
Nic skomplikowanego, prawda? Przyjrzyjmy się przykładowi tworzenia obiektu klasy wewnętrznej:
Zoo.Zebra zebra = new Zoo().new Zebra();
zebra.toFeed("яблоко");
Jak już widziałeś, konieczne jest utworzenie obiektu klasy framingu, na podstawie którego można utworzyć obiekt klasy wewnętrznej. Chciałbym również zauważyć, że zagnieżdżona klasa wewnętrzna nie może mieć metod statycznych ani pól statycznych. Dzieje się tak dlatego, że klasa wewnętrzna jest niejawnie powiązana z obiektem swojej klasy zewnętrznej i nie może w sobie zadeklarować żadnych metod statycznych. 2. Statyczne klasy zagnieżdżone Ta klasa jest podobna do poprzedniej, z tą różnicą, że ma statyczny modyfikator dostępu w pobliżu deklaracji klasy. Ponieważ tego rodzaju klasa nie ma dostępu do niestatycznych pól klasy zewnętrznej, bardziej przypomina statyczną część klasy zewnętrznej niż klasę wewnętrzną. W tym przypadku dane klasy mają dostęp do wszystkich statycznych elementów klasy zewnętrznej, nawet tych prywatnych. Przykład statycznej klasy zagnieżdżonej:
public class Zoo {
   static class Zebra {
       public void toFeed(String food) {
           System.out.println("Дать зебре - " + food);
       }
   }
}
Metoda tworzenia różni się nieco od poprzedniej:
Zoo.Zebra zebra = new Zoo.Zebra();
zebra.toFeed("яблоко");
Tutaj nie potrzebujemy obiektu klasy zewnętrznej, aby utworzyć obiekt zagnieżdżonej klasy statycznej. Z klasy zewnętrznej potrzebujemy tylko jej typu, abyśmy mogli znaleźć lokalizację klasy zagnieżdżonej. 3. Klasy lokalne Klasy lokalne to klasy zadeklarowane w treści metody, a tworzenie i używanie obiektu klasy lokalnej możliwe jest wyłącznie w ramach tej metody. Przykład:
public class Zoo {
   public void toFeed(String animal, String food) {
       switch(animal){
           case "зебра":
               class Zebra {
                   void toFeedZebra(String food) {
                       System.out.println("Дать зебре - " + food);
                   }
               }
               Zebra zebra = new Zebra();
               zebra.toFeedZebra(food);
               ...
Przykład użycia:
Zoo zoo = new Zoo();
zoo.toFeed("зебра", "яблоко");
Nie widząc kodu metody toFeed , nie podejrzewałbyś nawet istnienia klasy lokalnej, prawda? Klasa lokalna nie może być statyczna ani przejściowa , ale może być oznaczona jako abstrakcyjna lub ostateczna (tylko OR, ponieważ użycie tych dwóch modyfikatorów spowoduje konflikt). 4. Klasy anonimowe O klasach anonimowych mówiliśmy już powyżej i jak pamiętacie, można je tworzyć z dwóch źródeł - interfejsów i klas. Powody stosowania wewnętrznych klas statycznych i niestatycznych, ponieważ czasami lepiej jest osadzić małe klasy w większych i trzymać je razem: w ten sposób będą miały większą spójność i wspólny cel. W rzeczywistości użycie klas zagnieżdżonych zwiększa enkapsulację kodu. Powodem wyboru klas lokalnych może być fakt, że dana klasa jest wykorzystywana wyłącznie w ramach jednej metody. Czy w takim wypadku konieczne jest rozproszenie kodu po całej aplikacji? NIE. Ale jednocześnie dodam, że w swojej praktyce nigdy nie spotkałem się z zastosowaniem zajęć lokalnych, bo ich potrzeba jest wysoce kontrowersyjna. Cóż, powodem użycia klas anonimowych może być to, że konkretna implementacja interfejsu lub klasy abstrakcyjnej będzie potrzebna tylko raz, więc nie ma potrzeby tworzenia osobnej, pełnoprawnej klasy z implementacją do tego. Zamiast tego w prosty sposób zaimplementowaliśmy potrzebne metody poprzez anonimową klasę, użyliśmy tego obiektu i zapomnieliśmy o nim (cóż, Garbage Collector o tym pamiętał). Ten i tenAnaliza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 5 - 8 artykuł pomogą Ci bardziej szczegółowo przestudiować zajęcia wewnętrzne .

51. Jakie modyfikatory dostępu może mieć klasa?

Jak pamiętamy istnieją różne typy klas i mają do nich zastosowanie różne modyfikatory dostępu:
  • klasa zewnętrzna może mieć publiczny modyfikator dostępu lub nie mieć modyfikatora (modyfikator domyślny);
  • klasa wewnętrzna obsługuje wszystkie 4 modyfikatory dostępu;
  • zagnieżdżona klasa statyczna obsługuje wszystkie modyfikatory dostępu z wyjątkiem chronionych , ponieważ ten modyfikator implikuje dziedziczenie, co jest sprzeczne ze statycznym elementem klasy (elementy statyczne nie są dziedziczone);
  • klasa lokalna może mieć tylko domyślny modyfikator (tzn. nie może mieć żadnego modyfikatora);
  • klasa anonimowa : jeśli nie ma deklaracji typu klasy, nie ma żadnych modyfikatorów dostępu.
W tym miejscu dzisiaj się zatrzymamy. Do zobaczenia wkrótce!Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 5 - 9
Pozostałe materiały z serii:
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION