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ęść 4

Opublikowano w grupie Random-PL
Witam wszystkich, dzisiaj kontynuuję analizę ponad 250 pytań do rozmowy kwalifikacyjnej dla programisty Java. Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 4 - 1Poprzednie części analizy: pierwsza , druga , trzecia . Więc kontynuujmy.

29. Czy można użyć return w konstruktorze?

Można, ale bez wartości zwracanej po prawej stronie return . Oznacza to, że możesz użyć return; jako konstrukcja pomocnicza podczas obliczeń w konstruktorze w celu pilnego zakończenia (przerwania) wykonywania dalszego kodu i dokończenia inicjalizacji obiektu. Przykładowo mamy klasę Kot i jeśli Kot jest bezdomny - isHomeless = true , musimy dokończyć inicjalizację i nie wypełniać innych pól (przecież są nam one nieznane, bo kot jest bezdomny):
public Cat(int age, String name, boolean isHomeless) {
   if (isHomeless){
       this.isHomeless = isHomeless;
       return;
   }
   this.isHomeless = isHomeless;
   this.age = age;
   this.name = name;
}
Ale jeśli chodzi o określone wartości, konstruktor nie może użyć funkcji return do zwrócenia wartości, ponieważ:
  • deklarując konstruktor, nie będziesz mieć niczego przypominającego typ zwracany;
  • Zazwyczaj konstruktor jest wywoływany niejawnie podczas tworzenia instancji;
  • Konstruktor nie jest metodą: jest oddzielnym mechanizmem, którego jedynym celem jest inicjacja zmiennych instancji, a operator new jest odpowiedzialny za utworzenie obiektu .
Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 4 - 2

30. Czy można zgłosić wyjątek od konstruktora?

Konstruktory radzą sobie z wyjątkami dokładnie w taki sam sposób, jak metody. A jeśli metody pozwalają nam na zgłaszanie wyjątków poprzez zapisanie rzutów <ExceptionType> w nagłówku metody , to konstruktor nam na to pozwala, a także przy dziedziczeniu i definiowaniu konstruktora dziedziczącego możemy rozwinąć typ wyjątku. Na przykład IOException -> Wyjątek (ale nie odwrotnie). Jako przykład zgłoszenia wyjątku przez konstruktora weźmy klasę Cat . Powiedzmy, że tworząc go chcemy z konsoli wpisać imię i wiek:
public Cat() throws IOException {
   BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
   this.name = reader.readLine();
   this.age = Integer.parseInt(reader.readLine());
}
Ponieważ metoda reader.readLine() zgłasza wyjątek IOException, określamy go w nagłówku jako możliwy zgłoszony wyjątek.

31. Z jakich elementów składa się nagłówek klasy? Napisz przykład

Skoro już mowa o elementach tworzących nagłówek klasy, spójrzmy na mały diagram:
  • obowiązkowe elementy będą w nawiasach <>
  • opcjonalnie - w {}
{modyfikator dostępu do klasy}{statyczność klasy}{ostateczność klasy}{abstrakcja klasy} <nazwa klasy>{dziedziczenie z klasy nadrzędnej} {implementacja interfejsu} Zatem co mamy: {class access modifier} - dla klasy dostępne są tylko modyfikatory public i brakujący modyfikator dostępu, czyli default . {class static} - static to modyfikator wskazujący, że dana klasa jest statyczna, mający zastosowanie tylko do klas wewnętrznych (klas znajdujących się wewnątrz innych klas). {class finality} - jak pamiętamy, jest to ostateczny modyfikator , w obecności którego klasa staje się niedziedziczna (przykład z ramki - String ). {class abstrakcja} - modyfikator - streszczenie , który wskazuje, że ta klasa może mieć niezaimplementowane metody. Modyfikator ten koliduje z modyfikatorem final , czyli tylko jeden z nich może znajdować się w nagłówku klasy, ponieważ modyfikator abstrakcyjny oznacza, że ​​dana klasa będzie dziedziczona, a jej abstrakcyjne części zostaną zaimplementowane. Final wskazuje , że jest to ostateczna (ostateczna) wersja klasy i nie można jej dziedziczyć. Właściwie użycie obu modyfikatorów jednocześnie byłoby absurdem, a kompilator nam na to nie pozwoli. <class> to wymagane słowo kluczowe, które wskazuje deklarację klasy. <nazwa klasy> to prosta nazwa klasy, która jest identyfikatorem konkretnej klasy Java. W pełni kwalifikowana nazwa klasy składa się z w pełni kwalifikowanej nazwy pakietu + . + prosta nazwa klasy. {inheritance from Parent class} - określenie klasy nadrzędnej (jeśli istnieje) za pomocą słowa kluczowego Extends . Na przykład .. rozszerza ParentClass . {interface implementacja} - określenie interfejsów, które ta klasa implementuje (jeśli istnieją) za pomocą słowa kluczowego implements . Na przykład: ... implementuje FirstInterface, SecondInterface ... Cóż, jako przykład nagłówka klasy, rozważ nagłówek klasy Lion , która dziedziczy po Cat i implementuje interfejs WildAnimal :
public final class Lion extends Cat implements WildAnimal
Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 4 - 3

