Przejdź do zawartości

Java

Z Wikipedii, wolnej encyklopedii
Java
Logo języka Java
Logo języka
Pojawienie się

23 maja 1995

Paradygmat

wieloparadygmatowy (obiektowy, imperatywny, funkcyjny, strukturalny, współbieżny)

Typowanie

statyczne, silne

Implementacje

OpenJDK

Aktualna wersja stabilna

Java SE 27 (15 września 2026)[1]

Twórca

James Gosling

Platforma sprzętowa

wieloplatformowy

Platforma systemowa

wieloplatformowy

Strona internetowa

Java – obiektowy, oparty na klasach, statycznie i silnie typowany język programowania ogólnego zastosowania, wspierający programowanie współbieżne[2]. Podstawą języka jest model obiektowy, jednak jego kolejne wersje wprowadziły również mechanizmy umożliwiające stosowanie elementów programowania funkcyjnego, w szczególności wyrażenia lambda, referencje do metod i interfejsy funkcyjne[3].

Kod źródłowy Javy jest zwykle kompilowany do niezależnego od konkretnego procesora kodu bajtowego, wykonywanego przez wirtualną maszynę Javy (JVM)[4]. JVM stanowi podstawę niezależności platformy Java od sprzętu i systemu operacyjnego, dzięki czemu ten sam skompilowany kod może być wykonywany na różnych platformach posiadających zgodne środowisko uruchomieniowe[5]. Współczesne implementacje JVM mogą podczas działania programu generować i dynamicznie optymalizować kod maszynowy. Alternatywny sposób wdrażania aplikacji oferuje GraalVM Native Image, wykorzystujący kompilację AOT do utworzenia natywnego pliku wykonywalnego dla określonego systemu operacyjnego i architektury, bez uruchamiania aplikacji na klasycznej JVM[6].

Język i platforma Java są rozwijane poprzez kolejne wydania Java SE i JDK. W nowszych wersjach języka wprowadzono m.in. rekordy, klasy zapieczętowane (sealed classes), dopasowywanie wzorców (pattern matching), możliwość używania instrukcji switch jako wyrażenia zwracającego wartość, bloki tekstowe oraz uproszczoną składnię prostych programów[7]. Platformę rozszerzono również m.in. o wątki wirtualne (virtual threads), lekkie wątki zarządzane przez środowisko JDK, umożliwiające obsługę bardzo dużej liczby współbieżnych zadań[8], oraz Foreign Function and Memory API, zapewniające dostęp do funkcji i pamięci spoza środowiska Java[9].

Historia

[edytuj | edytuj kod]

Początki Javy wiążą się z projektem Green, rozpoczętym w Sun Microsystems w 1991 roku przez Jamesa Goslinga, Patricka Naughtona i Mike’a Sheridana[10]. Celem projektu było opracowanie oprogramowania dla nowej generacji urządzeń elektroniki użytkowej, które mogły wykorzystywać różne architektury sprzętowe. Zespół potrzebował rozwiązania przenośnego i niezależnego od konkretnego procesora[11].

W ramach projektu James Gosling zaprojektował nowy język programowania, nazwany początkowo Oak[12]. W jego dalszym rozwoju znaczący udział mieli Ed Frank, Patrick Naughton, Jonathan Payne i Chris Warth[12]. W kolejnych latach język został ukierunkowany na zastosowania internetowe, przemianowany na Java i znacząco zmodyfikowany[12]. Jego ostateczną wczesną postać zdefiniowali James Gosling, Bill Joy, Guy Steele, Richard Tuck, Frank Yellin i Arthur van Hoff, przy udziale Grahama Hamiltona, Tima Lindholma i innych współpracowników[12].

Java została publicznie zaprezentowana przez Sun Microsystems w 1995 roku[13]. Jednym z podstawowych założeń projektu była możliwość wykonywania tego samego programu na różnych platformach sprzętowych i systemowych[14]. Koncepcję tę wyrażało hasło Write Once, Run Anywhere[13]. Pierwszą wersję JDK 1.0 wydano 23 stycznia 1996 roku[15].

