Ez a szócikk tartalmában elavult, korszerűtlen, frissítésre szorul. Frissítsd időszerű tartalommal, munkád végeztével pedig távolítsd el ezt a sablont!
A Java alkalmazásokat jellemzőenbájtkód formátumra alakítják, de közvetlenül natív (gépi) kód is készíthető Java forráskódból. A bájtkód futtatása a Java virtuális géppel történik, ami vagy interpretálja a bájtkódot, vagy natív gépi kódot készít belőle, és azt futtatja az adott operációs rendszeren. Létezik közvetlenül Javabájtkódot futtató hardver is, az úgynevezettJava processzor.
A Java nyelv a szintaxisát főleg aC és aC++ nyelvektől örökölte, viszont sokkal egyszerűbb objektummodellel rendelkezik, mint a C++. AJavaScript szintaxisa és neve hasonló ugyan a Javához, de a két nyelv nem áll olyan szoros rokonságban, mint azt ezekből a hasonlóságokból gondolhatnánk.
Bár a nyelv neve kezdetbenOak (tölgyfa) volt (James Gosling, a nyelv atyja nevezte így az irodája előtt növő tölgyfáról), később kiderült, hogy ilyen elnevezésű nyelv már létezik, ezért végülJava néven vált ismertté. AJava szó aOraclevédjegye.
A Java nyelvet kávézás közben találták ki, innen ered a kávéscsésze ikon.[2]Négy fontos szempontot tartottak szem előtt, amikor a Javát kifejlesztették:
A nyelv első tulajdonsága, azobjektumorientáltság („OO”), a programozási stílusra és a nyelvstruktúrájára utal. Az OO fontos szempontja, hogy aszoftvert „dolgok” (objektumok) alapján csoportosítja, nem az elvégzett feladatok a fő szempont. Ennek alapja, hogy az előbbi sokkal kevesebbet változik, mint az utóbbi, így az objektumok (az adatokat tartalmazóentitások) jobb alapot biztosítanak egy szoftverrendszer megtervezéséhez. A cél az volt, hogy nagy fejlesztési projekteket könnyebben lehessen kezelni, így csökken az elhibázott projektek száma.
A Java legfontosabb része aJava virtuális gép (Java Virtual Machine – JVM). A JVM mindenütt jelen van (szinte mindenféle berendezés, chip és szoftvercsomag tartalmazza), így a nyelv középszintként és platformként egyaránt működik. Ugyanakkor a nyelv „platformfüggetlen” is, mert a Java virtuális gépekinterpretálják a szabványosJava bájtkódot. Ez azt jelenti, hogy egyPC-n megírt Java program minimális módosítás után ugyanúgy fog futni egy javástelefonon is. Innen jön azírd meg egyszer, futtasd bárhol kifejezés. Ez jelentős költségcsökkenést eredményez, mert a kódot csak egyszer kell megírni.
Ez a tulajdonság azt jelenti, hogy a Java nyelven írt programok a legtöbb hardveren (megközelítőleg) ugyanúgy futnak. Ezt úgy érik el, hogy a Javafordítóprogram a forráskódot csak egy úgynevezettJava bájtkódra fordítja le. Ez azután a virtuális gépen fut, ami az illetőhardver gépi kódjára fordítja[forrás?]. Léteznek továbbá szabványoskönyvtárcsomagok, amelyek – közvetítve a kód és a gép között – egységes funkcionalitásként teszik elérhetővé az illető hardver sajátosságait (grafika,szálak éshálózat).
Vannak olyan Java-fordítóprogramok, amelyek a forráskódot natív gépi kódra fordítják le – ilyen például aGCJ –, ezzel valamelyest felgyorsítva annak futtatását. Cserébe a lefordított program elveszíti hordozhatóságát.
A Sun Microsystemslicence ragaszkodik a különböző Java kivitelezések egymással való összeférhetőségéhez (felcserélhetőségéhez?)[forrás?]. Egyes cégek, mint például aMicrosoft, mégis platformfüggő sajátságokat adtak a nyelvhez, amire a Sun keményen reagált: beperelte a Microsoftot (az amerikai bíróság 20 millió dollár kártérítésre és a sajátos tulajdonságok visszavonására kötelezte a céget).
Válaszként a Microsoft kihagyta a Java rendszert a jövőbeli termékekből ésWindows-változatokból. Ez azt jelenti, hogy azInternet Explorerwebböngésző alapváltozataiból hiányzik a Java. Így abban az olyanweboldalak, amelyek Javát használnak, nem fognak helyesen megjelenni. A Windows-felhasználók e problémáját megoldva a Sun és más cégek ingyenesen letölthetővé tették a JVM rendszert azon Windows-változatok számára, amelyekből a virtuális gép hiányzik.
Ahordozhatóság megvalósítása technikailag nagyon bonyolult. E közben a Java esetében is sok vita volt. Az„írd meg egyszer, futtasd bárhol” szlogenből„írd meg egyszer,keress hibát mindenhol” lett. 2016-ra a hordozhatóság nem okoz tovább problémát, mivel maga a Java is nyílt szabványokra épül, pl. openGL v. Open POSIX vagy az RFC-k, a Java minden jelentősebb platformon elérhető (Linux,Unix, Windows, más rendszerek pl. AS/400).
Java 2016-ban is sikeres aszerver oldalon aservlet, aJSP ésEnterprise JavaBeans,JDBC technológiákkal, integrációs lehetőségeivel, nyelvi eszközeivel, jvm nyelveivel és a nyílt forráskódú közösség tudására is építve.
A Java rendszer volt az első, amely lehetővé tette a távoli gépeken való futtatást sandboxban (homokozóban). Egykisalkalmazás futtatható a felhasználó gépén (letöltve a Java kódot egyHTTP kiszolgálóról). A kód egy biztonságos környezetben fut, amely nem engedi meg "rossz szándékú" kód futtatását[forrás?]. A gyártók kiadhatnak olyan tanúsítványokat, amelyeket digitálisan aláírnak, ezzel a nevüket adva ahhoz, hogy a kisalkalmazás biztonságos. Így azok a felhasználó felügyelete alatt léphetnek ki a biztonságos környezetből.
A következő egyszerű program kiírja azt, hogy „Helló Világ!” az alapértelmezett kimeneti eszközre (ami általában a konzol, de lehet egyfájl vagy bármi más is).
A do…while ciklus hasonlóan a while ciklushoz, addig hajtja végre a belsejében lévő utasításokat, ameddig a feltétel igaz. A while és a do…while között annyi a különbség, hogy a while az utasítások lefuttatása előtt kiértékeli feltételt, így ha már az első alkalommal a feltétel hamis, a belsejében lévő utasítások egyszer sem futnak le. A do…while ezzel ellentétben viszont csak az utasítások lefuttatása után értékeli ki a kifejezést, tehát ebben az esetben egyszer mindenképpen végrehajtja a belsejében lévő utasításokat.
Az előbbi szerkezet kiváltható, ha ugyanazt az egész, felsorolható ill. string típusú (Java 1.7 óta[3]) kifejezést kell kiértékelni több esetben is. Így kevesebb karakter felhasználásával (rövidebb a kód), átláthatóbb megvalósítást kapunk.
Java 14-től elérhető egy rövidebb,break nélküli szintaxis, továbbá használható kifejezésként is, nem csak utasításként.[4]
// Rövidebb szintaxisswitch(egészkifejezés){casekonstansegészkifejezés->{utasítás(ok)}…default->{utasítás(ok)}}// Kifejezésvarváltozó=switch(egészkifejezés){casekonstansegészkifejezés:opcionálisutasítás(ok)yieldérték;…default:opcionálisutasítás(ok)yieldérték;};// Kifejezés és rövidebb szintaxisvarváltozó=switch(egészkifejezés){casekonstansegészkifejezés->érték;…default->érték;};
Java 21-től mintaillesztést is lehet végezni vele, és kezelhető anull érték is (ha nincs külön kezelve, akkor továbbra is kivételt okoz anull).[5] Például:
BooleanlogikaiÉrtékFeldolgozás(Objectérték){returnswitch(érték){// Egyszerű mintaillesztés: illesztés a típusracaseBooleanb->b;// Őrfeltételes mintaillesztéscaseStringswhens.equalsIgnoreCase("igaz")->true;caseStringswhens.equalsIgnoreCase("hamis")->false;// null érték kezelésecasenull->null;default->null;}}
A Java nyelvben a kivételtípusok osztályok, és közöttük is fennáll típushierarchia. Éppen ezért, ha többcatch ágat használunk egy blokkban, akkor mindig a speciálisabb típust kell korábban feltüntetni, mert acatch ágak kiértékelése fentről lefelé halad.
Egytry után kötelező legalább egycatch vagy egyfinally ágat tenni (az egyetlen kivételt lásd alább). Acatch ágakból több is lehet, de egytry blokk végén csak egyfinally lehet.
Ha kétcatch ág tartalma azonos, akkor ezek Java 1.7 óta összevonhatók, a típusokat| jellel elválasztva[6] (ez magyar billentyűzeten az Alt Gr+W billentyűkombinációval vihető be):
Szintén 1.7-es Java óta használható atry erőforrásokkal (angolultry-with-resources) konstrukció. Ez egy kényelmes megoldást kínál a használt erőforrások (megnyitott fájlok, hálózati kapcsolatok stb.) bezárására kivétel fellépése esetén is: az erőforrásclose metódusa lefut közvetlenül atry blokk elhagyása előtt, akár a blokk végét elérve hagyja el a vezérlés a blokkot, akár kivétellel. Ez az egyetlen típusútry blokk, aminél acatch ésfinally ágnak opcionálisak.[7]
A Java nem támogatja agoto utasítást, mivel ennek használataspagettikódot eredményezhet. Nagyon ritkán mégis szükség van a goto-ra, a Java lehetővé tesz alternatív megoldásokat, ami a címkézhetőcontinue ésbreak utasítás. Agotofenntartott szó és nem használhatóazonosítóként.
A Java nyelv két utasítást is ad a ciklusból való kilépéshez. A
continue;
utasítás megszakítja a folyamatban levő ismételgetést és egy újabbat kezd (ugyanúgy viselkedik, mint a ciklus elejére ugrógoto).
Hasonlóan, a
break;
utasítás teljesen kilép a ciklusból, és több ismételgetést nem hajt végre. A hatás ugyanaz, mint egygoto utasítás a cikluson kívülre.
A Javabreak éscontinue utasításai sokkal hatásosabbak, mint aC ésC++ hasonló nevű utasításai, mert képesek egy többszintű ciklusból is kilépni. (Csak annyi a teendő, hogy megcímkézzük a ciklust és hozzátoldjuk abreak vagycontinue utasításokhoz. Ugyanezt csakgoto utasítással lehet elérni C-ben és C++-ban.)
Példa:
kulso:while(true){belso:while(true){break;// kilépés a legbelső ciklusbólbreakbelso;// ugyancsak kilépés a legbelső ciklusbólbreakkulso;// kilépés a legkülső ciklusból}}
A tömb és akarakterlánc nem egyszerű típusok, hanem objektumok.A long és float változók inicializálásánál külön meg kell adni, hogy a begépelt szám melyik típusba tartozik: az egész szám literál végére L vagy f betűt írunk. A forráskódba begépelt, ilyen megjelölés nélküli egész számokat integer-ként, a lebegőpontos számokat pedig double-ként kezeli.
A Java a 16 bitesUnicode kódolást (azUTF-16-ot) használja. Ez tartalmazza a szabványosASCII-karaktereket, de ugyanakkor tartalmazza más nyelvek karakterkészletét is (pl: görög, cirill, kínai, arab stb.). A Java programok mindezeket a karakterkészleteket képesek használni, habár a legtöbb szerkesztőprogram csak a hagyományos ASCII karakterkészletet támogatja.
A Java egyik fontos tulajdonsága, hogy lehetővé tesziinterfészek létrehozását, amiket azosztályok megvalósíthatnak. Példa egy interfészre:
publicinterfaceTorolheto{publicvoidtorol();}
Ez az interfész csak annyit határoz meg, hogy minden, ami törölhető, biztosan rendelkeziktorol() eljárással. Ennek a fogalomnak több haszna is van, mint például:
publicclassFredimplementsTorolheto{@Overridepublicvoidtorol(){//Itt kötelező megvalósítani a torol() eljárást}}
Léteznek továbbájelölő interfészek, amelyeknek az implementálása nem jár metódus megvalósításával, csak egy bizonyos tulajdonsággal ruházzák fel az őket implementáló osztályt. Ilyen pl. a Serializable interfész. Az interfészek között is fennállhat öröklődési reláció. Ilyenkor ugyanúgy minden átöröklődik, ahogyan az osztályok esetében.
Egy absztraktként megjelölt osztálynak lehet nem megvalósított (csak deklarált, de nem implementált) metódusa. Példa:
// Kötelező kulcsszó az abstract, ekkor az osztálynak lehet absztrakt metódusa, de nem lehet példányapublicabstractclassElvont{privateintadat;publicElvont(intadat){this.adat=adat;}publicintgetAdat(){returnadat;}// Kötelező kulcsszó az abstract, ekkor nem szabad implementálni a metódustpublicabstractvoidmanipulal();}
Ennek értelmében az interfész egy olyan osztály, amely teljesen absztrakt, mert nem lehet megvalósított metódusa (ez alól kivételt képeznek a Java 8-ban bevezetett default metódusok). Egy absztrakt osztálynak, illetve egy interfésznek nem létezhetnek példányai, mert akkor futásidőben nem lenne adott a konkrét viselkedése (a hívott metódus törzse) – példányosítani csak az absztrakt osztályból leszármazó, illetve az interfészt megvalósító, konkrét (nem absztrakt) osztályt lehet. Ez a konkrét osztály lehet nevesített (hagyományos) vagy névtelen. Az utóbbi az absztrakt osztály (típus) egyszeri példányosítása, az absztrakt részének a példányosítás helyén történő kötelező megvalósításával. Példa:
...Torolhetoobj=newTorolheto(){@Overridepublicvoidtorol(){//Itt kötelező megvalósítani a torol() eljárást}};...obj.torol();// Ez itt így már érvényes...
Ha egy interfésznek egyetlen absztrakt (nem default) metódusa van, akkor az Java 8 óta funkcionális interfésznek minősül, és lambda kifejezéssel vagy metódusreferenciával is megvalósítható:[8][9]
...Torolhetoobj=()->{/* Itt kell megvalósítani a torol() eljárást */};Torolhetoobj2=System::gc;...
Ha egy osztály implementál egy vagy több interfészt, akkor az az(ok) által előírt (deklarált) minden metódust kötelezően meg kell valósítania (implementálnia kell), kivéve, ha az illető osztály absztrakt. Ekkor a megörökölt, de nem implementált metódusok az osztály meg nem valósított részét képezik. Példa:
publicabstractclassTorolhetoElvontextendsElvontimplementsTorolheto{// A következő kikommentezett rész mind megöröklődik/* private int adat; public Elvont(int adat) { this.adat = adat; } public int getAdat() { return adat; } // Kötelező kulcsszó az abstract, ekkor nem szabad implementálni a metódust public abstract void manipulal(); public abstract void torol(); */// Célszerű létrehozni konstruktort, amely lehetővé teszi a megörökölt adat inicializálásátpublicTorolhetoElvont(intadat){super(adat);}}
Lehetséges az öröklési lánc megszakítása; azaz egy osztály mondhatja magáról, hogy végleges. Ekkor belőle nem lehet örököltetni. Példa:
publicfinalclassVegleges{...}
Java 17-től lehetséges egy köztes állapot is: egy osztály vagy interfész meghatározhatja magáról, hogy mely osztályok/interfészek származhatnak le belőle, illetve valósíthatják meg. A szülőosztály/-interfész asealed kulcsszóval és apermits záradékkal határozhatja meg az engedélyezett altípusok körét, az altípusoknak pedig afinal,sealed ésnon-sealed kulcsszavak egyikével kell rendelkezniük az engedélyezett további altípusokról; anon-sealed kulcsszó az adott altípus tekintetében megszünteti a korlátokat (tehát ugyanazok a szabályok érvényesek az öröklődésre, mintha nem lenne semmilyen kulcsszó, anon-sealed csak azt szolgálja, hogy ez a szándék explicit legyen).[10] Például:
A következő kódrészlet bemutatja egy karakter beolvasását a felhasználótól, majd ennek kiíratását:
publicstaticvoidmain(String[]args)throwsjava.io.IOException{chara;System.out.println("Üdvözlöm! Kérem írjon be egy betűt.");a=(char)System.in.read();System.out.println("A beütött betű: "+a);}
A származtatáskor az alaposztály minden elemét átvette a származtatott osztály, de azeljaras() metódusát felüldefiniáltuk.
Alaposztály konstruktor meghívása asuper segítségével
publicclassSzarmaztatottextendsAlaposztaly{privateintmasikValtozo;//KonstruktorpublicSzarmaztatott(inti){//Alaposztaly konstruktoranak atadjuk a parametertsuper(i);masikValtozo=i;}}
Származtatáskor kizárólag egyetlen ősosztályt adhatunk meg, viszont tetszőleges számú interfészt implementálhatunk. Így elkerülhető egyrészt a leszármazási láncban a kör (egy osztály tranzitívan önmagától származzon), illetve a megvalósított részek ütközése.C++-ban egy osztálynak több közvetlen őse is lehet, de ekkor egyértelműen jelölni kell, hogy melyik közvetlen ős melyik megvalósított részét használjuk fel, viszont a kör ott sem lehetséges.
A Java 5-től kezdve megjelent az osztályok paraméterezhetővé tétele. A szintaxis hasonlít a C++ nyelv sablonjaihoz, bár a működése jelentősen eltér: míg a C++ a sablonokat fordítási időben „kitölti”, és a lefordított programban már konkrét, nem paraméteres típusok vannak, addig a Java generikus típusaiból kompatibilitási okokból a fordítóprogram – a fordítási idejű típusellenőrzést követően – egyszerűen eltávolítja a típusinformációkat.[11]
List<Integer>list=newArrayList<Integer>();
A generikus paraméter nem csak konkrét típus lehet, hanem alsó vagy felső korlát, illetve teljesen kötetlen is. A paraméter teljes elhagyásávalnyers típust kapunk, ami sok tekintetben hasonlít a kötetlen paraméterű típushoz, azonban kompatibilitási okokból (a nyers típus szintaxisa azonos a generikus típusok bevezetése előtti szintaxissal) bizonyos veszélyes műveleteket el lehet végezni velük, amiket a kötetlen paraméterrel nem.[12]
List<?>l1;// kötetlen: értékül kaphat List<String>-et, List<Integer>-t, List<Object>-et stb.List<?extendsNumber>l2;// felső korlát: értékül kaphat List<Number>-t, List<Integer>-t stb.List<?superInteger>l3;// alsó korlát: értékül kaphat List<Integer>-t, List<Number>-t vagy List<Object>-etListl4;// nyers típus
A Java 7-ben megjelent adiamond operátor, amely egyszerűsíti a szintaxist. Azértékadás jobb oldalán nem kell újból megismételni az osztály paraméterezését.[13]
A Java 5-ben jelentek meg afelsorolásos típusok (enums), amikkel egy korlátozott, konstans értékhalmaz tárolható, fordítási idejű ellenőrzésekkel. Más nyelvektől (pl. C, C++, C#) eltérően a típus értékei nem egész számok, hanem objektumok, így lehetnek adattagjaik, metódusaik, megvalósíthatnak interfészeket stb. Általában az egyes konstansok az enumosztály példányai, de amennyiben a kívánt viselkedés megvalósításához szükséges, lehet minden konstans egy-egy alosztály is.[14] Például:
Szintén a Java 5-ben jelentek meg azannotációk. Ezekkel különböző deklarációkhoz (típus, metódus, adattag, paraméter stb.) rendelhetők metaadatok, amelyek aztán visszanyerhetők – a@Retention metaannotációtól függően – fordítási vagy akár futási időben, amik felhasználhatók például kódgenerálásra vagy futás közben az annotált deklarációk kigyűjtésére.[15] Például:
// Egy fordítási idejű kódgenerálót megkér egy „builder” osztály generálására@GenerateBuilderClassclassTeszt{// Fordítási hibát okoz, ha nem írja felül a szülőosztály (Object) egy metódusát, például elgépelés miatt@OverridepublicStringtoString(){…}// Fordítási figyelmeztetést okoz, azt is dokumentálva, hogy mióta számít elavultnak@Deprecated(since="1.1")publicStringstringify(){…}// Statikus ellenőrzőknek jelzi, hogy a metódus visszaadhat null értéket@NullablepublicObjectgetValue(){…}}
A Java 16-ban jelentek meg arekordok, amik lényegesen egyszerűsítik a nem módosítható adatok összességét reprezentáló típusok létrehozását.[16] Például:
Minden lefordított class fájl a következő bájt sorozattal kezdődik:CAFEBABE, a 7-8. bájt pedig a class fájl verzióját adja meg. A következő táblázat az adott java verziókhoz tartozó class fájlok verzióit foglaljuk össze:
A Java nyelv története összeforrt a Sun Microsystems Java fordítójával ésvirtuális gépével és az ezekhez kapcsolódó fejlesztői programcsomaggal (Java SDK vagy újabban JDK –Java Development Kit), amely a Java nyelv és ahhoz kapcsolódó szabványok standard implementációjának tekinthető. A nyíltszabványt képviselő, de zárt forráskódú Java eszközök miatt sok kritikát kapott a Sun aFree Software Foundationtól. Valószínűleg ennek is köszönhető, hogy a Sun Microsystems2007-ben a Java SE (Standard Edition), Java ME (Micro Edition) és aJava EE (Enterprise Edition)GPL licenc alattnyílt forráskódúvá, azazszabad szoftverré teszi, ahogy ez már részben meg is történt a Java EE esetében, nem GPL-kompatibilis licenccel.
2006-ban megjelent egy változata a Java-nak JavaFX néven, ami egy szkriptnyelvet takar. Gyorsan egyszerűen tudunk vele asztali alkalmazásokat készíteni.
A JavaFX drasztikusan lerövidült termelési ciklust kínál a Java-fejlesztők és a webfejlesztők számára egyaránt, valamint megkönnyíti a grafikát, videót, audiót, animációt és gazdag szövegfunkciókat tartalmazó alkalmazások létrehozását. A JavaFX abból a szempontból egyedülálló, hogy egységesített fejlesztési és telepítési modellt kínál kifejezésteli, gazdag internetes alkalmazások (RIA) asztali számítógépen, böngészőn és mobilon történő kiépítéséhez. Ráadásul az új JavaFX mobil emulátor használata mellett a fejlesztők előzetesen megtekinthetik alkalmazásaikat a közeljövőben bevezetett JavaFX mobilplatformon, amely 2009 tavaszától lesz elérhető a Sun mobilpartnerei számára.[17]
AJava Development Kit(JDK) egyOracle termék Java fejlesztők számára, amely tartalmazza a Java fordítót (javac), egy teljes értékűJava Runtime Environment (JRE)-t, azaz Java futtató környezetet, és egyéb más fejlesztő eszközöket.
A JDK nyílt letöltésemegszűnt 2019. április 16-án új licenc[18] bevezetése miatt. Innentől kezdve egy Oracle fiók létezése szükséges a letöltéshez. Az Oracle az eddig openJDK-t tette meg java fő ágának és az Oracle JDK ennek egy leágazás, ami a nem nyílt kódú eszközöket is tartalmazza. Ezek köre fokozatosan csökken, az Oracle mind több java-s eszközének forráskódját tette át az openJdk kód bázisba.
AzOpenJDK, azaz a Java nyílt változatát, továbbra is lehet személyes adatok megadása nélkül használni, bármilyen célra.
A Java 19-től az Oracle Jdk-t megint le lehet tölteni szabadon és fel lehet használni ingyenesen bármilyen célra. 2023-től az Oracle Jdk subscription díjai megint változnak.
1.0 (1996) – kódneveOak (tölgy), ez volt az első verziója a Java virtuális gépnek és az osztálykönyvtáraknak. Ez a következő főbb eszközöket jelentette: jvm a java programok futtatásához, java plugin böngészőhöz, java fordító, debugger, applet viewer. Főbb könyvtárak léteztek már a grafikus megjelenítéshez (AWT), audio-hoz, animációhoz, és a hálózat kezeléshez. Nyelvi szinten a nyelvet jellemezték a következők: Objektum Orientáltság, C/C++-hoz hasonló szintaxis, 1 fájl 1 osztály elve, interface-ek, absztrakt osztályok. Továbbá jellemző volt még az interpretált végrehajtás is.
1.1 (1997) – itt jelent meg először abelső osztály fogalom – ami lehetővé teszi több osztály egymásba ágyazását –, valamint aJDBC az adatbázis kezeléshez,RMI a távoli metódus hívásokhoz, a Reflection API az osztály/példány elemzéshez, dinamikus példányosításhoz/metódus híváshoz.
1.2 (1998) – kódnevePlayground (játszótér), ez a verzió számottevő mérföldkő volt a nyelv evolúciójában. Azért, hogy ezt kihangsúlyozza, a Sun hivatalosanJava 2-nek nevezte el. Nyelvi szintű változások: megjelent astrictfp kulcsszó. API szintű változások: része lett aSwing grafikus API, a JVM-be belekerült aJIT-compiler,Java plugin,Java IDL-egy IDL fordító a CORBA alkalmazásokhoz,Collection framework.
1.3 (2000) – kódneveKestrel, csak néhány kisebb változtatást végeztek el rajta: ekkor került be a Hotspot JVM a rendszerbe, a Java Sound, a JNDI API is hivatalos része lett a belső rendszernek.Hozzáadtak egy új JPDA API-t a debuggoláshoz és a szintetikus proxy osztályokat.[19]
1.4 (2002) – kódneveMerlin. Nyelvi bővítés:assert kulcsszó a teszteléshez (ala JUnit). API változások: új API a reguláris kifejezések kezelésére (RegExp a Perl-ből), kivétel láncolás, NIO, Java logging API, Image IO, JAXP- XSLT és XML feldolgozáshoz, JCE, JSSE, JAAS – java biztonság, részévé vált a Java Web Start a vastag kliensek könnyebb webes futtatásához, update-eléséhez, Preferences API.[19]
5 (2004) – belső számozás szerint 1.5, kódneveTiger, újdonságai nyelvi szinten a generic-ek, a megszámlálható elemet tartalmazó tömbön való automatikus végighaladó ciklus, az adattípusok automatikus objektummá alakítása (autoboxing), típusbiztosenum, metódus argumetruma lehet változó számú (varargs C-szerűen), static import, metaadatok kezelése forrásfájlban (annotation),System.out.printf C-ből áthozása. Továbbá számos API bővítés, hozzáadás, és JVM változás is volt.[20]
6 (2006) – belső számozás szerint 1.6.0, kódneveMustang. Decemberben jelent meg a végleges változat kiterjesztett nyomkövetési és felügyeleti megoldásokkal, Java Scripting API: szkriptnyelvek támogatása (JVM-en belül ill. azon kívül),grafikusfelület-tervezést támogató kiegészítésekkel, Java Compiler API megjelenése,JDBC 4.0 –Apache Derby előrecsomagolva a JDK-ba, pluggable annotációk, SwingGUI elemek bővítése pl. rendezhető / szűrhető táblázatok, szinkronizáció és fordítás optimalizálása, Swing felület jelentős gyorsítása / optimalizálása,JAXWS,JAXB.[21]
7 (2011) – kódneveDolphin. 2011. július 28-ától érhető el hivatalosan. Főbb újdonságai a teljesség igénye nélkül: JVM támogatás a dinamikus nyelvekhez, nyelvi bővítések: Diamond operátor, String-ek engedélyezéseswitch utasításban,több kivétel kezelése egyszerre, automatikus erőforrás kezelés,egész számokban '_' használata a könnyebb tagolásért, új NIO2 könyvtár, GPU-t kihasználni képes XRender API a Java 2D-hez, Fork és Join keretrendszer a könnyebb párhuzamosság használatához.[22]
8 (LTS)(2014 április): Lambda kalkulus beépítése nyelvi szinten a Lambda projekt keretében, valamint a 7-be még nem beépített Coin projekt részek. Nashorn projekt egy Javascript motor beépítése, Date and Time API (Jodatime szerű megoldás), permanent generation eltávolítása.
Gyors verziókiadás (félévente):
9 (2017 szeptember): JDK modularizáció, amit a Jigsaw projekt keretében dolgoztak ki, Money and Currency API, nagyobb integráció a Java FX-szel, automatikus párhuzamosítás az OpenCL-lel.
10: Erről egyelőre viszonylag kevés tudható, várható pl. a primitív típusok teljes eltávolítása, és a 64 biten címezhető tömbök bevezetése, a nagy adathalmazok támogatásához.
11 (LTS): A var típus bevezetése
12: Új switch utasítás, Shenandoah GC bevezetése nagyon rövid GC felfüggesztési időkkel (10-500 ms),Microbenchmark suite hozzáadása,JVM constants API hozzáadása,AArch64 esetén 1 port használat a korábbi kettő helyett, G1 kiugrás kevert gyűjtések esetén, nem használt memória azonnali visszaadása G1 esetén
13 (2019 szeptember 17): dinamikus Class Data Sharing (CDS) archív listával,ZGC azonnal nem használt memória visszaadása, legacy Socket API újraírása, új switch utasítás bővítése yield-del, új szöveg blokkok bevezetése, ahol nem kell escape-elni, as-is használat
17 (LTS)
A 17-es verziótól az Oracle gyorsítja az LTS-esek piacra kerülését. Az eredeti tervek szerinti 3 éves ciklus 2 évesre módosul. A következő LTS a 21-es lesz, ami 2023-ban fog érkezni.