Interview Flashcards
Czy Java jest niezależna od platformy?
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.
Jakie są główne cechy języka Java?
-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.
Co to jest JVM?
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).
Co to jest JIT?
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.
Jakie są rodzaje pamięci w JVM?
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.
Co to jest ClassLoader?
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.
Różnice między JVM, JRE i JDK
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).
Różnice między Java a C++
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ą.
Wyjaśnij public static void main(String args[])
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ń.
Co to jest String Pool w Javie?
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
Co się stanie, jeśli nie zadeklarujemy metody main jako static?
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.
Co to są pakiety (Packages) w Javie?
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.
Dlaczego używamy pakietów w Javie?
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.
Jakie są zalety pakietów w Javie?
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.
Ile typów pakietów występuje w Javie?
W Javie istnieją dwa typy pakietów:
Pakiety zdefiniowane przez użytkownika (User-defined packages). Wbudowane pakiety (Build-in packages).