Interview Flashcards

1
Q

Czy Java jest niezależna od platformy?

A

Tak, Java jest językiem niezależnym od platformy. W przeciwieństwie do wielu innych języków programowania, javac kompiluje program, tworząc kod bajtowy lub plik .class. Ten plik jest niezależny od oprogramowania czy sprzętu, ale wymaga zainstalowanego JVM (Java Virtual Machine) w systemie operacyjnym, aby można było wykonać kod bajtowy.

Chociaż JVM jest zależny od platformy, kod bajtowy może zostać utworzony na jednym systemie, a następnie uruchomiony na innym, niezależnie od używanego sprzętu czy oprogramowania, co sprawia, że Java jest niezależna od platformy.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Jakie są główne cechy języka Java?

A

-Prostota: Java jest dość prosty do zrozumienia, a jego składnia jest intuicyjna.
-Niezależność od platformy: Możemy uruchomić ten sam program na dowolnym oprogramowaniu i sprzęcie, uzyskując ten sam wynik.
-Interpretowany: Java jest zarówno językiem kompilowanym, jak i interpretowanym.
-Solidność: Funkcje takie jak automatyczne zarządzanie pamięcią (Garbage Collection) czy obsługa wyjątków czynią język bardziej solidnym.
-Obiektowość: Java wspiera koncepcje obiektowe, takie jak klasy, obiekty i filary programowania obiektowego (OOP).
-Bezpieczeństwo: Możemy udostępniać aplikacje bez ujawniania kodu źródłowego, co czyni Javę bardziej bezpieczną.
-Wysoka wydajność: Jest szybsza niż tradycyjne języki interpretowane.
-Dynamiczność: Obsługuje dynamiczne ładowanie klas i interfejsów.
-Rozproszony charakter: Pozwala na dostęp do plików i metod z dowolnej maszyny połączonej w sieci.
-Wielowątkowość: Obsługuje wykonywanie wielu zadań jednocześnie za pomocą wątków.
-Neutralność architektury: Nie zależy od architektury sprzętowej.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Co to jest JVM?

A

JVM (Java Virtual Machine) to interpreter języka Java. Odpowiada za ładowanie, weryfikację i wykonanie kodu bajtowego utworzonego w Javie.

Chociaż JVM jest zależny od platformy (różne systemy operacyjne wymagają innej implementacji JVM), odgrywa kluczową rolę w czynieniu Javy niezależną od platformy.

Wykonuje kod, kompilacja do kodu maszynowego za pomocą JIT (Just-In-Time Compiler).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Co to jest JIT?

A

JIT (Just-In-Time) to kompilator będący częścią środowiska uruchomieniowego JRE (Java Runtime Environment). Jest on używany w celu poprawy wydajności aplikacji Java podczas ich działania. Jego działanie można opisać w następujących krokach:

Kod źródłowy jest kompilowany za pomocą javac, aby utworzyć kod bajtowy.
Kod bajtowy jest przekazywany do JVM.
JIT, będący częścią JVM, odpowiada za kompilowanie kodu bajtowego na natywny kod maszynowy w czasie wykonywania.
JIT aktywuje się, gdy wywoływana jest metoda. Dla skompilowanej metody JVM wywołuje bezpośrednio skompilowany kod zamiast go interpretować.

Dzięki temu JVM wywołuje skompilowany kod, co zwiększa wydajność i szybkość działania.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Jakie są rodzaje pamięci w JVM?

A

JVM składa się z następujących obszarów pamięci:

Obszar klasy (Class/Method Area): Przechowuje dane na poziomie klasy, takie jak stałe czasu wykonania, dane pól i metod oraz kod metod.
Sterta (Heap): Miejsce, gdzie tworzone i przechowywane są obiekty. Używana do przydzielania pamięci obiektom w czasie działania programu.
Stos (Stack): Przechowuje dane i częściowe wyniki potrzebne do zwracania wartości z metod oraz dynamicznego łączenia.
Rejestr licznika programu (Program Counter Register): Przechowuje adres aktualnie wykonywanej instrukcji JVM.
Stos metod natywnych (Native Method Stack): Przechowuje wszystkie natywne metody używane w aplikacji.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Co to jest ClassLoader?

A

ClassLoader jest częścią JRE. Podczas wykonywania kodu bajtowego ClassLoader odpowiada za dynamiczne ładowanie klas i interfejsów do JVM. Dzięki ClassLoaderowi system uruchomieniowy Javy nie musi znać szczegółów dotyczących plików i systemów plików.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Różnice między JVM, JRE i JDK

A

JVM (Java Virtual Machine):

JVM to maszyna wirtualna, która wykonuje kod bajtowy (bytecode) wygenerowany przez kompilator javac. Jej główne zadania to:

Interpretacja bytecode lub kompilacja go do kodu maszynowego za pomocą JIT (Just-In-Time Compiler).
Zarządzanie pamięcią (m.in. za pomocą Garbage Collectora).
Zapewnienie środowiska uruchomieniowego, które jest niezależne od platformy.

JRE (Java Runtime Environment):

JRE to środowisko uruchomieniowe Javy, które umożliwia wykonanie programów napisanych w Javie. Składa się z:

JVM (Java Virtual Machine), która odpowiada za uruchamianie aplikacji.
Zestawu bibliotek i klas bazowych (np. java.lang, java.util), które są niezbędne do działania programów.
Nie zawiera narzędzi programistycznych, takich jak kompilator.

JDK (Java Development Kit):

JDK to zestaw narzędzi dla programistów, które umożliwia tworzenie aplikacji w Javie. Zawiera:

JRE (a więc JVM i biblioteki).
Narzędzia deweloperskie, takie jak:
    javac – kompilator Javy.
    javadoc – generator dokumentacji.
    Debugger.
    Narzędzia do zarządzania plikami .jar (archiwami Javy).

Podsumowanie różnic:

JVM: Wykonuje kod bajtowy (część JRE).
JRE: Środowisko do uruchamiania aplikacji (zawiera JVM i biblioteki).
JDK: Narzędzia do tworzenia aplikacji (zawiera JRE oraz dodatkowe narzędzia programistyczne).
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Różnice między Java a C++

A

Różnice między C++ a Javą:

Platforma:
    C++: Jest zależny od platformy (kod kompilowany do binariów specyficznych dla danej platformy).
    Java: Jest niezależna od platformy dzięki JVM i bytecodowi.

Zastosowanie:
    C++: Używany głównie do programowania systemowego (np. systemy operacyjne, sterowniki, narzędzia niskopoziomowe).
    Java: Używana głównie do programowania aplikacyjnego (np. aplikacje biznesowe, mobilne, serwerowe).

Interakcja z hardware:
    C++: Jest bliżej sprzętu (nearer to hardware), co oznacza, że pozwala na bezpośrednie zarządzanie pamięcią i zasobami (np. wskaźniki, operacje na poziomie bitów). Nadaje się do pisania sterowników czy pracy z urządzeniami.
    Java: Abstrahuje sprzęt, działa w wirtualnym środowisku JVM, co ogranicza bezpośredni dostęp do hardware’u.

Globalny zasięg:
    C++: Obsługuje zmienne globalne oraz przestrzenie nazw (namespace scope).
    Java: Nie obsługuje globalnego zasięgu – wszystko musi znajdować się w klasie.

Różnice w funkcjonalności:
    Obsługiwane w C++, ale nie w Javie:
        goto
        wskaźniki
        wywołanie przez referencję (call by reference)
        struktury i unie
        wielokrotne dziedziczenie
        funkcje wirtualne
    Obsługiwane w Javie, ale nie w C++:
        wbudowana obsługa wątków (thread support)
        dokumentacyjne komentarze (/** ... */)
        przesunięcie unsigned w prawo (>>>).

Dziedziczenie i struktura klas:
    C++: Nie ma wymuszonej jednolitej hierarchii – można tworzyć klasy niezależne.
    Java: Wszystkie klasy dziedziczą po klasie bazowej Object (jednolita hierarchia).

OOP (Object-Oriented Programming):
    Oba języki są obiektowe, ale:
        C++: Jest bardziej elastyczny w konstrukcji obiektów (np. wielokrotne dziedziczenie).
        Java: Wymusza jednolitą strukturę obiektów, co czyni ją bardziej przewidywalną.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Wyjaśnij public static void main(String args[])

A

public: Dostęp publiczny, umożliwia JVM wywołanie tej metody spoza klasy.
static: Pozwala na używanie metody bez tworzenia instancji klasy.
void: Metoda nie zwraca wartości.
main: Określa główną metodę, którą JVM rozpoznaje jako punkt wejścia.
String args[]: Tablica argumentów przekazywanych z linii poleceń.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Co to jest String Pool w Javie?

A

String Pool to specjalne miejsce w pamięci sterty, gdzie przechowywane są wszystkie ciągi znaków (String) użyte w programie. Jeśli ciąg znaków już istnieje w puli, nowy zmienny odnosi się do istniejącego obiektu, zamiast tworzyć nowy. Przykład:

String str1 = “Hello”;
// “Hello” jest przechowywane w String Pool
// str1 jest przechowywane w pamięci stosu

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Co się stanie, jeśli nie zadeklarujemy metody main jako static?

A

Możemy zadeklarować metodę main bez użycia słowa kluczowego static i kompilator nie zgłosi błędu. Jednak metoda main nie będzie traktowana jako punkt wejścia programu lub aplikacji, co spowoduje, że program nie będzie działał poprawnie.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Co to są pakiety (Packages) w Javie?

A

Pakiety w Javie to grupowanie powiązanych typów, takich jak klasy, interfejsy itp., które umożliwiają zarządzanie dostępem oraz przestrzeniami nazw.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Dlaczego używamy pakietów w Javie?

A

Pakiety w Javie są używane w celu:

Unikania konfliktów nazw.
Kontrolowania dostępu do klas i interfejsów.
Ułatwienia wyszukiwania, lokalizowania oraz używania klas i interfejsów.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Jakie są zalety pakietów w Javie?

A

Pakiety w Javie oferują wiele korzyści:

Unikanie konfliktów nazw: Zapobiegają powtarzającym się nazwom klas w różnych pakietach.
Kontrola dostępu: Umożliwiają łatwiejsze zarządzanie dostępem do klas.
Ukrywanie klas: Możliwe jest tworzenie klas niewidocznych na zewnątrz pakietu.
Łatwość w organizacji: Łatwiej odnaleźć powiązane klasy w ramach pakietu.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Ile typów pakietów występuje w Javie?

A

W Javie istnieją dwa typy pakietów:

Pakiety zdefiniowane przez użytkownika (User-defined packages).
Wbudowane pakiety (Build-in packages).
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Wyjaśnij różne typy danych w Javie

A

W Javie istnieją dwa typy danych:

Typy prymitywne (Primitive Data Types).
Typy obiektowe (Non-Primitive Data Types).

Typy Prymitywne:

Są to proste wartości, które nie posiadają specjalnych właściwości. Oto 8 prymitywnych typów danych:

boolean: Przechowuje wartość true lub false.
byte: Przechowuje 8-bitową liczbę całkowitą ze znakiem (od -128 do 127).
char: Przechowuje pojedynczy 16-bitowy znak Unicode.
short: Przechowuje 16-bitową liczbę całkowitą ze znakiem.
int: Przechowuje 32-bitową liczbę całkowitą ze znakiem.
long: Przechowuje 64-bitową liczbę całkowitą ze znakiem.
float: Przechowuje 32-bitową liczbę zmiennoprzecinkową.
double: Przechowuje 64-bitową liczbę zmiennoprzecinkową.

Typy Obiektowe:

Nie przechowują bezpośrednio wartości, lecz odwołują się do adresu pamięci. Przykłady:

String.
Tablica (Array).
Klasa (Class).
Obiekt (Object).
Interfejs (Interface).
17
Q

Kiedy używamy typu danych byte?

A

byte to 8-bitowa liczba całkowita ze znakiem. Zakres wartości to od -128 do 127. Używany jest w sytuacjach, gdy:

Chcemy oszczędzić pamięć.
Wymagany zakres liczb mieści się między -128 a 127. Strumieniach wejścia/wyjścia (np. podczas pracy z plikami, gdy operujemy na danych binarnych).
18
Q

Czy możemy zadeklarować wskaźnik (Pointer) w Javie?

A

Nie, Java nie obsługuje wskaźników. Ze względów bezpieczeństwa Java nie zapewnia tej funkcji, aby zapobiec manipulacjom pamięci.

19
Q

Jaka jest domyślna wartość typu danych byte w Javie?

A

Domyślna wartość typu danych byte w Javie wynosi 0.

20
Q

Jakie są domyślne wartości typów float i double w Javie?

A

Domyślne wartości to:

float: 0.0f.
double: 0.0d.