W kolejnych wersjach rozwijano zarówno sam język, jak i bibliotekę standardową oraz wirtualną maszynę Javy. Java 1.2 została wydana w grudniu 1998 roku[16]. Od wersji 1.2 platformę określano jako Java 2 Platform[17], rozwijaną następnie w trzech głównych edycjach: Java 2 Platform, Standard Edition (J2SE), Java 2 Platform, Enterprise Edition (J2EE) oraz Java 2 Platform, Micro Edition (J2ME)[13]. J2SE była przeznaczona przede wszystkim dla komputerów osobistych i stacji roboczych, J2EE dla zastosowań korporacyjnych, a J2ME dla urządzeń o ograniczonych zasobach[13]. W 2005 roku nazwę J2ME zmieniono na Java ME, natomiast wraz z wersjami platform wydanymi na początku 2006 roku nazwy J2SE i J2EE zastąpiono odpowiednio przez Java SE i Java EE[18].

W 2006 roku Sun rozpoczął udostępnianie implementacji JDK jako otwartego oprogramowania, a w 2007 roku opublikowano większość kodu projektu OpenJDK na licencji GPLv2 z wyjątkiem Classpath[19][20].

W styczniu 2010 roku Oracle Corporation zakończył przejęcie Sun Microsystems i stał się zarządcą należących do tej firmy technologii Java[21].

Od 2018 roku kolejne główne wydania JDK ukazują się w regularnym, półrocznym cyklu[22].

Charakterystyka języka

[edytuj | edytuj kod]

Java jest językiem opartym na klasach i statycznym typowaniu. Specyfikacja języka określa go również jako język silnie typowany, co oznacza, że każda zmienna i każde wyrażenie mają określony typ, a wiele niezgodności typów jest wykrywanych podczas kompilacji[23].

Model obiektowy i system typów

[edytuj | edytuj kod]

Java rozróżnia osiem typów prostych: boolean, byte, short, int, long, char, float i double, oraz typy referencyjne, do których należą klasy, interfejsy i tablice[24].

Obiekty są instancjami klas. Klasa może określać stan obiektu za pomocą pól oraz jego zachowanie za pomocą metod. Język obsługuje m.in. enkapsulację, polimorfizm, klasy abstrakcyjne i interfejsy.

Wszystkie klasy, z wyjątkiem Object, mają bezpośrednią klasę nadrzędną. Java nie umożliwia wielokrotnego dziedziczenia klas, natomiast jedna klasa może implementować wiele interfejsów[25]. Od Java 8 interfejsy mogą zawierać również metody domyślne posiadające implementację.

Wszystkie zwykłe klasy dziedziczą ostatecznie po klasie java.lang.Object, która definiuje podstawowe operacje dostępne dla obiektów, m.in. equals(), hashCode(), toString() i getClass().

W kolejnych wersjach Javy model typów rozszerzano m.in. o klasy rekordowe (records), przeznaczone przede wszystkim do reprezentowania agregatów danych, oraz klasy i interfejsy zapieczętowane (sealed), pozwalające ograniczyć zbiór klas, które mogą po nich dziedziczyć. Rekordy stały się stałą częścią języka w Java 16, a klasy zapieczętowane w Java 17[26].

Typy generyczne

[edytuj | edytuj kod]

Java obsługuje typy generyczne, umożliwiające definiowanie klas, interfejsów i metod parametryzowanych typem. Mechanizm ten pozwala m.in. określać typ elementów kolekcji i wykrywać część błędów typów podczas kompilacji zamiast podczas wykonywania programu[27].

Implementacja generyków w Javie wykorzystuje mechanizm wymazywania typów (type erasure). Większość informacji dotyczących argumentów typów generycznych nie jest zatem reprezentowana w kodzie wykonywalnym w taki sam sposób jak zwykłe typy klas[28].

Elementy programowania funkcyjnego

[edytuj | edytuj kod]

Podstawowym modelem Javy pozostaje programowanie obiektowe, jednak od Java 8 język zawiera mechanizmy pozwalające stosować elementy programowania funkcyjnego. Wprowadzono wówczas wyrażenia lambda, referencje do metod oraz interfejsy funkcyjne[29].

Biblioteka standardowa udostępnia m.in. API strumieni (Stream API), pozwalające wykonywać operacje takie jak filtrowanie, przekształcanie i agregowanie sekwencji danych przy użyciu stylu deklaratywnego[30].

Dopasowywanie wzorców i rozwój składni

[edytuj | edytuj kod]