32. Z jakich elementów składa się nagłówek metody? Napisz przykład

Ponownie, patrząc na elementy tworzące nagłówek metody, rozważ mały diagram, na którym:
  • obowiązkowe elementy podano w nawiasach <>
  • opcjonalnie - w {}
{modyfikator dostępu} {method static} abstrakcja metody}{ostateczność metody} modyfikator synchronizacji} {modyfikator natywny<wartość zwracana><nazwa metody> <(> {argumenty metody} <)>{zgłoszone wyjątki} {modyfikator dostępu } — dla metody dostępne są wszystkie modyfikatory dostępu: public , chroniony , domyślny , prywatny . {method static} - static to modyfikator wskazujący, że dana metoda jest statyczna, to znaczy jest powiązana nie z obiektem, ale z klasą. {abstrakcja metody} to modyfikator abstrakcyjny , który wskazuje, że nie ma implementacji (treści) metody. Do poprawnego działania potrzebny jest także abstrakcyjny modyfikator dla klasy, w której dostarczona jest metoda. Podobnie jak w nagłówku klasy, modyfikator ten koliduje z modyfikatorem final , ale oprócz niego koliduje także z modyfikatorem static , ponieważ metoda abstrakcyjna oznacza zastąpienie metody w potomku, a metody statyczne nie są nadpisywane. {finality of the method} - final - modyfikator wskazujący, że tej metody nie można przesłonić. {synchronization modifier} - synchronized - modyfikator oznaczający, że metoda ta jest zabezpieczona przed jednoczesnym dostępem do niej z różnych wątków. Jeśli metoda nie jest statyczna, zamyka się na muteksie this obiektu. Jeśli metoda jest statyczna, zamyka się na muteksie bieżącej klasy. {native modifier} - native - modyfikator ten wskazuje, że metoda jest napisana w innym języku programowania. <wartość zwracana> to typ wartości, która powinna zwrócić metoda. Jeśli nie powinno niczego zwrócić, void . <nazwa metody> to nazwa metody, jej identyfikator w systemie. {argumenty metody} to argumenty (parametry), które przyjmuje metoda: są niezbędne do zaimplementowania jej funkcjonalności. {throwable wyjątki} - rzucaExceptionType - lista sprawdzonych wyjątków, które ta metoda może zgłosić. Jako przykład nagłówka metody podam to:
public static void main(String[] args) throws IOException

33. Utwórz domyślny konstruktor w obiekcie potomnym, jeśli nie jest on zdefiniowany w obiekcie bazowym (ale zdefiniowany jest inny konstruktor)

Nie do końca rozumiem samo pytanie, ale być może oznacza to, że np. w rodzicu mamy jakiegoś niestandardowego konstruktora:
public Cat(int age, String name) {
   this.age = age;
   this.name = name;
}
Dlatego w klasie przodka zdecydowanie musimy zdefiniować konstruktor, który wypełni (wywoła) konstruktor nadrzędny:
public  class Lion extends Cat {

   public Lion(int age, String name) {
       super(age, name);
   }
}
Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 4 - 4

34. Kiedy używane jest słowo kluczowe this?

W Javie ma to dwa różne znaczenia. 1. Jako odniesienie do bieżącego obiektu, np. this.age = 9 . Oznacza to, że odnosi się to do obiektu, na którym zostało wywołane i do którego odnosi się kod używający this . Główną funkcją jest zwiększenie czytelności kodu i uniknięcie niejednoznaczności. Na przykład, jeśli nazwa wewnętrznego pola klasy i argument metody są takie same:
public void setName(String name) {
   this.name = name;
}
Oznacza to, że this.name jest polem obiektu nazwa jest argumentem metody.Odniesienia this nie można używać w metodach statycznych. 2. Można tego użyć w konstruktorze w formie wywołania metody, na przykład this(value) . W tym przypadku będzie to wywołanie innego konstruktora tej samej klasy. Krótko mówiąc, podczas tworzenia obiektu możesz wywołać dwa konstruktory jednocześnie:
public Cat(int age, String name) {
   this(name);
   this.age = age;
}

public Cat(String name) {
   this.name = name;
}
Po utworzeniu obiektu Cat i wywołaniu pierwszego konstruktora oba pola obiektu zostaną wywołane i pomyślnie zainicjowane. Istnieje kilka niuansów:
  1. this() działa tylko w konstruktorze.
  2. Odwołanie do innego konstruktora musi znajdować się w pierwszej linii bloku konstruktora (treści). Dlatego w jednym konstruktorze nie można wywołać więcej niż jednego (innego) konstruktora danej klasy.
Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 4 - 5Więcej przykładów znajdziesz w tym artykule .

35. Co to jest inicjator?

O ile rozumiem, w tym pytaniu mówimy o zwykłych i statystycznych blokach inicjalizacji. Na początek przypomnijmy sobie, czym jest inicjalizacja. Inicjalizacja to utworzenie, uruchomienie, przygotowanie do pracy, określenie parametrów. Doprowadzenie programu lub komponentu do stanu gotowości do użycia. Jak pamiętacie, podczas tworzenia obiektu zmienną klasy można zainicjować bezpośrednio po deklaracji:
class Cat {
   private int age = 9;
   private  String name = "Tom";
Lub ustaw go zewnętrznie za pomocą konstruktora:
class Cat {
   private int age;
   private  String name;

   public Cat(int age, String name) {
       this.age = age;
       this.name = name;
   }
Ale jest inny sposób: ustawić wewnętrzną zmienną obiektu poprzez blok inicjujący, który wewnątrz klasy wygląda jak nawiasy klamrowe { } , bez nazwy (jak metoda lub konstruktor):
class Cat {
   private int age;
   private  String name;

   {
       age = 10;
       name = "Tom";
   }
Oznacza to, że blok inicjujący to fragment kodu ładowany podczas tworzenia obiektu. Zwykle takie bloki służą do wykonywania skomplikowanych obliczeń, które są niezbędne podczas ładowania klasy. Wyniki tych obliczeń można określić jako wartości zmiennych. Ponadto, oprócz zwykłych bloków inicjujących, istnieją bloki statyczne, które wyglądają tak samo, ale mają słowo kluczowe static przed nawiasem klamrowym :
class Cat {
   private static int age;
   private static String name;

   static{
       age = 10;
       name = "Tom";
   }
Ten blok jest dokładnie taki sam jak poprzedni. Ale jeśli zwykły zostanie wywołany podczas inicjalizacji każdego obiektu, wówczas statyczny zostanie wywołany tylko raz, gdy klasa zostanie załadowana. W takim bloku z reguły wykonywane są również złożone obliczenia dla późniejszej inicjalizacji zmiennych klasy statycznej. Do bloku statycznego obowiązują te same ograniczenia, co do metod statycznych: nie może on wykorzystywać danych niestatycznych, a także odniesienia do bieżącego obiektu - tego . Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 4 - 6Następnie możemy zobaczyć kolejność inicjalizacji klasy (wraz z jej przodkiem), aby lepiej zrozumieć moment uruchomienia bloków inicjujących.

36. Aby dziedziczyć klasę publiczną Klasa Child rozszerza Parent, należy wpisać kolejność inicjalizacji obiektu

Po załadowaniu klasy Child kolejność inicjalizacji będzie następująca:
  1. Pola statyczne klasy Parent .
  2. Statyczny blok inicjujący dla klasy Parent .
  3. Pola statyczne klasy Сhild .
  4. Statyczny blok inicjujący dla klasy Child .
  5. Pola niestatyczne klasy Parent .
  6. Nie jest to statyczny blok inicjujący dla klasy Parent .
  7. Konstruktor klasy nadrzędnej .
  8. Pola niestatyczne klasy Child .
  9. Nie jest to statyczny blok inicjujący dla klasy Child .
  10. Konstruktor klasy Child .
Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 4 - 7Oto krótki artykuł wyjaśniający w praktyce kolejność inicjalizacji.

37. Jakie znasz relacje pomiędzy klasami (obiektami)?

W Javie istnieją dwa typy relacji pomiędzy klasami:
  • Relacja IS-A
Zasada IS-A w OOP opiera się na dziedziczeniu klas lub implementacji interfejsu. Na przykład, jeśli klasa Lion dziedziczy po Cat , mówimy, że Lion is Cat :
Lion IS-A Cat
(ale nie każdy kot jest lwem ) Z interfejsami sytuacja wygląda dokładnie tak samo. Jeśli klasa Lion implementuje interfejs WildAnimal , to także one są ze sobą powiązane:
Lion IS-A WildAnimal
  • Relacje HAS-A
Ten typ relacji opiera się na wykorzystaniu klas przez inne klasy, zwanym także „asocjacją”. Stowarzyszenie to jedna klasa odwołująca się do innej klasy (lub nawet siebie nawzajem). Na przykład klasa Car może odnosić się do klasy Passenger i będzie to wyglądać następująco:
Car HAS-A Passenger
I odwrotnie: jeśli Pasażer ma odniesienie do Car , to będzie to relacja:
Passenger HAS-A Car

38. Jakie znasz powiązania asocjacyjne między obiektami?

Agregacja i kompozycja to nic innego jak szczególne przypadki asocjacji. Agregacja to relacja, w której jeden obiekt jest częścią drugiego. Na przykład pasażer może znajdować się w samochodzie. Ponadto może być kilku pasażerów lub wcale (jeśli mówimy o Tesli, kierowca nie jest wymagany). Na przykład:
public class Car {
   private List passengers = new ArrayList<>();

 void setPassenger(Passenger passenger) {
     passengers.add(passenger);
 }

   void move() {
       for (Passenger passenger : passengers) {
           System.out.println("Перевозка пассажира - " + passenger.toString());
       }
       passengers.clear();
   }
}
Oznacza to, że nie dbamy o liczbę pasażerów (ani o to, czy w ogóle ich są): funkcjonalność klasy Samochód nie zależy od tego. Agregacja oznacza również, że gdy obiekt jest używany przez inny obiekt, pierwszy z nich może być używany w innych obiektach. Przykładowo, ten sam uczeń może być członkiem zarówno klubu dziewiarskiego, jak i muzycznej grupy rockmanów, a jednocześnie uczęszczać do grupy uczących się języka angielskiego. Jak rozumiesz, agregacja to luźniejsza relacja asocjacyjna między klasami. Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 4 - 8Kompozycja jest jeszcze bardziej sztywną relacją, gdy obiekt jest nie tylko częścią innego obiektu, ale działanie drugiego obiektu jest w dużym stopniu zależne od pierwszego. Na przykład silnik samochodu. Choć silnik może istnieć bez samochodu, poza nim jest bezużyteczny. Cóż, samochód nie może działać bez silnika:
public class Car {
   private Engine engine;

   public Car(Engine engine) {
       this.engine = engine;
   }

   void startMoving() {
       engine.start();
           ...
   }
Kompozycja oznacza również, że gdy przedmiot jest używany przez inny przedmiot, pierwszy nie może należeć do kogoś innego. Wracając do naszego przykładu, silnik może należeć tylko do jednego samochodu, ale nie do dwóch lub więcej jednocześnie. Prawdopodobnie dzisiaj się tu zatrzymamy.Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 4 - 9
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION