Java è stato creato a partire da ricerche effettuate allaStanford University agli inizi deglianni novanta. Nel1992 nasce il linguaggio Oak (in italiano 'quercia'), prodotto daSun Microsystems e realizzato da un gruppo di esperti sviluppatori capitanati daJames Gosling.[1] Questo nome fu successivamente cambiato in Java (una varietà dicaffè indonesiana; il logo adottato è una tazzina per tale bevanda) per problemi dicopyright: il linguaggio di programmazione Oak esisteva già.[2]
Per facilitare il passaggio a Java ai programmatoriold-fashioned, legati in particolare a linguaggi come ilC++, lasintassi di base (strutture di controllo,operatori ecc.) è stata mantenuta pressoché identica a quella del C++[3][4]; tuttavia a livello di linguaggio non sono state conservate delle caratteristiche del C++ ritenute fonte di complessità non necessaria e che favorivano l'introduzione di determinati bug durante la programmazione, come l'aritmetica dei puntatori e l'ereditarietà multipla delle classi.[5] Per le caratteristiche orientate agli oggetti del linguaggio ci si è ispirati alC++ e soprattutto all'Objective C.[6]
In un primo momento Sun decise di destinare questo nuovo prodotto alla creazione di applicazioni complesse per piccoli dispositivi elettronici; fu solo nel1993 con l'esplosione diinternet che Java iniziò a farsi notare come strumento per iniziare a programmare per internet. Contemporaneamente Netscape Corporation annunciò la scelta di dotare il suo allora omonimo e celeberrimobrowser dellaJava Virtual Machine (JVM). Questo segna una rivoluzione nel mondo di Internet: grazie agliapplet le pagine web diventarono interattive a livello client, ovvero le applicazioni vengono eseguite direttamente sulla macchina dell'utente di internet e non su un server remoto. Per esempio gli utenti poterono utilizzare giochi direttamente sulle pagine web e usufruire di chat dinamiche e interattive.
Java fu annunciato ufficialmente il 23 maggio1995 a SunWorld. Il 13 novembre2006 la Sun Microsystems ha distribuito la sua implementazione del compilatore Java e della macchina virtuale sotto licenzaGPL. Non tutte le piattaforme Java sono libere. L'ambiente Java libero si chiama IcedTea.[7] L'8 maggio2007 Sun ha pubblicato anche le librerie, tranne alcuni componenti non di sua proprietà, sotto licenza GPL, rendendo Java un linguaggio di programmazione la cuiimplementazione di riferimento è libera.[8] Il linguaggio è definito da un documento chiamatoThe Java Language Specification, spesso abbreviatoJLS. La prima edizione del documento è stata pubblicata nel 1996.[9] Da allora il linguaggio ha subito numerose modifiche e integrazioni, aggiunte di volta in volta nelle edizioni successive. Il 17 settembre 2024 è stata rilasciata l'ultima versione, laJava SE 23.[9]
Sembra che il nome 'Oak' derivasse dal fatto che Gosling e i suoi colleghi, nel periodo in cui svilupparono il linguaggio, avessero avuto come unica compagnia quella di una quercia che si trovava proprio fuori dalla finestra dell'ufficio in cui lavoravano.Eliminato il nome 'Oak', gli ideatori del linguaggio si ispirarono al caffè presso il quale discutevano del progetto, (Java è una qualità di caffè dell'omonima isola dell'Indonesia), tanto che ilmagic number che identifica unfile dibytecode ottenuto dallacompilazione di un file Java è0xCAFEBABE, che ininglese significa ragazza (babe) del caffè (cafe)[10].Una leggenda metropolitana – mai confermata – aggiunge che tale nome è stato anche favorito, in un secondo momento e dagli stessi creatori, come acronimo per "Just Another Vacuum Acronym" ("Soltanto un altro vuoto Acronimo"), con riferimento ironico all'altissimo numero di abbreviazioni utilizzate in ambiente informatico.
Uno dei principi fondamentali del linguaggio è espresso dal mottoWORA (write once, run anywhere, ossia "scrivi una volta, esegui ovunque"): il codicecompilato che viene eseguito su una piattaforma non deve essere ricompilato per essere eseguito su una piattaforma diversa; infatti il prodotto della compilazione è in un formato chiamatobytecode che può essere eseguito da una qualunque implementazione di un processore virtuale dettoJava Virtual Machine; al 2014 Java risulta essere uno dei linguaggi di programmazione più usati al mondo, specialmente per applicazioniclient-server, con un numero di sviluppatori stimato intorno ai 9 milioni.[12][13]; un buon punto di partenza per imparare Java è il tutorial ufficiale[14].
Un programma minimale in Java deve obbligatoriamente contenere la definizione diclasse tramite la parola chiaveclass seguita dalnome_classe e ilmetodomain o metodo principale nonchéentry point del programma in cui vengono definitevariabili, oggetti e richiamati metodi statici su variabili e/o dinamici sugli oggetti.
Nell'esempio soprastante ilmain contiene l'istruzione per la stampa a video della stringaHello World; pur essendo perfettamente funzionante e semplice da comprendere, non viene sfruttata la filosofia ad oggetti che viene normalmente applicata ad ogni programma scritto in Java. Segue il codice sorgente di un programma che svolge lo stesso compito del precedente usando laprogrammazione orientata agli oggetti.
Il metodomain affida la stampa del messaggio a un oggetto creato apposta per questo compito, su cui è invocato il metodo dinamicoprint definito prima del main assieme alcostruttore della classe ovvero quel particolare metodo (con ugual nome della classe) che serve per inizializzare l'attributo della classetoPrint dell'oggetto creato/istanziato nel main. I metodi definibili possono essere dichiaratiprivati (contrassegnati dalla parola chiaveprivate) se richiamabili solo all'interno della stessa classe oppurepubblici (contrassegnati dalla parola chiavepublic) se richiamabili anche da altre classi, di tipostatico (contrassegnati dalla parola chiavestatic) se invocabili liberamente all'interno della classe (ad es. su variabili globali),dinamici se invocabili su oggetti.
Scrivendo nuove classi che supportano l'operazioneprint, si può adattare il programma per mostrare messaggi di tipi radicalmente diversi, lasciando ilmain pressoché immutato, cambiando soltanto la metà riga che segue ilnew. Per esempio si può considerare un messaggio la scritta in unafinestra che appare sullo schermo del computer in uso, oppure una stringa inviata su connessione di rete per apparire sulla finestra di un computerclient. Oppure il programma può dialogare con l'utente sullariga di comando o in una finestra (considerando il dialogo come un "messaggio interattivo").
Si può modificare radicalmente il comportamento del programma con modifiche circoscritte e in punti predisposti a priori (polimorfismo): il programma può resistere ad aggiornamenti ed esigenze non previste. Segue ilcodice sorgente di due programmi che mostrano lo stesso testo all'interno di unafinestra. Il primo crea una finestra standard dove viene scritta la stringa inserita come parametro mentre il secondo programma crea una finestra rispettando i parametri (ad esempio la grandezza della finestra) inseriti nel codice.
Il codice proposto crea degli oggetti utilizzati per gestire l'interfaccia grafica. Viene inizialmente creata una finestra il cui titolo èHello World!; all'interno di questa finestra viene inserita un'etichetta che contiene al centro la scrittaHello World!. Infine viene stabilita la dimensione della finestra che, finalmente, viene resa visibile assieme all'etichetta che porta la scritta da visualizzare. Anche in questo codice si fa uso della programmazione a oggetti, ma in un modo diverso: ilmain non conosce i meccanismi necessari per creare una interfaccia grafica sullo schermo e questi sono decisi dalle classi JFrame e JLabel che sono state predisposte a priori (incapsulamento).
Java è un linguaggiotype safe, atipizzazione statica, con unnominativetype system, e dotato dimanifest typing. In virtù di queste caratteristiche, viene generalmente considerato un linguaggio atipizzazione forte. Il linguaggio distingue chiaramente itipi primitivi che definiscono valori atomici daitipi strutturati che definiscono strutture dati composte. I tipi primitivi sono detti anchetipi atomici etipi base e sono definiti nelle specifiche di linguaggio: di ognuno sono noti l'insieme esatto dei valori ammessi e gli operatori supportati.
I tipi strutturati sono anchetipi riferimento, cioè definisconooggetti, e sono classi o interfacce. Tra queste, le classi degli array sono definite nelle specifiche di linguaggio; tutti gli altri tipi strutturati sono "definiti dall'utente" (user-defined), cioè dal programmatore. I tipi definiti dall'utente che sono legati al linguaggio per qualche motivo sono riuniti nel packagejava.lang e nei suoi sottopackage; il linguaggio stabilisce per alcuni di essi (Object,String,Iterable, e altri) delle regole sintattiche o semantiche aggiuntive.
I tipi riferimento includono le classi per la gestione delle stringhe, gli array e le collezioni (liste, mappe, ecc.).
Da tutto ciò consegue che i valori dei tipi basenon sono oggetti. Tuttavia per ogni tipo base è definita una corrispondente classe, definita in gergotipo wrapper otipo contenitore, nel packagejava.lang, classe che permette di incapsulare dentro un oggetto un valore di tipo primitivo. Opportuni metodi della classe wrapper permettono di ottenere l'oggetto che incapsula un certo valore, e il valore incapsulato da un certo oggetto.
Dalla versione 5.0 in poi sono supportati l'autoboxing e l'unboxing che permettono di convertire da tipo primitivo a corrispondente classewrapper e viceversa. Il compilatore, "dietro le quinte", traduce la conversione in una opportuna invocazione a metodo sulla classe contenitore; quindi non si tratta di una vera conversione, ma di unasintassi comoda che "nasconde" la creazione di un oggetto della classe wrapper. Come molti altri linguaggi di programmazione anche Java possiede tra lestrutture dati gliarray (vediarray in Java).
Valori costanti in Java si identificano con la parola chiave:final seguita dal tipo, nome della costante e dal valore assegnato:
final tipo_costante <nome_costante> = valore;
esempio:
finaldoublePREZZO=15.99;
Per convenzione i nomi delle costanti sono tutti maiuscoli.
Inoltre è possibile dichiararefinal anche un metodo oppure una classe quando si vuole impedire che si faccia overriding del metodo in una sottoclasse nel primo caso oppure impedire che venga creata un classe figlia a partire dalla classe in questione nel secondo caso
Java è un linguaggioobject-oriented. L'idea che sta alla base della OOP è di rappresentare le entità reali o astratte che determinano le dinamiche del problema risolto dal software sotto forma di entità unitarie, dotate di specifiche d'uso e di funzionamento definite a priori. Queste entità sono chiamateoggetti. Le specifiche che definiscono le caratteristiche di queste unità e in base a cui le stesse vengono create o in gergoistanziate, sono chiamateclassi. Java tuttavia non è un linguaggio ad oggetti puro, ma solamenteobject oriented (orientato agli oggetti): per esempio i valori dei tipi primitivi non sono oggetti.
Nel linguaggio Java gli oggetti sono dotati dicampi (definiti ancheattributi ovariabili di istanza odi esemplare) e dimetodi. I metodi sono abitualmente usati per implementare agevolmente molti altri costrutti che alcuni altri linguaggi forniscono nativamente, come la gestione degli eventi (implementata attraverso ilistener) o delle proprietà, implementate tramite gliaccessor method e, più in generale, con oggettiJavaBeans.
In Java non esistono le funzioni: i blocchi di codice che "non appartengono a nessun oggetto" sono implementati comemetodi statici di una certa classe e quindi sono sempre dei metodi. In Java si pone un forte accento sulla distinzione trainterfaccia eimplementazione di una classe o oggetto: la prima è l'insieme delle specifiche pubbliche di cui gli utilizzatori di un certo oggetto possono servirsi, mentre la seconda è l'insieme delle strutture interne e delle istruzioni eseguibili che, nel complesso, adempiono a tali specifiche. Il termineinterfaccia è usato anche in un'altra accezione, spiegata nel seguito.
Esempio di polimorfismo: dalla base comuneShape discendono molti tipi differenti, dotati di comportamenti diversi
È supportata l'ereditarietà tra tipi. Questo permette di stabilire lagerarchia delle classi che compongono un programma. Il linguaggio impone che a capo della gerarchia ci sia la nota classejava.lang.Object.[16]
In Java non esisteereditarietà multipla tra classi.[17] Da un lato questo vincolo permette di avere una gerarchia di classi lineare e previene gli svantaggi introdotti dall'ereditarietà multipla. Dall'altro esso viene agevolmente superato facendo ricorso alleinterfacce, ovvero a tipi analoghi alle classi, ma progettati apposta per essere estesi e soggetti a determinate restrizioni imposte dal linguaggio.[18][19] Di conseguenza esse forniscono alcuni vantaggi dell'ereditarietà multipla, come la possibilità che uno stesso oggetto appartenga a tipi diversi tra loro, senza gli svantaggi come l'ambiguità introdotta dal fatto che una classe possa ereditare implementazioni diverse di uno stesso metodo.
L'ereditarietà multipla in java si può anche simulare tramite ilpattern decorator, che se implementato correttamente, permette di "estendere" a runtime metodi e caratteristiche ad un oggetto.
Dopo l'avvento di Java l'ereditarietà singola si è gradualmente affermata comemodello standard di ereditarietà nelle tecnologie object-oriented ed è stata abbracciata anche dai linguaggi del framework.NETMicrosoft. Dal Java 8 è possibile sfruttare i default method delle interfacce per costruire una seppur limitata ereditarietà multipla. Questa non intacca la linea ereditaria principale che rimane singola, ma permette di ereditare metodi da più interfacce allo stesso tempo.[20]
Per sviluppare programmi in Java è teoricamente sufficiente un qualsiasieditor di testo; in pratica, se si vuole scrivere qualcosa di più del classicohello world, occorre unambiente di sviluppo integrato (IDE): esistono diversi IDE (Integrated Development Environment, ambiente di sviluppo integrato), alcuni gratuiti ed altri a pagamento.
Sun (oraOracle) mette a disposizione unsoftware development kit specifico, chiamatoJava Development Kit (oJDK), che include un certo numero di tool di uso comune, fra cuijavac,javadoc,jar, e altri, atti ad elaborare (compilare) ifile sorgenti e/o già compilati, includendo dunque ilJava Runtime Environment (JRE). Inoltre, nel 2019, Oracle ha rilasciato un nuovo interprete e compilatore dinamico chiamatoGraalVM, che dal 2023 vedrà alcune sue porzioni integrate all'interno diOpenJDK.[21][22] Essi lavorano sul codice già scritto e salvato sul sistema: nessuno di essi fornisce un ambiente visivo di scrittura con quelle caratteristiche che tornano utili nella realizzazione di programmi complessi come l'evidenziazione della sintassi tramite colori diversi, l'autocompletamento, o la possibilità di navigare tra i sorgenti tramite il click delmouse.
La Oracle stessa ha promosso lo sviluppo di un ambiente di sviluppo gratuito e open source chiamatoNetBeans, che può essere scaricato da solo[23], oppure (facoltativamente) con il JDK[24].
Un ambiente di sviluppo integrato open-source largamente utilizzato èEclipse, donato alla comunità di sviluppatori daIBM e il cui sviluppo è seguito da una enorme comunità di utenti.
Uno degli ambienti di sviluppo integrato commerciali più diffusi èJBuilder prodotto dallaBorland.
Un ambiente di sviluppo integrato che ha vinto diversi premi[25] èIntelliJ IDEA.
Un ambiente di sviluppo per Java gratuito, e soprattutto leggero, è BlueJ, di chiara impostazione didattica.
Un altro ambiente di sviluppo integrato per Java èJCreator, i cui pregi sono soprattutto la semplicità dell'interfaccia e la leggerezza.
I programmi scritti in linguaggio Java, dopo una fase iniziale dicompilazione con ottenimento del cosiddettobytecode, sono destinati all'esecuzione sullapiattaforma Java attraverso una fase diinterpretazione (per questo motivo il linguaggio Java è detto anche semi-interpretato) ad opera di unaJava Virtual Machine e in esecuzione hanno accesso alleAPI dellalibreria standard. Questi due passi forniscono un livello di astrazione che permette alleapplicazioni di essere interamenteindipendenti dal sistema hardware su cui esse saranno eseguite. Un'implementazione della piattaforma java è ilJava Runtime Environment (JRE), necessario per l'esecuzione del programma compilato, mentre per lo sviluppo dei programmi in Java a partire dal codice sorgente è necessario ilJava Development Kit (JDK) che include anche il JRE.
Schema che illustra il funzionamento delbytecode sulle diverse piattaforme.
L'esecuzione di programmi scritti in Java deve avere un comportamento simile in contesti di esecuzione diversi. Per raggiungere questo obiettivo si lavora su livelli diversi e il primo di essi è naturalmente il linguaggio che è stato progettato appositamente proprio per questo scopo. Ad esempio esso fornisce unasintassi unificata per definire lesezioni critiche, compito che in altri linguaggi si svolge tipicamente ricorrendo a librerie di terze parti o primitive di sistema.[26] Inoltre praticamente non lascia spazio ai comportamenti non definiti (undefined behavior) o dipendenti dall'implementazione dell'ambiente di esecuzione.
Le specifiche di linguaggio richiedono un ambiente di esecuzione che vigila sull'esecuzione del programma e che proibisce determinate operazioni che altrimenti risulterebbero insicure. Esse fanno riferimento esplicito allaJava Virtual Machine, indicandola come il destinatario tipico delbytecode prodotto dallacompilazione iniziale di un programma Java, e infatti il compilatorejavac incluso nel JDK compila proprio in bytecode. Tuttavia è possibile la compilazione verso architetture diverse, infatti è possibile produrrecodice oggetto specifico di un certosistema operativo servendosi di un compilatore apposito, ad esempio ilGNU Compiler Collection.
In linea di principio si dovrebbe essere in grado di scrivere il programma una sola volta e di farlo eseguire dovunque, di qui il famoso slogan di Sun: "write once, run everywhere". La portabilità è un obiettivo tecnicamente difficile da raggiungere e il successo di Java in questo ambito è materia di alcune controversie. Sebbene in effetti sia possibile scrivere in Java programmi che si comportano in modo coerente attraverso moltepiattaforme hardware diverse, questi dipendono dallemacchine virtuali che sono programmi a sé e che hanno inevitabilmente i lorobug, diversi l'una all'altra: per questo è nata una parodia dello slogan di Sun "Write once, run everywhere" ("Scrivi una volta, esegui ovunque"), che è diventato "Write once,debug anywhere" ("Scrivi una volta,correggi ovunque").[27]
Il linguaggio in sé definisce solo una minima parte dellelibrerie utilizzabili in combinazione con il linguaggio stesso. La parte restante è definita dalla piattaforma su cui il programma è eseguito. La Oracle mette a disposizione tre piattaforme ufficiali, ciascuna destinata ad ambiti diversi:
In aggiunta ilprogrammatore può utilizzare un numero arbitrario di librerie di terze parti. Queste librerie, contenute in varipackage, vengono utilizzate dalprogrammatore per utilizzare determinatimetodi oattributi comuni per semplificare e uniformare iprogrammi e renderli maggiormente leggibili ai programmatori. Esistono numerosissimi package utilizzabili dai programmatori nellinguaggio Java. Ad esempio esistono package:
Le specifiche di linguaggio non impongono una determinata sintassi per la documentazione dei sorgenti, tuttavia nel tempo si è imposto come formato standard quello riconosciuto dal toolJavadoc e regolato da specifiche ufficiali ben definite (seppure esterne al linguaggio)[28]. Questo standard prevede che la documentazione sia fornita all'interno di commenti inseriti direttamente nei sorgenti e dotati di una speciale formattazione, che viene ignorata dal compilatore, ma riconosciuta da tool specializzati. Ciò rende facile aggiornare la documentazione, in quanto essa accompagna direttamente l'elemento sintattico da essa marcato; inoltre, durante la lettura dei sorgenti di un programma, ciò permette di avere sott'occhio insieme le specifiche e l'implementazione dell'elemento di programma preso in considerazione.
Un altro strumento utilizzabile per la documentazione sono leannotazioni, introdotte nella terza versione delle specifiche di linguaggio[29]. Pur avendo una sintassi formalmente differente dai commenti Javadoc, esse sono usate per lo stesso scopo, cioè forniremetadati che descrivono le entità di programma marcate. Tuttavia, mentre i commenti riportano le specifiche in maniera discorsiva (seppure strutturata), le annotazioni per loro stessa natura sono ideali per l'elaborazione tramite i tool, più che per la lettura da parte di esseri umani. Inoltre, sotto opportune condizioni[30], le informazioni che forniscono sono compilate insieme al codice e possono essere lette perfino atempo di esecuzione, cosa che i commenti non possono fare.
Nel settembre 2017, Mark Reinhold, chief Architect della piattaforma Java, ha proposto di modificare il piano di pubblicazione, da una versione ogni due anni agli attuali sei mesi. Non tutte le versioni però hanno un supporto prolungato (LTS - Long Term Support), quest'ultime vengono pubblicate ogni 3 anni, attualmente sono LTS le versioni 21, 17, 11 e 8.
Vecchia versione non più supportata: J2SE 1.2 Playground
dicembre 1998
?
?
Vecchia versione non più supportata: J2SE 1.3 Kestrel
maggio 2000
?
?
Vecchia versione non più supportata: J2SE 1.4 Merlin
febbraio 2002
ottobre 2008
febbraio 2013
Vecchia versione non più supportata: J2SE 5.0 Tiger
settembre 2004
novembre 2009
aprile 2015
Vecchia versione non più supportata: Java SE 6 Mustang
dicembre 2006
aprile 2013
dicembre 2018 dicembre 2026, supporto a pagamento per Azul Platform Core[35] marzo 2026 per Liberica JDK BellSoft[36]
Vecchia versione non più supportata: Java SE 7 Dolphin
luglio 2011
aprile 2015
luglio 2022 marzo 2026 per Liberica JDK BellSoft[37]
Versione precedente ancora supportata: Java SE 8 (LTS)
marzo 2014
gennaio 2019 per uso commerciale Oracle dicembre 2030 per uso non commerciale Oracle dicembre 2030 per Azul Almeno maggio 2026 per AdoptOpenJDK Almeno maggio 2026 per Amazon Corretto marzo 2031 per Liberica JDK BellSoft[38]
dicembre 2030
Vecchia versione non più supportata: Java SE 9
settembre 2017
marzo 2018 per OpenJDK
Non disponibile
Vecchia versione non più supportata: Java SE 10
marzo 2018
settembre 2018 per OpenJDK
Non disponibile
Versione precedente ancora supportata: Java SE 11 (LTS)
settembre 2018
settembre 2026 per Azul Almeno ottobre 2024 per AdoptOpenJDK Almeno settembre 2027 per Amazon Corretto Almeno ottobre 2024 per Microsoft[39][40] marzo 2027 per Liberica JDK BellSoft[41]
Versione precedente ancora supportata: Java SE 17 (LTS)
settembre 2021
settembre 2029 per Azul Almeno settembre 2027 per Microsoft marzo 2030 per Liberica JDK BellSoft[42]
settembre 2029 o successivo settembre 2031 per Azul Platform Prime
Vecchia versione non più supportata: Java SE 18
marzo 2022
settembre 2022 per OpenJDK
Non disponibile
Vecchia versione non più supportata: Java SE 19
settembre 2022
marzo 2023 per OpenJDK
Non disponibile
Vecchia versione non più supportata: Java SE 20
marzo 2023
settembre 2023 per OpenJDK
Non disponibile
Versione precedente ancora supportata: Java SE 21 (LTS)
settembre 2023
settembre 2028 marzo 2032 per Liberica JDK BellSoft[43]
settembre 2031 per Oracle
Vecchia versione non più supportata: Java SE 22
marzo 2024
settembre 2024
?
Vecchia versione non più supportata: Java SE 23
settembre 2024
marzo 2025
?
Versione stabile corrente:Java SE 24
marzo 2025
settembre 2025
?
Versione futura: Java SE 25 (LTS)
settembre 2025
settembre 2028 per Oracle
Settembre 2033 per Oracle
Legenda:
Vecchia versione
Versione precedente ancora supportata
Versione corrente
Ultima versione di anteprima
Versione futura
Java fu inizialmente distribuito come Java Development Kit 1.0 (JDK 1.0). Questo comprende ilruntime Java (la virtual machine e le librerie di classi), e gli strumenti di sviluppo (il compilatore Java e altri strumenti). Successivamente, Sun fornì un pacchetto che comprendeva solo il runtime, chiamato Java Runtime Environment (JRE). Normalmente le persone si riferiscono ad una particolare versione di Java attraverso la versione del JDK (es. JDK 1.4) Le versioni JDK 1.2 e successive sono spesso chiamate Java 2. Per esempio, il nome ufficiale del JDK 1.4 è Java (TM) 2 Platform, Standard Edition 1.4.
Il linguaggio è rimasto stabile dal JDK 1.0 al JDK 1.4.x, con laJ2SE 5.0 sono state introdotte nuove funzionalità nel linguaggio. La libreria di classi che viene fornita con JDK è stata progressivamente ampliata e modificata in alcune parti.
Nel settembre 2017 Mark Reinhold, responsabile capo per la piattaforma Java ha proposto di pubblicare una nuova versione di Java ogni 6 mesi, invece di ogni 2 anni come avveniva precedentemente.
Versioni delle specifiche di linguaggio
I cambiamenti nel linguaggio sono formalizzati nelle specifiche di linguaggio. Ogni nuova edizione delle specifiche integra i cambiamenti richiesti fino a quel momento tramite leJava Specification Request e conseguentemente implementati nel compilatorejavac.
^in particolare è definito per lavorare su un qualunque oggetto che sia istanza dijava.lang.Iterable.
^ James Gosling, Bill Joy, Guy Steele, Gilad Bracha,Chapter 4. Types, Values, and Variables, inThe Java Language Specification, Third Edition.URL consultato il 6 maggio 2011.
^ James Gosling, Bill Joy, Guy Steele, Gilad Bracha,Chapter 9. Interfaces, inThe Java Language Specification, Third Edition.URL consultato il 7 maggio 2011.
^ William Wong,Write Once, Debug Everywhere, suelectronicdesign.com.URL consultato il 3 agosto 2008(archiviato dall'url originale il 21 marzo 2009).So far, the "write-once, run-everywhere" promise of Java hasn't come true. The bulk of a Java application will migrate between most Java implementations, but taking advantage of a VM-specific feature causes porting problems.
^Il tipo che definisce l'annotazione in uso deve essere stato marcato con la meta-annotazione@Retention. VediThe Java Language Specification, Interfaces, sujava.sun.com.URL consultato il 16 giugno 2011.