W nowszych wersjach języka rozwijany jest mechanizm dopasowywania wzorców (pattern matching). Java 16 wprowadziła jego wykorzystanie z operatorem instanceof, natomiast Java 21 wprowadziła wzorce rekordów oraz dopasowywanie wzorców w konstrukcji switch[26].

Od Java 14 konstrukcja switch może być również używana jako wyrażenie zwracające wartość. W kolejnych wydaniach wprowadzono ponadto m.in. bloki tekstowe, lokalne wnioskowanie typów przez var, nienazwane zmienne i wzorce oraz uproszczony sposób definiowania prostych programów[26].

Obsługa wyjątków

[edytuj | edytuj kod]

Java wykorzystuje wyjątki do obsługi sytuacji powodujących przerwanie zwykłego toku wykonywania programu. Każdy wyjątek jest reprezentowany przez obiekt klasy java.lang.Throwable lub jednej z jej podklas, w tym Exception i Error[31].

Język rozróżnia wyjątki kontrolowane (checked exceptions) oraz niekontrolowane. W przypadku wyjątków kontrolowanych kompilator wymaga ich obsłużenia albo zadeklarowania możliwości ich zgłoszenia w sygnaturze metody. Wymóg ten nie dotyczy klas dziedziczących po RuntimeException i Error[32].

Współbieżność

[edytuj | edytuj kod]

Mechanizmy programowania współbieżnego należą do podstawowych elementów platformy Java. Język definiuje m.in. synchronizację za pomocą słowa kluczowego synchronized[33], natomiast biblioteka standardowa zawiera pakiet java.util.concurrent oraz powiązane podpakiety, obejmujące m.in. pule wątków, kolejki współbieżne, blokady, semafory oraz typy atomowe[34].

Od Java 21 standardową częścią platformy są wątki wirtualne (virtual threads). Są to lekkie wątki zarządzane przez środowisko uruchomieniowe, których celem jest umożliwienie tworzenia aplikacji obsługujących bardzo dużą liczbę współbieżnych zadań przy zachowaniu modelu programowania opartego na wątkach[35].

Pakiety i moduły

[edytuj | edytuj kod]

Klasy i interfejsy są grupowane w pakiety, które tworzą przestrzenie nazw. Pełna nazwa klasy obejmuje nazwę pakietu, np. java.util.ArrayList. Nazwy pakietów mogą mieć strukturę wieloczłonową, lecz nie tworzą hierarchii dziedziczenia. Przykładowo java.util i java.util.concurrent są z punktu widzenia języka odrębnymi pakietami[36].

Od Java 9 platforma wykorzystuje także Java Platform Module System. Moduł grupuje pakiety i może jawnie określać zależności od innych modułów oraz pakiety udostępniane na zewnątrz. Standardowa biblioteka Java została podzielona na moduły, z których podstawowym jest java.base[37].

Kompilacja i wykonywanie programów

[edytuj | edytuj kod]

Kod bajtowy i JVM

[edytuj | edytuj kod]

Kod źródłowy Javy jest zazwyczaj przechowywany w plikach z rozszerzeniem .java. Standardowy kompilator javac przekształca go w pliki klas .class zawierające instrukcje kodu bajtowego[38].

Kod ten jest przeznaczony dla wirtualnej maszyny Javy (JVM), zdefiniowanej przez osobną specyfikację. JVM jest maszyną abstrakcyjną i nie określa jednej konkretnej implementacji. Specyfikacja definiuje m.in. format plików klas, zestaw instrukcji, obszary pamięci, mechanizmy ładowania i inicjalizacji klas oraz sposób wykonywania instrukcji[39].

Przed wykonaniem kodu JVM może przeprowadzić weryfikację plików klas. Weryfikator sprawdza m.in. poprawność typów i strukturę instrukcji, ograniczając możliwość wykonania niepoprawnego kodu bajtowego[40].

Niezależność od platformy

[edytuj | edytuj kod]

Kod bajtowy JVM nie odpowiada bezpośrednio zestawowi instrukcji jednego konkretnego procesora. Pozwala to wykonywać ten sam plik klas na różnych architekturach i systemach operacyjnych posiadających zgodną implementację JVM[41].

Przenośność nie oznacza całkowitej niezależności każdego programu od środowiska. Aplikacja może korzystać m.in. z natywnych bibliotek, właściwości systemu plików, urządzeń lub interfejsów systemu operacyjnego, przez co jej działanie może zależeć od konkretnej platformy[41].

Kompilacja JIT

[edytuj | edytuj kod]

Współczesne implementacje JVM nie ograniczają się do interpretowania kodu bajtowego. HotSpot, używany w OpenJDK, wykorzystuje kompilację JIT, w której kod jest kompilowany do instrukcji maszynowych w trakcie działania programu[42].

HotSpot stosuje profilowanie wykonywanego programu i może kompilować częściej wykonywane fragmenty z różnymi poziomami optymalizacji. Domyślnie wykorzystywana jest kompilacja warstwowa (tiered compilation), łącząca szybkie rozpoczęcie wykonywania z późniejszą optymalizacją często używanego kodu[43].

Kompilacja AOT i GraalVM Native Image

[edytuj | edytuj kod]

Alternatywnym modelem wykonywania programów Java jest kompilacja AOT. Jednym z rozwiązań stosujących ten model jest GraalVM Native Image, które analizuje aplikację i jej zależności podczas budowania, a następnie kompiluje wymagany kod do natywnego pliku wykonywalnego przeznaczonego dla konkretnego systemu operacyjnego i architektury[44].

Utworzony w ten sposób program nie jest wykonywany przez klasyczną JVM i zawiera potrzebne komponenty środowiska uruchomieniowego. Native Image pozwala m.in. ograniczyć czas uruchamiania i zużycie pamięci, lecz analiza wykonywana podczas budowania wymaga znajomości kodu osiągalnego w czasie działania, co ma znaczenie m.in. dla aplikacji intensywnie korzystających z refleksji lub dynamicznego ładowania klas[45].

Zarządzanie pamięcią

[edytuj | edytuj kod]

Java wykorzystuje automatyczne odśmiecanie pamięci. Programista tworzy obiekty, natomiast pamięć zajmowana przez obiekty, do których nie można już dotrzeć z aktywnej części programu, może zostać automatycznie odzyskana przez garbage collector[46].

Specyfikacja JVM nie narzuca konkretnego algorytmu odśmiecania. Implementacja HotSpot udostępnia kilka garbage collectorów dostosowanych do różnych wymagań dotyczących przepustowości, wykorzystania zasobów i opóźnień. W JDK 27 dostępne są m.in. Serial GC, Parallel GC, G1 oraz ZGC, przy czym G1 jest domyślnym wyborem HotSpot[47].

Automatyczne zarządzanie pamięcią eliminuje konieczność jawnego zwalniania pamięci obiektów, ale nie zapobiega wszystkim problemom związanym z pamięcią. Aplikacja może np. utrzymywać niepotrzebne referencje do obiektów, uniemożliwiając ich usunięcie[48].

Platforma Java

[edytuj | edytuj kod]

Termin Java odnosi się nie tylko do języka programowania, lecz także do rodziny technologii obejmującej maszynę wirtualną, bibliotekę standardową, narzędzia programistyczne oraz zestaw specyfikacji.

Java SE i biblioteka standardowa

[edytuj | edytuj kod]

Java Platform, Standard Edition (Java SE) definiuje podstawową platformę Java. Obejmuje specyfikację języka, specyfikację JVM oraz zestaw standardowych interfejsów programistycznych[49].

Biblioteka standardowa zawiera API dotyczące m.in. kolekcji, wejścia i wyjścia, obsługi plików, komunikacji sieciowej, współbieżności, daty i czasu, refleksji, kryptografii, XML, dostępu do baz danych oraz komunikacji z kodem natywnym[50].

Jednym z mechanizmów służących do współpracy z kodem spoza środowiska Java jest Foreign Function and Memory API. API to umożliwia wywoływanie funkcji z bibliotek natywnych oraz dostęp do pamięci znajdującej się poza stertą JVM i stanowi współczesną alternatywę dla części zastosowań JNI[51][52].

JDK i środowisko uruchomieniowe

[edytuj | edytuj kod]
Image Osobny artykuł: Java Development Kit.

Java Development Kit (JDK) jest zestawem narzędzi przeznaczonych do tworzenia i uruchamiania oprogramowania dla platformy Java. Zawiera środowisko uruchomieniowe oraz narzędzia takie jak kompilator javac, program uruchamiający java, generator dokumentacji javadoc, archiwizator jar, debugger i narzędzia diagnostyczne[53].

W starszych wersjach Java SE powszechnie rozróżniano JDK przeznaczone dla programistów i instalowane oddzielnie Java Runtime Environment (JRE), przeznaczone przede wszystkim do uruchamiania aplikacji. Współczesny model dystrybucji nie opiera się na osobnym systemowym JRE. Od JDK 9 dostępne jest narzędzie jlink, pozwalające budować obrazy środowiska uruchomieniowego zawierające tylko moduły potrzebne konkretnej aplikacji, a wraz z JDK 11 Oracle zakończył dystrybucję osobnego obrazu JRE jako części tradycyjnego modelu JDK[54].

Bezpieczeństwo

[edytuj | edytuj kod]

Mechanizmy bezpieczeństwa Javy występują na kilku poziomach. Sam język wykorzystuje kontrolę typów, kontrolę zakresów tablic oraz automatyczne zarządzanie pamięcią[55], natomiast JVM weryfikuje strukturę ładowanego kodu bajtowego[56].

Java SE zawiera ponadto rozbudowane API bezpieczeństwa. Java Cryptography Architecture (JCA) definiuje m.in. interfejsy dla funkcji skrótu, podpisów cyfrowych, szyfrowania, generatorów liczb losowych, zarządzania kluczami oraz mechanizmu dostawców implementacji kryptograficznych. Platforma zawiera również obsługę infrastruktury klucza publicznego oraz protokołów TLS i DTLS[57].

Historycznym elementem architektury bezpieczeństwa był SecurityManager, umożliwiający nakładanie ograniczeń na wykonywany kod. Mechanizm ten został oznaczony jako przeznaczony do usunięcia w JDK 17[58], a następnie trwale wyłączony w JDK 24[59].

Implementacje i dystrybucje JDK

[edytuj | edytuj kod]

Specyfikację języka Java i platformy Java SE należy odróżnić od ich konkretnych implementacji i dystrybucji.

OpenJDK i HotSpot

[edytuj | edytuj kod]

OpenJDK jest otwartą implementacją platformy Java SE i podstawą większości współczesnych dystrybucji JDK. Kod OpenJDK jest rozpowszechniany przede wszystkim na licencji GPLv2 z wyjątkiem Classpath[60].

Główną maszyną wirtualną wykorzystywaną w OpenJDK jest HotSpot. Obejmuje ona m.in. interpreter kodu bajtowego, kompilatory JIT, garbage collectory, system ładowania klas oraz mechanizmy diagnostyczne[61].

Dystrybucje OpenJDK

[edytuj | edytuj kod]

Na kodzie OpenJDK powstaje wiele dystrybucji JDK przygotowywanych przez różne organizacje. Należą do nich m.in. Oracle OpenJDK i Oracle JDK, Eclipse Temurin rozwijany przez Eclipse Adoptium, Amazon Corretto oraz Azul Zulu. Dystrybucje mogą różnić się obsługiwanymi systemami i architekturami, długością wsparcia, sposobem budowania i testowania, dodatkowymi poprawkami oraz warunkami licencyjnymi.

Eclipse Temurin jest dystrybucją OpenJDK testowaną pod kątem zgodności z Java SE[62]. Amazon określa Corretto jako wieloplatformową dystrybucję OpenJDK przeznaczoną do zastosowań produkcyjnych[63]. Azul Zulu jest również dystrybucją OpenJDK dostępną dla wielu platform[64].

Nie istnieje jedna licencja właściwa dla „języka Java”. Warunki licencyjne specyfikacji, znaków towarowych, OpenJDK i poszczególnych dystrybucji JDK stanowią odrębne zagadnienia[65][66].

Rozwój i wersje

[edytuj | edytuj kod]

Java Community Process i OpenJDK

[edytuj | edytuj kod]

Specyfikacje platformy Java są rozwijane w ramach Java Community Process (JCP). Propozycje i specyfikacje standaryzowane w tym procesie są publikowane jako Java Specification Requests (JSR)[67].

Rozwój implementacji JDK odbywa się przede wszystkim w społeczności OpenJDK. Większe zmiany projektu są często opisywane w dokumentach JDK Enhancement Proposal (JEP)[68]. JEP może dotyczyć zarówno zmian widocznych w specyfikacji Java SE, jak i zmian implementacyjnych niewymagających modyfikacji samego języka[68].

Cykl wydań i wersje LTS

[edytuj | edytuj kod]

Od JDK 10 nowe główne wydania JDK są publikowane w cyklu półrocznym, zwykle w marcu i we wrześniu. Numer wersji jest zwiększany dla każdego kolejnego wydania funkcjonalnego niezależnie od skali zawartych w nim zmian[69].

Niektóre wydania są przez dostawców JDK obejmowane długoterminowym wsparciem (LTS). LTS jest polityką wsparcia konkretnego dostawcy, a nie odrębnym rodzajem specyfikacji Java SE. W polityce Oracle wydaniami LTS są Java 8, 11, 17, 21 i 25. Java 25 jest najnowszym wydaniem LTS, natomiast Java 27, wydana 15 września 2026 roku, jest najnowszym wydaniem Java SE[70][71].

Ekosystem

[edytuj | edytuj kod]

Jakarta EE

[edytuj | edytuj kod]


Jakarta EE jest platformą przeznaczoną przede wszystkim do tworzenia aplikacji serwerowych i przedsiębiorstw. Wywodzi się z Java EE, której specyfikacje, implementacje referencyjne i zestawy testów zgodności zostały przekazane przez Oracle do Eclipse Foundation. W 2018 roku dla dalszego rozwoju platformy przyjęto nazwę Jakarta EE[72].

Jakarta EE jest rozwijana niezależnie od Java SE, ale wykorzystuje Java SE jako podstawową platformę wykonawczą.

JavaFX

[edytuj | edytuj kod]
Image Osobny artykuł: JavaFX.

JavaFX jest platformą przeznaczoną do tworzenia graficznych interfejsów użytkownika dla aplikacji Java. Została opracowana przez Sun Microsystems, a następnie rozwijana przez Oracle i społeczność projektu OpenJFX.

Od JDK 11 JavaFX nie jest częścią JDK i może być używana jako osobny zestaw modułów i bibliotek[73].

Java ME

[edytuj | edytuj kod]
Image Osobny artykuł: Java Platform, Micro Edition.

Java Platform, Micro Edition (Java ME) jest odmianą platformy Java przeznaczoną dla urządzeń o ograniczonych zasobach. Odegrała szczególnie istotną rolę w oprogramowaniu telefonów komórkowych i urządzeń wbudowanych przed upowszechnieniem współczesnych systemów mobilnych[74].

Zobacz też

[edytuj | edytuj kod]

Przypisy

