Pytania rekrutacyjne dotyczące języka Java

Opublikowano w grupie Poland
Przeprowadzimy Cię przez 21 najczęściej zadawane pytania rekrutacyjne dotyczące języka Java, na które musisz się przygotować w 2020 roku. Pytania rekrutacyjne dotyczące języka Java - 1
  1. Omów elementy twierdzenia public static void main(String args[]).

    To jedno z najpopularniejszych pytań na rozmowie kwalifikacyjnej dla programisty dotyczących języka Java, otwierających dyskusję i dodatkowo jest to pytanie bardzo proste.

    • public jest modyfikatorem dostępu. Używamy go do określenia dostępu do tej metody. Modyfikator tutaj jest "publiczny", więc każda klasa może mieć dostęp do tej metody.

    • static. To słowo kluczowe Java oznacza, że używamy tej metody bez tworzenia obiektu klasy.

    • void to typ zwracany metody. Oznacza to, że metoda ta nie zwraca żadnej wartości.

    • main to nazwa metody. JVM traktuje tę nazwę jako punkt wejścia do aplikacji (musi mieć określony podpis). main jest metodą, w której następuje główne wykonanie.

    • String args[]. To jest parametr przekazywany do metody głównej. Tutaj mamy argumenty typu String, które nasza aplikacja Java akceptuje podczas uruchamiania. Możesz wprowadzić je w konsoli.

  2. Jaka jest różnica pomiędzy equals() i == ?

    Po pierwsze, == jest operatorem, a equals() to metoda. Używamy operatora == do porównania referencji (lub porównania adresów), a metody equals() do porównania zawartości. Oznacza to, że == sprawdza, czy oba obiekty wskazują na tę samą lokalizację w pamięci, podczas gdy equals() porównuje wartości w obiektach.

  3. Czy możemy wykonać program bez metody main()?

    Wiele podstawowych pytań w rozmowach kwalifikacyjnych dotyczących języka Java jest naprawdę łatwych. Jak na przykład to. Więc, krótka odpowiedź brzmi: tak, możemy. Możemy to m.in. zrobić za pomocą statycznego bloku.

    Możesz użyć bloku statycznego, aby zainicjować statyczny element z danymi. Jest on wykonywany przed metodą main, podczas ładowania klas.

    
    class Example {  
      static {
        System.out.println("Wywoływany jest blok statyczny");
      }  
      public static void main(String args[]) {  
        System.out.println("W głównej metodzie, teraz");
      }
    }
    

    Drukowane będzie:

    
    Wywoływany jest blok statyczny
    W głównej metodzie, teraz
    

    Co jeśli w ogóle nie ma głównej metody? Jeśli spróbujesz uruchomić zwykłą klasę bez głównej metody, otrzymasz następujący błąd: Main method not found in class Test, please define the main method as: public static void main (String [] args) or a JavaFX application class must extend javafx.application.Application. Sam błąd mówi, że jeśli jest to aplikacja JavaFX i klasa jest dziedziczona z javafx.application.Application, to jest to możliwe.

  4. Czym jest obiekt immutable? Czy można stworzyć obiekt immutable?

    Nie można modyfikować obiektów klasy immutable po ich utworzeniu. Innymi słowy, kiedy już je stworzysz, nie możesz ich zmienić. Jeśli spróbujesz zmodyfikować obiekt immutable, otrzymasz nowy obiekt (klon) i podmienisz ten klon podczas tworzenia.

    Dobrym przykładem jest String. W Javie jest immutable (niezmienny). Oznacza to, że nie możesz zmienić samego obiektu String, ale możesz zmienić odniesienie do obiektu.

  5. Ile obiektów jest tworzonych w poniższym kodzie?

    Jest to pytanie techniczne dotyczące języka Java, które może zastąpić punkt 4, powyżej.

    
    String s1="Witaj";  
    String s2="Witaj";  
    String s3="Witaj";  
    

    Odpowiedź to "tylko jeden", ponieważ Java posiada String Pool. Kiedy tworzymy obiekt String za pomocą operatora new (), Java tworzy nowy obiekt w pamięci sterty. Jeśli użyjemy składni literału String, tak jak w naszym przykładzie powyżej, może ona zwrócić obiekt z puli String, jeżeli taki już istnieje.

  6. Ile obiektów jest tworzonych w poniższym kodzie?

    
    String s = new String("Witaj");
    

    Tu stworzono 2 obiekty. Jeden znajduje się w puli stałych typu String, a drugi w stercie.

  7. Jaka jest różnica pomiędzy klasami String, StringBuilder i StringBuffer w Javie?

    To jedno z najczęściej zadawanych pytań podczas rozmów rekrutacyjnych dotyczących języka Java.

    Po pierwsze, String to klasa niezmienna. Oznacza to, że nie możesz modyfikować jej zawartości po utworzeniu. Ale StringBuffer i StringBuilder to klasy zmienne, więc masz możliwość zmodyfikować je później. Jeśli spróbujemy zmienić zawartość obiektu String, JVM utworzy nowy ciąg pozostawiając oryginalny bez zmian. Dlatego wydajność jest lepsza w przypadku StringBuffer niż w String.

    Główna różnica między StringBuffer i StringBuilder polega na tym, że metody StringBuffer są synchronizowane, a metody StringBuilder nie.

  8. Czy jest jakaś różnica między obiektami typu String, gdy pierwszy utworzony został jako literał, a drugi za pomocą operatora new()?

    Jest Jeśli utworzymy String z operatorem new(), pojawi się on w stercie i nie zostanie dodany do puli String. Jeśli utworzymy String jako literał, zostanie on utworzony w puli String, która istnieje w obszarze PermGen sterty.

  9. Czy można nadpisać metodę private lub static w Javie?

    To dla początkujących programistów Java dość podstępne pytanie rekrutacyjne w Java. Tak na prawdę nie można nadpisać metody private lub static w Javie.

    Nie można nadpisywać metod private, ponieważ zakres specyfikatora dostępu prywatnego ograniczony jest do klasy. Aby coś nadpisać, musimy mieć klasę podstawową i potomną. Jeśli metoda nadklasy jest private, klasa potomna nie może jej używać, a metody z klasy podrzędnej będą traktowane jako nowe metody (a nie nadpisania).

    Metody static również nie mogą być nadpisane, ponieważ metody static są częścią samej klasy. Nie są częścią żadnego obiektu klasy. Oczywiście, możesz zadeklarować tę samą metodę static z tym samym podpisem w klasach potomnych, lecz znowu będą one traktowane jako nowe metody.

  10. Jaka jest różnica pomiędzy klasą abstrakcyjną - abstract class, a interfejsem - interface

    To popularne pytanie na rozmowę kwalifikacyjną programisty Java, które opiera się na zasadach OOP. Przede wszystkim w Javie interface definiuje zachowanie, podczas gdy abstract class tworzy hierarchię.

    Klasa abstrakcyjnaInterfejs
    Możliwe jest posiadanie treści metody (metody nieabstrakcyjne) w klasie abstrakcyjnej Interfejs może mieć tylko metody abstrakcyjne. W Javie 8 i wydaniach nowszych, stało się możliwe definiowanie metod domyślnych i implementowanie ich bezpośrednio w interfejsie. Ponadto, zaczynjąc od Javy 8 interfejsy mogą mieć metody statyczne.
    Zmienne instancji mogą znajdować się w klasie abstrakcyjnej Interfejs nie może mieć zmiennych instancji.
    Dozwolone są konstruktory Interfejs nie może mieć żadnego konstruktora.
    Dozwolone są metody statyczne Metody statyczne są niedozwolone
    Klasa może mieć tylko jedną abstrakcyjną klasę macierzystą Jeden interfejs może być implementowany przez wiele klas
    Klasa abstrakcyjna może zapewnić implementację interfejsu. Interfejs nie może zapewnić implementacji klasy abstrakcyjnej.
    Klasa abstrakcyjna może rozszerzać inną klasę języka Java i implementować wiele interfejsów Javy. Interfejs może rozszerzać tylko inny interfejs Javy.
    Klasa abstrakcyjna Javy może zawierać prywatne i chronione elementy Elementy interfejsu Javy są domyślnie publiczne
  11. Czy możemy zadeklarować zmienne static i metody w klasie abstract?

    Tak, można zadeklarować zmienne static i metody w klasie abstract. Nie ma wymogu, aby obiekt miał dostęp do kontekstu statycznego. Na przykład, możemy uzyskać dostęp do statycznego kontekstu zadeklarowanego wewnątrz klasy abstract poprzez użycie nazwy klasy abstract.

  12. Jakie typy obszarów pamięci są przydzielane przez JVM?

    Obszar Klasy przechowuje struktury klas, na przykład stałe i pola inicjowane podczas uruchomienia programu, dane i cały kod metod.

    Sterta to obszar danych środowiska wykonawczego, w którym pamięć przydzielana jest obiektom.

    Stos przechowuje ramki. Zawiera zmienne lokalne i wyniki pośrednie, a także bierze udział w wywołaniach i zwrotach metod. Każdy wątek ma prywatny stos JVM, stworzony w tym samym czasie co wątek. Za każdym razem, gdy wywoływana jest metoda, tworzona jest nowa ramka. Ramka jest niszczona po zakończeniu wywołania jej metody.

    Rejestr licznika programu zawiera adres aktualnie wykonywanej instrukcji wirtualnej maszyny Javy.

    Stos metod natywnych zawiera wszystkie metody natywne, które używane są w aplikacji.

  13. Dlaczego dziedziczenie wielokrotne jest niedozwolone w Javie?

    To byłoby naprawdę skomplikowane. Wyobraź sobie trzy klasy A, B, i C, gdzie C dziedziczy A i B. Teraz załóżmy, że klasy A i B mają tę samą metodę, a wywołujesz ją z obiektu klasy potomnej... Która z nich zostanie wywołana? A czy B? Mamy tu dwuznaczność.

    Jeśli spróbujesz dziedziczyć dwie klasy, Java wygeneruje błąd kompilacji.

  14. Czy można przeciążyć metodę main()?

    Jasne, możemy mieć wiele metod main w programie Java, używając przeciążania metod. Spróbuj!

  15. Czy możemy zadeklarować konstruktor jako final?

    Nie. Konstruktor nie może być zadeklarowany jako final, ponieważ nie może być dziedziczony. Nie ma więc sensu deklarować konstruktorów jako final. Jeśli jednak spróbujesz, kompilator Java zgłosi błąd.

  16. Czy możemy zadeklarować interfejs jako final?

    Nie, nie możemy tego zrobić. Interfejs nie może być final, ponieważ interfejs musi być zaimplementowany przez jakąś klasę zgodnie z jego definicją. Dlatego nie ma sensu tworzyć interfejsu final. Jeśli jednak spróbujesz to zrobić, kompilator wygeneruje błąd.

  17. Jaka jest różnica pomiędzy static binding i dynamic binding?

    Wiązanie - Binding, które może zostać rozwiązane w czasie kompilacji przez kompilator, nazywane jest statycznym - static lub wczesnym wiązaniem. Wiązanie (Binding) wszystkich metod static, private i final wykonywane jest w trakcie kompilacji.

    W dynamic binding, kompilator nie może określić, która metoda ma zostać wywołana. Nadpisywanie metody jest doskonałym przykładem dynamic binding. W przypadku nadpisywania metody obie klasy nadrzędne i podrzędne mają tę samą metodę.

    
    Static Binding
    class Cat{  
      private void talk() {
        System.out.println("Kot miauczy...");
      }  
      
      public static void main(String args[]) {
        Cat cat=new Cat();
        cat.talk();
      }  
    }  
    Wiazanie dynamiczne
    class Animal {
      void talk() {
        System.out.println("Zwierzę mówi...");
      }
    }  
      
    class Cat extends Animal {
      void talk() {
        System.out.println("Kot mówi...");
      }    
      public static void main(String args[]) {
        Animal animal=new Cat();  
        animal.talk();
      }  
    }
    
  18. Jak utworzyć klasę tylko do odczytu w Javie?

    Możesz to zrobić, ustawiając wszystkie pola klasy jako prywatne. Klasa tylko do odczytu ma tylko gettery, które zwracają prywatne właściwości klasy do metody main. Nie możesz modyfikować tych właściwości z powodu braku setterów.

    
    public class HockeyPlayer {
      private String team ="Liść klonu";
      public String getTeam() {
        return team;    
      }
    }
    
  19. Jak utworzyć klasę tylko do zapisu w Javie?

    Ponownie, należałoby ustawić wszystkie pola klasy jako private. Tym razem twoja klasa tylko do zapisu musi posiadać jedynie metody ustawiające, a nie pobierające. W rezultacie nie można odczytać właściwości klasy.

    
    public class HockeyPlayer {
      private String team;
      public void setTeam(String college) {
        this.team = team;
      }
    }
    
  20. Po każdym bloku try musi następować blok catch, prawda?

    Nie. Nie jest to konieczne. Blok try nie musi mieć bloku catch. Mógłby po nim następować albo blok catch, albo blok final, albo nawet żaden z nich.

    
    public class Main {
       public static void main(String[] args) {
          try {
            int variable = 1;
            System.out.println(variable/0);
          }
          finally
          {
            System.out.println("Reszta programu...");
          }  
       }  
    }
    

    Wydruk:

    Exception in thread main java.lang.ArithmeticException:/ by zero Reszta programu...

    Jeszcze jeden przykład:
    
    class Main {
      public static void main(String[] args) throws IOException {
        try(InputStreamReader inputStreamReader = new InputStreamReader(System.in);
          BufferedReader reader = new BufferedReader(inputStreamReader)) {
          System.out.println("test");
        }
      }
    }
    

    Wydruk:

    test

    P.S.: Przed Java 8, metody w interfejsach mogły być jedynie abstrakcyjne. W Javie 8 oraz nowszych wersjach, możliwe stało się definiowanie domyślnych metod i implementowanie ich bezpośrednio w interfejsie.
  21. Jaka jest różnica między słowami kluczowymi throw i throws?

    Throws służy do deklarowania wyjątku, więc działa podobnie do bloku try-catch. Słowo kluczowe throw służy do bezpośredniego zgłaszania wyjątku z metody lub dowolnego innego bloku kodu.

    Po Throw następuje instancja klasy Exception, a po «throws» następują nazwy klas wyjątków.

    Throw jest używany w treści metody do wyrzucania wyjątku. Throws używane jest w sygnaturze metody do deklarowania wyjątków, które mogą wystąpić w twierdzeniach obecnych w metodzie.

    Możesz zgłosić jeden wyjątek na raz, ale możesz obsłużyć wiele wyjątków, deklarując je za pomocą słowa kluczowego throws. Możesz zadeklarować wiele wyjątków, np. public void method() throws IOException, SQLException.

Tutaj rozważaliśmy tylko kilka pytań i odpowiedzi na rozmowę kwalifikacyjną dotyczącą języka Java. Ten artykuł jest pierwszym z serii odnoszących się do pytań i zadan rekrutacyjnych w Java. Następny (już wkrótce) związany będzie z tematem struktur danych.
Ten artykuł przeczytasz także po angielsku.
Read the English version of this article to practice responding to Java interview questions in English. Understanding these concepts in English can only help your employment prospects!
Pytania rekrutacyjne dotyczące języka Java - 2
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION