Java powstawała w czasach, gdy podstawowym językiem używanym przez programistów były języki C i C++, a jej początków należy się doszukiwać w roku 1990. kiedy to firma Sun Microsystems stworzyła projekt nowego języka , mającego na celu tworzenie programów całkowicie niezależnych od sprzętu czyli np.: procesorów, układów wejścia-wyjścia i systemu operacyjnego. Chcąc ułatwić łagodne przejście na programowanie w nowym języku, zapożyczono częściowo składnię języków C i C++, dzięki czemu już przy pierwszym zetknięciu się z tym językiem bez problemu można analizować kod źródłowy. W celu zachowania pełnej przejrzystości kodu i wyeliminowania elementów narażających programistów na popełnianie błędów, nie zapożyczono krytykowanych bądź uważanych za nadmiarowe konstrukcji pochodzących z języków C i C++. . Ze względów bezpieczeństwa i niezawodności celowo zrezygnowano z tych elementów C++, które prowadziły bądź do zmniejszenia czytelności kodu, bądź też stanowiły najczęstszy powód powstawania trudnych do wykrycia błędów. W ten sposób zrodził się w pełni obiektowy, prosty, wydajny i bezpieczny język programowania. W odróżnieniu od języka C++ wymagającego bibliotek kodu wewnętrznego będących instrukcjami specyficznymi dla konkretnej platformy, Java bazuje na "maszynie wirtualnej" (VM), tworzonej niezależnie dla każdego systemu operacyjnego. Maszyna wirtualna jest emulacją mikroprocesora, ze specjalnym zestawem instrukcji. Po kompilacji programu Javy rezultatem jest program składający się z tych instrukcji, zwanych "kodem pośrednim" lub "kodem bajtowym". Ponieważ maszyna wirtualna jest tworzona specjalnie dla każdego systemu operacyjnego, i implementuje ten sam zestaw kodów pośrednich, skompilowany program Java może zostać uruchomiony na jakiejkolwiek maszynie wirtualnej Javy, która dokładnie zrealizuje zestaw instrukcji kodów pośrednich To zapewnia niezależność od platformy i podstawę strategii języka Java "Write Once, Run Anywhere"tm (Napisz Raz, Urochom Gdziekolwiek). Programy Java mogą również korzystać z dynamicznych bibliotek i kodu wewnętrznego, nawet jeśli są one napisane w innych językach. To ogranicza wykorzystywanie przez aplikację Java kodu specyficznego dla platformy w danym systemie operacyjnym,ale dla niektórych aplikacji taka opcja jest do przyjęcia. Wydajność języka Java w porównaniu z wydajnością C++ jest niższa. Ostatnio jednak Sun Microsystems i inne firmy zajmujące się oprogramowaniem podjęły kroki w celu poprawy czasu wykonania kodu Java. Szybsze maszyny wirtualne, kompilatory optymalizujące sprawiają, że wydajność języka Java zbliża się do szybkości C++ i innych języków zależnych od platformy. Najszybsze aplikacje to zawsze te napisane w kodzie wewnętrznym przy instrukcjach zredukowanych do niezbędnego minimum, chociaż obecnie pojawiają się rzadko. Jest to czasochłonne zadanie, a coraz szybsze mikroprocesory sprawiają, że staje się coraz mniej potrzebne. Złożone aplikacje napisane w językach kodu wewnętrznego, jak C++ są często bardzo duże. Programistom łatwiej jest napisać nowy kod dla każdego zadania, które program musi wykonać, zamiast używać wspólnego kodu dla wielu zadań. Dzieje się tak częściowo dlatego, że języki te utrudniają programiście odczytanie i zrozumienie kodu innego programisty. W wyniku tego programy gwałtownie rosną, wymagając więcej pamięci i miejsca na dysku. Java jest językiem zorientowanym obiektowo, a program Java wymaga tylko kodu (pliku klas), który definiuje obiekty, jakich program wymaga do pracy. Proste programy Java mogą potrzebować tylko kilku kilobajtów miejsca na dysku i równie małej ilości pamięci RAM. Maszyna Wirtualna dostarcza definicji dla wszystkich standardowych obiektów Javy, z których aplikacja może korzystać. Strategia ta eliminuje konieczność ładowania lub instalacji niepotrzebnych bibliotek nie używanych przez program Java.