[edytuj | edytuj kod]
  1. ↑ Consolidated JDK 27 Release Notes. Oracle, 2026-09-15. [dostęp 2026-09-20]. (ang.).
  2. ↑ The Java Language Specification, Java SE 27 Edition – Chapter 1. Introduction. Oracle. [dostęp 2026-09-20]. (ang.).
  3. ↑ Preface to the Java SE 8 Edition. Oracle. [dostęp 2026-09-20]. (ang.).
  4. ↑ The Java Language Specification, Java SE 27 Edition – Chapter 1. Introduction. Oracle. [dostęp 2026-09-20]. (ang.).
  5. ↑ The Java Virtual Machine Specification, Java SE 27 Edition – Chapter 1. Introduction. Oracle. [dostęp 2026-09-20]. (ang.).
  6. ↑ Native Image. GraalVM. [dostęp 2026-09-20]. (ang.).
  7. ↑ Java Language Changes Summary. Oracle. [dostęp 2026-09-20]. (ang.).
  8. ↑ JEP 444: Virtual Threads. OpenJDK. [dostęp 2026-09-20]. (ang.).
  9. ↑ Foreign Function and Memory API. Oracle. [dostęp 2026-09-20]. (ang.).
  10. ↑ James Gosling. Computer History Museum. [dostęp 2026-09-21]. (ang.).
  11. ↑ Java: The inside story. [w:] SunWorld Online [on-line]. 1995-07. [dostęp 2026-09-21]. (ang.).
  12. 1 2 3 4 James Gosling, Bill Joy, Guy Steele: Preface to the First Edition. [w:] The Java Language Specification [on-line]. Oracle. [dostęp 2026-09-21]. (ang.).
  13. 1 2 3 4 The Basics of J2ME. Sun Microsystems. [dostęp 2026-09-21]. (ang.).
  14. ↑ Introduction to Java in Oracle9i. Oracle. [dostęp 2026-09-21]. (ang.).
  15. ↑ Java Standardization. [dostęp 2026-09-21]. (ang.).
  16. ↑ Chapter 1. Introduction. [w:] The Java Virtual Machine Specification [on-line]. Oracle. [dostęp 2026-09-21]. (ang.).
  17. ↑ Java Technology Terminology. Oracle. [dostęp 2026-09-21]. (ang.).
  18. ↑ Java Naming Scheme. Oracle. [dostęp 2026-09-21]. (ang.).
  19. ↑ The OpenJDK Community TCK License Agreement (OCTLA). Oracle, 2018-10-15. [dostęp 2026-09-20]. (ang.).
  20. ↑ GNU General Public License, version 2, with the Classpath Exception. OpenJDK. [dostęp 2026-09-20]. (ang.).
  21. ↑ Oracle and Sun Overview and Frequently Asked Questions for Partners. Oracle, 2010. [dostęp 2026-09-20]. (ang.).
  22. ↑ JEP 322: Time-Based Release Versioning. OpenJDK. [dostęp 2026-09-20]. (ang.).
  23. ↑ The Java Language Specification, Java SE 27 Edition. Oracle. [dostęp 2026-09-20]. (ang.).
  24. ↑ The Java Language Specification – Chapter 4. Types, Values, and Variables. Oracle. [dostęp 2026-09-20]. (ang.).
  25. ↑ The Java Language Specification – Chapter 8. Classes. Oracle. [dostęp 2026-09-20]. (ang.).
  26. 1 2 3 Java Language Changes Summary. Oracle. [dostęp 2026-09-20]. (ang.).
  27. ↑ Types, Values, and Variables. [w:] The Java Language Specification [on-line]. Oracle. [dostęp 2026-09-21]. (ang.).
  28. ↑ The Java Language Specification – Type Erasure. Oracle. [dostęp 2026-09-20]. (ang.).
  29. ↑ Preface to the Java SE 8 Edition. Oracle. [dostęp 2026-09-20]. (ang.).
  30. ↑ java.util.stream. [w:] Java SE 25 & JDK 25 API Specification [on-line]. Oracle. [dostęp 2026-09-21]. (ang.).
  31. ↑ Exceptions. [w:] The Java Language Specification [on-line]. Oracle. [dostęp 2026-09-21]. (ang.).
  32. ↑ The Java Language Specification – Chapter 11. Exceptions. Oracle. [dostęp 2026-09-20]. (ang.).
  33. ↑ The synchronized Statement. [w:] The Java Language Specification [on-line]. Oracle. [dostęp 2026-09-21]. (ang.).
  34. ↑ java.util.concurrent. [w:] Java SE 25 & JDK 25 API Specification [on-line]. Oracle. [dostęp 2026-09-21]. (ang.).
  35. ↑ JEP 444: Virtual Threads. OpenJDK. [dostęp 2026-09-20]. (ang.).
  36. ↑ The Java Language Specification – Chapter 7. Packages and Modules. Oracle. [dostęp 2026-09-20]. (ang.).
  37. ↑ Packages and Modules. [w:] The Java Language Specification [on-line]. Oracle. [dostęp 2026-09-21]. (ang.).
  38. ↑ javac. [w:] Java Development Kit Version 26 Tool Specifications [on-line]. Oracle. [dostęp 2026-09-21]. (ang.).
  39. ↑ The Java Virtual Machine Specification, Java SE 27 Edition. Oracle. [dostęp 2026-09-20]. (ang.).
  40. ↑ The Java Virtual Machine Specification – Verification of class Files. Oracle. [dostęp 2026-09-20]. (ang.).
  41. 1 2 Chapter 1. Introduction. [w:] The Java Virtual Machine Specification [on-line]. Oracle. [dostęp 2026-09-21]. (ang.).
  42. ↑ Java HotSpot Virtual Machine Performance Enhancements. Oracle. [dostęp 2026-09-21]. (ang.).
  43. ↑ The java Command. Oracle. [dostęp 2026-09-20]. (ang.).
  44. ↑ Native Image. GraalVM. [dostęp 2026-09-20]. (ang.).
  45. ↑ Reachability Metadata. GraalVM. [dostęp 2026-09-20]. (ang.).
  46. ↑ The Heap. [w:] The Java Virtual Machine Specification [on-line]. Oracle. [dostęp 2026-09-21]. (ang.).
  47. ↑ Available Collectors. Oracle. [dostęp 2026-09-20]. (ang.).
  48. ↑ Troubleshooting Memory Leaks. [w:] Java Platform, Standard Edition Troubleshooting Guide [on-line]. Oracle. [dostęp 2026-09-21]. (ang.).
  49. ↑ Java Platform, Standard Edition & Java Development Kit Specifications Version 27. Oracle. [dostęp 2026-09-20]. (ang.).
  50. ↑ Java Platform, Standard Edition & JDK API Specification. Oracle. [dostęp 2026-09-21]. (ang.).
  51. ↑ Foreign Function and Memory API. [w:] Java Platform, Standard Edition Core Libraries Developer's Guide [on-line]. Oracle. [dostęp 2026-09-21]. (ang.).
  52. ↑ Restrictions on and Warnings from Accessing Native Code. [w:] Oracle JDK Migration Guide [on-line]. Oracle. [dostęp 2026-09-21]. (ang.).
  53. ↑ JDK Tool Specifications. Oracle. [dostęp 2026-09-21]. (ang.).
  54. ↑ Oracle JDK Migration Guide, Release 11. Oracle. [dostęp 2026-09-20]. (ang.).
  55. ↑ Types, Values, and Variables. [w:] The Java Language Specification [on-line]. Oracle. [dostęp 2026-09-21]. (ang.).
  56. ↑ Verification of class Files. [w:] The Java Virtual Machine Specification [on-line]. Oracle. [dostęp 2026-09-21]. (ang.).
  57. ↑ Java Security Overview. Oracle. [dostęp 2026-09-20]. (ang.).
  58. ↑ JEP 411: Deprecate the Security Manager for Removal. OpenJDK. [dostęp 2026-09-21]. (ang.).
  59. ↑ JEP 486: Permanently Disable the Security Manager. OpenJDK. [dostęp 2026-09-21]. (ang.).
  60. ↑ GNU General Public License, version 2, with the Classpath Exception. OpenJDK. [dostęp 2026-09-20]. (ang.).
  61. ↑ HotSpot Runtime Overview. OpenJDK. [dostęp 2026-09-21]. (ang.).
  62. ↑ Eclipse Temurin Statement of Java SE Compatibility. Eclipse Adoptium. [dostęp 2026-09-20]. (ang.).
  63. ↑ Amazon Corretto. Amazon Web Services. [dostęp 2026-09-20]. (ang.).
  64. ↑ Install Azul Zulu Builds of OpenJDK. Azul. [dostęp 2026-09-20]. (ang.).
  65. ↑ Oracle JDK License General FAQs. Oracle. [dostęp 2026-09-21]. (ang.).
  66. ↑ Java SE 8 Specification License. Oracle. [dostęp 2026-09-21]. (ang.).
  67. ↑ JSR Overview. Java Community Process. [dostęp 2026-09-20]. (ang.).
  68. 1 2 JEP 1: JDK Enhancement-Proposal & Roadmap Process. OpenJDK. [dostęp 2026-09-21]. (ang.).
  69. ↑ JEP 322: Time-Based Release Versioning. OpenJDK. [dostęp 2026-09-20]. (ang.).
  70. ↑ Oracle Java SE Support Roadmap. Oracle. [dostęp 2026-09-20]. (ang.).
  71. ↑ Consolidated JDK 27 Release Notes. Oracle, 2026-09-15. [dostęp 2026-09-20]. (ang.).
  72. ↑ Jakarta EE Frequently Asked Questions. Eclipse Foundation. [dostęp 2026-09-20]. (ang.).
  73. ↑ Oracle JDK Migration Guide, Release 11. Oracle. [dostęp 2026-09-20]. (ang.).
  74. ↑ Java ME Technology. Oracle. [dostęp 2026-09-21]. (ang.).

Linki zewnętrzne

[edytuj | edytuj kod]