Java (linguaggio di programmazione): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m Collegamento al caffè Java piuttosto che caffè e Indonesia
Etichette: Modifica visuale Modifica da mobile Modifica da web per mobile
 
Riga 1:
{{Linguaggio di programmazione
[[Image:Java-Logo.png|right]]
|nome = Java
Il linguaggio '''Java''' &egrave; un [[linguaggio di programmazione]] orientato agli oggetti, creato da [[James Gosling]] e altri ingegneri di [[Sun Microsystems]]. Il gruppo iniziò a lavorare nel [[1991]], il linguaggio inizialmente si chiamava Oak. Java fu annunciato ufficialmente il [[23 maggio]] [[1995]] a <nowiki>SunWorld</nowiki>. La piattaforma di programmazione Java &egrave; fondata sul linguaggio stesso, sulla Java Virtual Machine (JVM) e sulle [[API]]. Java &egrave; un marchio registrato di Sun Microsystems.
|immagine = Java Logo.svg
|didascalia = Logo del linguaggio
|autore = [[James Gosling]] <small>(designer)</small>, [[Sun Microsystems]] <small>([[Programmatore informatico|programmatore]])</small>
|data = {{Data e tempo|23|05|1995}}
|utilizzo = [[General purpose]]
|paradigmi = Multi-paradigma: generico, [[Programmazione orientata agli oggetti|orientato agli oggetti]] (basato sulle classi), [[Programmazione funzionale|funzionale]], [[Programmazione imperativa|imperativo]], [[Riflessione (informatica)|riflettivo]], calcolo simultaneo
|tipizzazione = [[Tipizzazione forte|Forte]]
|specifiche = {{cita testo|url=https://docs.oracle.com/javase/specs/jls/se17/jls17.pdf|titolo=The Java Language Specification, Java SE 17}}
|estensione = .java, .class, [[JAR (formato di file)|.jar]], .jmod
|influenzato_da = [[Simula]], [[Ada (linguaggio di programmazione)|Ada 83]], [[C++]], [[Eiffel (linguaggio)|Eiffel]], [[Generic Java]], [[Mesa (linguaggio)|Mesa]], [[Modula-3]], [[Oberon (linguaggio)|Oberon]], [[Objective-C]], [[UCSD Pascal]], [[Smalltalk]]
|ha_influenzato = [[Ada (linguaggio di programmazione)|Ada 2005]], [[BeanShell]], [[C sharp|C#]], [[Clojure]], [[D (linguaggio)|D]], [[ECMAScript]], [[Groovy]], [[J sharp|J#]], [[JavaScript]], [[Kotlin (linguaggio di programmazione)|Kotlin]], [[PHP]], [[Python]], [[Scala (linguaggio di programmazione)|Scala]], [[Seed7]], [[Vala (linguaggio di programmazione)|Vala]]
|implementazione_riferimento = interprete con JITter
|sistema_operativo = [[Windows]], [[Linux]], [[macOS]]
|licenza = [[GNU General Public License]], [[Java Community Process]]
|sito_web = {{cita testo|url=https://oracle.com/java/|titolo=oracle.com/java/}}<br/>{{cita testo|url=https://java.com|titolo=java.com}}
}}
 
In [[informatica]] '''Java''' è un [[linguaggio di programmazione ad alto livello]], [[Programmazione orientata agli oggetti|orientato agli oggetti]] e a [[tipizzazione statica]], che si appoggia sull'[[piattaforma Java|omonima piattaforma]] software di [[esecuzione (informatica)|esecuzione]], specificamente progettato per essere il più possibile indipendente dalla [[piattaforma (informatica)|piattaforma]] [[hardware]] di [[esecuzione (informatica)|esecuzione]] (tramite [[compilazione]] in [[bytecode]] prima e [[interprete (informatica)|interpretazione]] poi da parte di una [[Java Virtual Machine|JVM]]) (sebbene questa caratteristica comporti prestazioni in termini di computazione inferiori a quelle di linguaggi direttamente compilati come [[Linguaggio C|C]] e [[C++]] ovvero dunque perfettamente adattati alla piattaforma hardware).
== Panoramica ==
Java venne creato per soddisfare quattro scopi:
# essere orientato agli oggetti
# essere indipendente dalla piattaforma
# contenere strumenti e librerie per il networking
# essere progettato per eseguire codice da sorgenti remote in modo sicuro
 
== Storia ==
== Orientamento agli Oggetti ==
[[File:James Gosling 2008.jpg|miniatura|sinistra|[[James Gosling]], autore di Java]]
La prima caratteristica, l'orientamento agli oggetti, si riferisce a un moderno metodo di programmazione e progettazione. L'idea principale della programmazione ad oggetti consiste nel rendere il software la rappresentazione di entità reali o astratte ma ben definite (oggetti). Il suo obiettivo &egrave; di rendere pi&ugrave; facile la gestione di grandi progetti, migliorarne la qualit&agrave; e la manutenibilità.
Java è stato creato a partire da ricerche effettuate alla [[Stanford University]] agli inizi degli [[anni novanta]]. Nel [[1992]] nasce il linguaggio Oak (in italiano 'quercia'), prodotto da [[Sun Microsystems]] e realizzato da un gruppo di esperti sviluppatori capitanati da [[James Gosling]].<ref name="JLS, prefazione alla prima edizione">{{cita web|url=http://java.sun.com/docs/books/jls/third_edition/html/j.preface.html|titolo=The Java Language Specification|accesso=5 maggio 2011}}</ref> Questo nome fu successivamente cambiato in Java (una varietà di [[Java (caffè)|caffè indonesiana]]; il logo adottato è una tazzina per tale bevanda) per problemi di [[copyright]]: il linguaggio di programmazione Oak esisteva già.<ref>{{cita web|url=http://www.javaworld.com/javaworld/jw-10-1996/jw-10-javaname.html|titolo=JavaWorld.com, "So why did they decide to call it Java?"|accesso=5 maggio 2011|urlarchivio=https://web.archive.org/web/20090803031758/http://www.javaworld.com/javaworld/jw-10-1996/jw-10-javaname.html|urlmorto=sì}}</ref>
 
Per facilitare il passaggio a Java ai programmatori ''old-fashioned'', legati in particolare a linguaggi come il [[C++]], la [[sintassi]] di base ([[struttura di controllo|strutture di controllo]], [[operatore (informatica)|operatori]] ecc.) è stata mantenuta pressoché identica a quella del C++<ref>Come indicato in {{cita web|url=http://java.sun.com/docs/white/langenv/Intro.doc2.html#349|titolo=Design Goals of the Java(TM) Programming Language: Simple, Object Oriented, and Familiar|accesso=6 maggio 2011}}</ref><ref>{{cita testo|url=http://java.sun.com/docs/white/langenv/Intro.doc2.html#349|titolo=The Java Language Environment<!-- Titolo generato automaticamente -->}}</ref>; tuttavia a livello di linguaggio non sono state introdotte caratteristiche ritenute fonte di complessità non necessaria e che favoriscono l'introduzione di determinati bug durante la programmazione, come l'aritmetica dei puntatori e l'ereditarietà multipla delle classi.<ref>{{cita testo|url=http://java.sun.com/docs/white/langenv/Simple.doc2.html|titolo=The Java Language Environment<!-- Titolo generato automaticamente -->}}</ref> Per le caratteristiche orientate agli oggetti del linguaggio ci si è ispirati al [[C++]] e soprattutto all'[[Objective C]].<ref>{{cita testo|url=http://java.sun.com/docs/overviews/java/java-overview-1.html#HEADING1-13|titolo=The Java(tm) Language: An Overview<!-- Titolo generato automaticamente -->}}</ref>
== Indipendenza dalla piattaforma ==
La seconda caratteristica, l'indipendenza dalla piattaforma, significa che l'esecuzione di programmi scritti in Java deve avere un comportamento simile su hardware diverso. Si dovrebbe essere in grado di scrivere il programma una volta e farlo eseguire dovunque. Questo &egrave; possibile con la compilazione del codice di Java in istruzioni dette bytecode -- istruzioni semplificate conformi ad uno standard. Esso viene eseguito da una virtual machine, cioè da un interprete: Java è quindi, in linea di massima, un linguaggio interpretato.
Inoltre, vengono fornite librerie standardizzate per permettere l'accesso alle caratteristiche della macchina (come grafica e networking) in modo unificato. Il linguaggio Java include anche il supporto per i programmi con [[multithreading|multithread]], necessario per molte applicazioni che usano la rete.
 
In un primo momento Sun decise di destinare questo nuovo prodotto alla creazione di applicazioni complesse per piccoli dispositivi elettronici; fu solo nel [[1993]] con l'esplosione di [[internet]] 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 celeberrimo [[browser]] della [[Java Virtual Machine]] (JVM). Questo segna una rivoluzione nel mondo di Internet: grazie agli [[applet]] 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.
Le prime implementazioni del linguaggio usavano una virtual machine interpretata per ottenere la massima portabilit&agrave;, ma questa è una soluzione poco efficiente e i programmi interpretati sono molto lenti: per questo, tutte le implementazioni recenti di macchine virtuali Java hanno incorporato un JIT compiler, cioè un compilatore interno che al momento del lancio traduce al volo il programma bytecode Java in un normale programma nel linguaggio macchina del computer ospite; inoltre questa ricompilazione è ''dinamica'', cioè la virtual machine analizza costantemente il modello di esecuzione del codice (''profiling'') e ottimizza ulteriormente le parti più frequentemente eseguite mentre il programma sta girando. Questi accorgimenti, a prezzo di una piccola attesa in fase di lancio del programma, permette di avere delle applicazioni Java decisamente più veloci e leggere. Tuttavia, anche così Java resta un linguaggio meno efficiente dei linguaggi compilati come il C++, scontando il fatto di possedere degli strati di astrazione in più e di implementare una serie di automatismi, come la garbage collection, che se da un lato fanno risparmiare tempo ed errori in fase di sviluppo dei programmi dall'altro consumano memoria e tempo di CPU in fase di esecuzione del programma finito.
 
Java fu annunciato ufficialmente il 23 maggio [[1995]] a SunWorld. Il 13 novembre [[2006]] la Sun Microsystems ha distribuito la sua implementazione del compilatore Java e della macchina virtuale sotto licenza [[GNU General Public License|GPL]]. Non tutte le piattaforme Java sono libere. L'ambiente Java libero si chiama IcedTea.<ref>"Q: What components of the JDK software are you open sourcing today? A: We're open sourcing the Java programming language compiler ("javac"), and the Java HotSpot virtual machine."{{cita testo|url=http://www.sun.com/software/opensource/java/faq.jsp#b2|titolo=Free and Open Source Java FAQ|urlarchivio=https://web.archive.org/web/20120303230525/http://www.oracle.com/us/sun/index.htm#b2 }}; the source is being released via the {{cita testo|url=https://openjdk.dev.java.net/|titolo=OpenJDK|urlarchivio=https://web.archive.org/web/20070611104244/https://openjdk.dev.java.net/ }} project.</ref> L'8 maggio [[2007]] Sun ha pubblicato anche le librerie, tranne alcuni componenti non di sua proprietà, sotto licenza GPL, rendendo Java un linguaggio di programmazione la cui implementazione di riferimento è libera.<ref>{{Cita web| url=http://mail.openjdk.java.net/pipermail/announce/2007-May.txt| titolo=Open JDK is here!| editore=Sun Microsystems| data=8 maggio 2007| accesso=9 maggio 2007}}</ref> Il linguaggio è definito da un documento chiamato ''The Java Language Specification,'' spesso abbreviato ''JLS''. La prima edizione del documento è stata pubblicata nel 1996.<ref name="JLS su java.sun.com">{{cita web|url=http://java.sun.com/docs/books/jls/|titolo=The Java Language Specification|accesso=5 maggio 2011}}</ref> 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, la ''Java SE 23''.<ref name="JLS su java.sun.com"/>
La portabilit&agrave; &egrave; un obiettivo tecnicamente difficile da raggiungere, e il successo di Java in questo ambito &egrave; materia di alcune controversie. Sebbene sia in effetti possibile scrivere in Java programmi che si comportano in modo consistente attraverso molte piattaforme diverse, bisogna tenere presente che questi poi dipendono dalle virtual machine, che sono programmi a sè e che hanno inevitabilmente i loro [[Glossario_informatico#B|bug]], diversi dall'una all'altra: per questo è nata una parodia dello slogan di Sun "Scrivi una volta, esegui dovunque", che è diventato "Scrivi una volta, fai il [[Glossario_informatico#D|debug]] ovunque".
===Nome===
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 (caffè)|Java]] è una qualità di caffè dell'[[Giava|omonima isola]] dell'[[Indonesia]]), tanto che il [[magic number]] che identifica un [[file]] di [[bytecode]] ottenuto dalla [[compilatore|compilazione]] di un file Java è <code>0xCAFEBABE</code>, che in [[Lingua inglese|inglese]] significa ragazza (babe) del caffè (cafe)<ref>{{Cita web |url=http://radio.weblogs.com/0100490/2003/01/28.html |titolo=James Gosling private communication to Bill Bumgarner |accesso=1º agosto 2011 |urlarchivio=https://web.archive.org/web/20090523111129/http://radio.weblogs.com/0100490/2003/01/28.html |urlmorto=sì }}</ref>.
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.
 
== Descrizione ==
== Esecuzione sicura del codice remoto ==
La piattaforma Java fu uno dei primi sistemi a fornire un largo supporto per l'esecuzione del codice da sorgenti remote. Una [[applet|applet Java]] pu&ograve; essere avviata nel browser dell'utente, eseguendo codice scaricato da un server HTTP remoto. Questo codice viene eseguito in un'area (''sandbox'') altamente ristretta, che protegge l'utente dalla possibilit&agrave; che il codice sia malevolo o abbia un comportamento non desiderato; chi pubblica il codice pu&ograve; applicare un certificato che usa per firmare digitalmente le applet dichiarandole "sicure", dando loro il permesso di uscire dall'area ristretta e accedere al filesystem e al network, presumibilmente con l'approvazione e sotto il controllo dell'utente.
 
=== ValutazionePrincipi ===
Java venne creato per cinque obiettivi primari:<ref>{{cita web|url=http://java.sun.com/docs/white/langenv/Intro.doc2.html#334|titolo=Design Goals of the Java(TM) Programming Language|accesso=6 maggio 2011}}</ref>
Secondo molte persone, la tecnologia Java raggiunge ragionevolmente bene tutti questi obiettivi. Il linguaggio comunque non &egrave; privo di incertezze. Java tende ad essere pi&ugrave; ad alto livello di altri linguaggi simili (come il [[Linguaggio C Plus Plus|C++]]); questo comporta carenze in alcune caratteristiche come i tipi di dati specifici, puntatori alla memoria di basso livello e metodi di programmazione come il sovraccaricamento degli operatori.
# essere "semplice, [[#Orientamento agli oggetti|orientato agli oggetti]] e familiare";
# essere "robusto e sicuro";
# essere [[#Portabilità|indipendente dalla piattaforma]];
# contenere strumenti e [[Libreria (software)|librerie]] per il [[networking]];
# essere progettato per eseguire codice da sorgenti remote in modo sicuro.
 
=== Linguaggio ===
Nonostante queste caratteristiche siano abusate frequentemente dai programmatori, esse sono anche strumenti potenti. Comunque, la tecnologia Java include Java Native Interface (JNI), un modo per chiamare codice nativo da codice Java. Con JNI &egrave; quindi possibile ugualmente usare queste caratteristiche.
{{vedi anche|Sintassi Java}}
[[File:Codes_sources.png|miniatura|upright=1.4|Esempio di [[codice sorgente]] Java]]
Uno dei principi fondamentali del linguaggio è espresso dal motto ''WORA'' (''write once, run anywhere'', ossia "scrivi una volta, esegui ovunque"): il codice [[compilatore|compilato]] 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 chiamato [[bytecode]] che può essere eseguito da una qualunque implementazione di un processore virtuale detto [[Java Virtual Machine]]; al 2014 Java risulta essere uno dei linguaggi di programmazione più usati al mondo, specialmente per applicazioni [[client-server]], con un numero di sviluppatori stimato intorno ai 9 milioni.<ref>{{Cita web |url=http://www.langpop.com/ |titolo=Programming Language Popularity |anno=2014 |accesso=7 febbraio 2014 |urlmorto=sì |urlarchivio=https://www.webcitation.org/67yahbjPg?url=http://www.langpop.com/ |dataarchivio=27 maggio 2012 }}</ref><ref>{{Cita web|url=http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html |titolo=TIOBE Programming Community Index |anno=2009 |accesso=6 maggio 2009 }}</ref>; un buon punto di partenza per imparare Java è il tutorial ufficiale<ref>{{cita testo|url=https://docs.oracle.com/javase/tutorial/|titolo=The Java Tutorials}}</ref>.
 
=== Hello, world! ===
Alcuni programmatori lamentano anche la mancanza dell'ereditariet&agrave; multipla, un potente mezzo di molti linguaggi orientati agli oggetti, tra cui il C++. Il linguaggio Java separa l'ereditariet&agrave; del tipo dall'implementazione, permettendo l'ereditariet&agrave; multipla dei tipi attraverso le interfacce. Questo permette di ottenere la maggior parte dei benefici dell'ereditariet&agrave; multipla evitando molti dei suoi pericoli. Inoltre, attraverso l'uso di classi concrete, classi astratte e interfacce, un programmatore ha la possibilit&agrave; di scegliere un grado nullo, parziale o completo di implementazione dell'oggetto che definisce, essendo assicurata la massima flessibilit&agrave; nella progettazione.
Segue il [[codice sorgente]] di un semplice programma che stampa il testo "[[Hello world]]" sulla [[riga di comando|console]].
<syntaxhighlight lang="java" line="1" start="1">
class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
</syntaxhighlight>
Un programma minimale in Java deve obbligatoriamente contenere la definizione di [[classe (informatica)|classe]] tramite la parola chiave ''class'' seguita dal ''nome_classe'' e il [[metodo (informatica)|metodo]] ''[[funzione main|main]]'' o metodo principale nonché ''[[entry point]]'' del programma in cui vengono definite [[variabile (informatica)|variabili]], oggetti e richiamati metodi statici su variabili e/o dinamici sugli oggetti.
 
Nell'esempio soprastante il ''main'' contiene l'istruzione per la stampa a video della stringa ''Hello 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 la [[programmazione orientata agli oggetti]].
Alcune persone pensano che per particolari progetti, la programmazione orientata agli oggetti renda il lavoro pi&ugrave; difficile. Questa particolare lamentela non &egrave; peculiare di Java, ma &egrave; rivolta a tutti i linguaggi di questo tipo.
<syntaxhighlight lang="java" line="1" start="1">
public class Messaggio {
private String toPrint;
 
public Messaggio(String print) {
== Linguaggio ==
this.toPrint = print;
}
 
public void print() {
=== Programma Hello World ===
System.out.println(this.toPrint);
}
 
public classstatic void main(String HelloWorldargs[]) {
Messaggio ciaoMondo = new Messaggio("Hello World!");
public static void main(String[] args) {
SystemciaoMondo.out.printlnprint("Hello world!");
}
}
</syntaxhighlight>
 
Il metodo ''main'' affida la stampa del messaggio a un oggetto creato apposta per questo compito, su cui è invocato il metodo dinamico ''print'' definito prima del main assieme al ''[[Costruttore (informatica)|costruttore]]'' della classe ovvero quel particolare metodo (con ugual nome della classe) che serve per inizializzare l'attributo della classe ''toPrint'' dell'oggetto creato/istanziato nel main. I metodi definibili possono essere dichiarati ''privati'' (contrassegnati dalla parola chiave ''private'') se richiamabili solo all'interno della stessa classe oppure ''pubblici'' (contrassegnati dalla parola chiave ''public'') se richiamabili anche da altre classi, di tipo ''statico'' (contrassegnati dalla parola chiave ''static'') se invocabili liberamente all'interno della classe (ad es. su variabili globali), ''dinamici'' se invocabili su oggetti.
=== Strutture di controllo ===
 
Scrivendo nuove classi che supportano l'operazione ''print'', si può adattare il programma per mostrare messaggi di tipi radicalmente diversi, lasciando il ''main'' pressoché immutato, cambiando soltanto la metà riga che segue il ''new''. Per esempio si può considerare un messaggio la scritta in una [[finestra (informatica)|finestra]] che appare sullo schermo del computer in uso, oppure una stringa inviata su connessione di rete per apparire sulla finestra di un computer [[client]]. Oppure il programma può dialogare con l'utente sulla [[riga di comando]] o in una finestra (considerando il dialogo come un "messaggio interattivo").
''while'' (Boolean expression) {
statement(s)
}
 
Si può modificare radicalmente il comportamento del programma con modifiche circoscritte e in punti predisposti a priori ([[polimorfismo (informatica)|polimorfismo]]): il programma può resistere ad aggiornamenti ed esigenze non previste. Segue il [[codice sorgente]] di due programmi che mostrano lo stesso testo all'interno di una [[GUI|finestra]]. 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.
''do'' {
<syntaxhighlight lang="java" line="1" start="1">
statement(s)
import javax.swing.JOptionPane;
} ''while'' (Boolean expression);
public class HelloWorld {
public static void main( String[] args) {
JOptionPane.showMessageDialog(null, "Hello World!");
}
}
</syntaxhighlight>
 
<syntaxhighlight lang="java" line="1" start="1">
''for'' (initialisation; termination condition; incrementing expr) {
//HelloWorld.java
statement(s)
package helloworld;
}
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class HelloWorld extends Application {
@Override
public void start(Stage primaryStage) {
Button btn = new Button();
btn.setText("Say 'Hello World'");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
 
Scene scene = new Scene(root, 300, 250);
=== Strutture Condizionali ===
 
primaryStage.setTitle("Hello World!");
''if'' (Boolean expression) {
primaryStage.setScene(scene);
statement(s)
primaryStage.show();
}
}
public static void main(String[] args) {
launch(args);
}
}
</syntaxhighlight>
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 scritta ''Hello 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: il ''main'' 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 (informatica)|incapsulamento]]).
 
=== Type system ===
''if'' (Boolean expression) {
[[File:Duke (Java mascot) waving.svg|miniatura|destra|Duke, la mascotte di Java|150px]]
statement(s)
Java è un linguaggio [[type safety|type safe]], a [[tipizzazione statica]], con un ''nominative'' [[type system]], e dotato di ''manifest typing''. In virtù di queste caratteristiche, viene generalmente considerato un linguaggio a [[tipizzazione forte]]. Il linguaggio distingue chiaramente i [[tipo atomico|tipi primitivi]] che definiscono valori atomici dai [[Tipo di dato#Record|tipi strutturati]] che definiscono strutture dati composte.<br />I tipi primitivi sono detti anche ''tipi atomici'' e ''tipi base'' e sono definiti nelle specifiche di linguaggio: di ognuno sono noti l'insieme esatto dei valori ammessi e gli operatori supportati.
} ''else'' {
statement(s)
}
 
I tipi strutturati sono anche [[Tipo di dato#Riferimenti|tipi riferimento]], cioè definiscono [[oggetto (informatica)|oggetti]], 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 package <code>java.lang</code> e nei suoi sottopackage; il linguaggio stabilisce per alcuni di essi (<code>Object</code>, <code>String</code>, <code>Iterable</code>, e altri) delle regole sintattiche o semantiche aggiuntive.
''if'' (Boolean expression) {
statement(s)
} ''else if'' (Boolean expression) {
statement(s)
} ''else if'' (Boolean expression) {
statement(s)
} ''else'' {
statement(s)
}
 
I tipi riferimento includono le classi per la gestione delle stringhe, gli array e le collezioni (liste, mappe, ecc.).
''switch'' (integer expression) {
''case'' constant integer expr:
statement(s)
''break'';
...
''default:''
statement(s)
''break'';
}
 
; Tipi base
=== Gestione delle eccezioni ===
{| class="wikitable"
! Tipo || Descrizione || Classe contenitore
|-
| [[byte]] || intero con segno a 8 bit || Byte
|-
| [[Short integer|short]] || intero con segno a 16 bit || Short
|-
| [[Numero intero (informatica)|int]] || intero con segno a 32 bit || Integer
|-
| [[Long integer|long]] || intero con segno a 64 bit || Long
|-
| [[Numero in virgola mobile|float]] || virgola mobile a 32 bit singola precisione (standard [[IEEE 754]]) || Float
|-
| [[Double precision|double]] || virgola mobile a 64 bit doppia precisione (standard [[IEEE 754]]) || Double
|-
| [[Carattere (informatica)|char]] || carattere singolo [[Unicode]] (intero senza segno a 16 bit) || Character
|-
| [[Algebra di Boole|boolean]] || <code>true</code> o <code>false</code> || Boolean
|}
 
Da tutto ciò consegue che i valori dei tipi base '''non''' sono oggetti. Tuttavia per ogni tipo base è definita una corrispondente classe, definita in gergo ''tipo wrapper'' o ''tipo contenitore'', nel package <code>java.lang</code>, 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.
''try'' {
statement(s)
} ''catch'' (exception type) {
statement(s)
} ''catch'' (exception type) {
statement(s)
} ''finally'' {
statement(s)
}
 
Dalla versione 5.0 in poi sono supportati l{{'}}''autoboxing'' e l{{'}}''unboxing'' che permettono di convertire da tipo primitivo a corrispondente classe ''wrapper'' 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 una [[zucchero sintattico|sintassi comoda]] che "nasconde" la creazione di un oggetto della classe wrapper. Come molti altri linguaggi di programmazione anche Java possiede tra le [[strutture dati]] gli [[array]] (vedi [[array in Java]]).
=== Goto ===
 
=== Costanti ===
&Egrave; possibile inserire un'etichetta prima di ogni dichiarazione
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;
<nowiki>myLabel: aJavaStatement;</nowiki>
esempio:
<syntaxhighlight lang="java">
final double PREZZO = 15.99;
</syntaxhighlight>
Per convenzione i nomi delle costanti sono tutti maiuscoli.
 
Inoltre è possibile dichiarare '''final''' 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
 
=== Strutture dati ===
Il comando
{{...|informatica}}
 
=== Strutture di controllo ===
''break'';
Sono supportate le seguenti [[struttura di controllo|strutture di controllo]]:
* Strutture selettive: <code>if ... else</code> e <code>switch</code>, come in C
* Strutture iterative:
**<code>while</code> e <code>do ... while</code> come in C
** <code>for</code> mutuato dal C
** ''for each'' che agisce su un [[array]] o collezione<ref>in particolare è definito per lavorare su un qualunque oggetto che sia istanza di {{cita testo|url=https://download.oracle.com/javase/6/docs/api/java/lang/Iterable.html|titolo=java.lang.Iterable}}</ref>
* La [[gestione delle eccezioni in Java]] viene gestita dalla sintassi <code>try ... catch ... finally</code> simile a quella del C++.
 
Al di là dei costrutti per la programmazione ad oggetti il resto della [[sintassi (informatica)|sintassi]] di Java è detta ''like C'', cioè derivata o simile a quella del [[linguaggio C]].
termina il ciclo corrente.
 
=== Orientamento agli oggetti ===
L'etichetto pu&ograve; essere usata per uscire da un ciclo for, while o do-while
{{vedi anche|Programmazione orientata agli oggetti}}
Java è un linguaggio ''object-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 chiamate ''[[oggetto (informatica)|oggetti]]''. Le specifiche che definiscono le caratteristiche di queste unità e in base a cui le stesse vengono create o in gergo ''istanziate'', sono chiamate ''[[classe (informatica)|classi]]''.<br />Java tuttavia non è un linguaggio ad oggetti puro, ma solamente ''object oriented'' (orientato agli oggetti): per esempio i valori dei tipi primitivi non sono oggetti.
 
Nel linguaggio Java gli oggetti sono dotati di [[variabile di istanza|campi]] (definiti anche ''attributi'' o ''variabili di istanza'' o ''di esemplare'') e di [[Metodo (programmazione)|metodi]]. I metodi sono abitualmente usati per implementare agevolmente molti altri costrutti che alcuni altri linguaggi forniscono nativamente, come la gestione degli eventi (implementata attraverso i ''listener'') o delle proprietà, implementate tramite gli ''[[Metodo (programmazione)#Metodi di accesso|accessor method]]'' e, più in generale, con oggetti [[JavaBeans]].
''break'' myLabel;
 
In Java non esistono le funzioni: i blocchi di codice che "non appartengono a nessun oggetto" sono implementati come ''metodi statici'' di una certa classe e quindi sono sempre dei metodi. In Java si pone un forte accento sulla distinzione tra ''interfaccia'' e ''implementazione'' 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 termine ''interfaccia'' è usato anche in un'altra accezione, spiegata nel seguito.
Un'espressione continue termina l'iterazione corrente e inizia quella successiva
 
==== Ereditarietà ====
''continue;''
{{vedi anche|Ereditarietà (informatica)}}
[[File:Java-graphics2d-shape-hierarchy.png|miniatura|Esempio di polimorfismo: dalla base comune ''Shape'' discendono molti tipi differenti, dotati di comportamenti diversi]]
In aggiunta con
È supportata l{{'}}''ereditarietà'' tra tipi. Questo permette di stabilire la ''gerarchia'' delle classi che compongono un programma. Il linguaggio impone che a capo della gerarchia ci sia la nota classe <code>java.lang.Object</code>.<ref>{{cita libro|autore=James Gosling, Bill Joy, Guy Steele, Gilad Bracha|titolo=The Java Language Specification, Third Edition|capitolo=Chapter 4. Types, Values, and Variables|url=http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.3.2|accesso=6 maggio 2011}}</ref>
 
In Java non esiste [[ereditarietà multipla]] tra classi.<ref>Le specifiche di linguaggio non ammettono l'indicazione di più di una superclasse nella definizione di una data classe: vedi {{cita testo|url=http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1|titolo=Java SE Specifications}}, {{cita testo|url=http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.4|titolo=Java SE Specifications}}</ref> 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 alle ''interfacce'', ovvero a tipi analoghi alle classi, ma progettati apposta per essere estesi e soggetti a determinate restrizioni imposte dal linguaggio.<ref>{{cita web|url=http://java.sun.com/docs/white/langenv/Object.doc2.html#6185|titolo=The Java Language Environment, "Java language Interfaces"|accesso=6 maggio 2011}}</ref><ref>{{cita libro|autore=James Gosling, Bill Joy, Guy Steele, Gilad Bracha|titolo=The Java Language Specification, Third Edition|capitolo=Chapter 9. Interfaces|url=http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html|accesso=7 maggio 2011}}</ref> 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.
''continue'' label;
il flusso del programma pu&ograve; essere manipolato direttamente da un ciclo esterno.
 
L'ereditarietà multipla in java si può anche simulare tramite il [[Decorator|pattern decorator]], che se implementato correttamente, permette di "estendere" a runtime metodi e caratteristiche ad un oggetto.
La dichiarazione
 
Dopo l'avvento di Java l'ereditarietà singola si è gradualmente affermata come [[modello standard]] di ereditarietà nelle tecnologie object-oriented ed è stata abbracciata anche dai linguaggi del framework [[.NET]] [[Microsoft]]. 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.<ref>{{cita web|titolo=Java 8 explained: Default methods|url=http://zeroturnaround.com/rebellabs/java-8-explained-default-methods/|accesso=3 aprile 2016}}</ref>
''return;''
termina un metodo.
 
== Ambienti di sviluppo ==
Con
Per sviluppare programmi in Java è teoricamente sufficiente un qualsiasi [[editor di testo]]; in pratica, se si vuole scrivere qualcosa di più del classico ''hello world'', occorre un [[ambiente di sviluppo integrato]] (IDE): esistono diversi IDE (''Integrated Development Environment'', ambiente di sviluppo integrato), alcuni gratuiti ed altri a pagamento.
 
=== Java Development Kit ===
''return'' aValue;
Sun (ora [[Oracle Corporation|Oracle]]) mette a disposizione un [[software development kit]] specifico, chiamato ''[[Java Development Kit]]'' (o ''JDK''), che include un certo numero di tool di uso comune, fra cui <code>javac</code>, <code>[[javadoc]]</code>, <code>jar</code>, e altri, atti ad elaborare ([[compilazione|compilare]]) i [[file sorgente|file sorgenti]] e/o già compilati, includendo dunque il [[Java Runtime Environment]] (JRE). Inoltre, nel 2019, Oracle ha rilasciato un nuovo interprete e compilatore dinamico chiamato [[GraalVM]], che dal 2023 vedrà alcune sue porzioni integrate all'interno di [[OpenJDK]].<ref>{{Cita web|url=https://medium.com/graalvm/announcing-graalvm-19-4590cf354df8|titolo=Announcing GraalVM 19|autore=Oleg Šelajev|sito=graalvm|data=2019-05-12|lingua=en|accesso=2023-07-06}}</ref><ref>{{Cita web|url=https://www.infoq.com/articles/graalvm-java-compilers-openjdk/|titolo=GraalVM Java Compilers Join OpenJDK in 2023, Align with OpenJDK Releases and Processes|sito=InfoQ|lingua=en|accesso=2023-07-06}}</ref> 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'[[Syntax highlighting|evidenziazione della sintassi]] tramite colori diversi, l'[[autocompletamento]], o la possibilità di navigare tra i sorgenti tramite il click del [[mouse]].
 
=== Ambienti di sviluppo integrato ===
aValue pu&ograve; essere restituito al metodo chiamante.
[[File:Eclipse_4.3.Kepler_screenshot.png|thumb|[[Eclipse (informatica)|Eclipse]], un [[Ambiente di sviluppo integrato|IDE]] per lo sviluppo in Java]]
La Oracle stessa ha promosso lo sviluppo di un ambiente di sviluppo gratuito e open source chiamato [[NetBeans]], che può essere scaricato da solo<ref>{{cita testo|url=https://netbeans.org/|titolo=Welcome to NetBeans}}</ref>, oppure (facoltativamente) con il JDK<ref>{{cita testo|url=http://www.oracle.com/technetwork/java/javase/downloads/index.html|titolo=Java SE Downloads}}</ref>.
 
* Un ambiente di sviluppo integrato open-source largamente utilizzato è [[Eclipse (informatica)|Eclipse]], donato alla comunità di sviluppatori da [[IBM]] e il cui sviluppo è seguito da una enorme comunità di utenti.
=== Tipi Primitivi ===
* Uno degli ambienti di sviluppo integrato commerciali più diffusi è [[JBuilder]] prodotto dalla [[Borland]].
* Un ambiente di sviluppo integrato che ha vinto diversi premi<ref>{{cita testo|url=http://www.jetbrains.com/company/press/awards.html|titolo=Awards}}</ref> è [[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.
* Un ambiente di sviluppo per Java (e altri linguaggi di programmazione) è [[Visual Studio Code]]: [[software libero]] e [[Visual Studio Code#Licenza|gratuito]], anche se la versione ufficiale è sotto una [[licenza proprietaria]].
 
== Ambiente di esecuzione ==
{| border width=80%
=== Piattaforma Java ===
{{vedi anche|Piattaforma Java}}
[[File:Java Platforms.PNG|miniatura|Schema delle varie piattaforme Java esistenti]]
I programmi scritti in linguaggio Java, dopo una fase iniziale di [[compilatore|compilazione]] con ottenimento del cosiddetto [[bytecode]], sono destinati all'[[esecuzione (informatica)|esecuzione]] sulla [[piattaforma Java]] attraverso una fase di [[Interprete (informatica)|interpretazione]] (per questo motivo il linguaggio Java è detto anche semi-interpretato) ad opera di una [[Java Virtual Machine]] e in esecuzione hanno accesso alle [[Application Programming Interface|API]] della [[#Librerie|libreria standard]]. Questi due passi forniscono un livello di astrazione che permette alle [[applicazione (informatica)|applicazioni]] di essere interamente [[#Portabilità|indipendenti dal sistema]] hardware su cui esse saranno eseguite. Un'implementazione della piattaforma java è il [[Java Runtime Environment]] (JRE), necessario per l'esecuzione del programma compilato, mentre per lo sviluppo dei programmi in Java a partire dal codice sorgente è necessario il [[Java Development Kit]] (JDK) che include anche il JRE.
 
==== Portabilità ====
[[File:Java-jvm.png|miniatura|Schema che illustra il funzionamento del ''[[bytecode]]'' 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 una [[sintassi (informatica)|sintassi]] unificata per definire le [[sezione critica|sezioni critiche]], compito che in altri linguaggi si svolge tipicamente ricorrendo a librerie di terze parti o primitive di sistema.<ref>{{cita web|url=http://java.sun.com/docs/white/langenv/Intro.doc2.html#528|titolo=The Java Language Environment|accesso=6 maggio 2011}}</ref> 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 alla [[Java Virtual Machine]], indicandola come il destinatario tipico del [[bytecode]] prodotto dalla [[compilazione]] iniziale di un programma Java, e infatti il compilatore <code>javac</code> incluso nel JDK compila proprio in bytecode. Tuttavia è possibile la compilazione verso architetture diverse, infatti è possibile produrre [[codice oggetto]] specifico di un certo [[sistema operativo]] servendosi di un compilatore apposito, ad esempio il [[GNU 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 molte [[piattaforma (informatica)|piattaforme]] hardware diverse, questi dipendono dalle [[macchina virtuale|macchine virtuali]] che sono programmi a sé e che hanno inevitabilmente i loro [[bug]], 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").<ref>{{cita web|url = http://electronicdesign.com/Articles/Index.cfm?ArticleID=2255&pg=3|titolo = Write Once, Debug Everywhere|editore = electronicdesign.com|nome = William|cognome = Wong|accesso = 3 agosto 2008|urlmorto = sì|urlarchivio = https://web.archive.org/web/20090321180726/http://electronicdesign.com/Articles/Index.cfm?ArticleID=2255&pg=3}} ''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.''</ref>
 
=== Librerie ===
==== Versioni della piattaforma ====
Il linguaggio in sé definisce solo una minima parte delle [[libreria software|librerie]] 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:
* [[Java Platform, Standard Edition]]
* [[Java Platform, Micro Edition]]
* [[Java EE]]
 
==== Librerie di terze parti ====
In aggiunta il [[programmatore]] può utilizzare un numero arbitrario di librerie di terze parti. Queste librerie, contenute in vari [[package (Java)|package]], vengono utilizzate dal [[programmatore]] per utilizzare determinati [[Funzione (informatica)|metodi]] o [[Variabile (informatica)|attributi]] comuni per semplificare e uniformare i [[programma (informatica)|programmi]] e renderli maggiormente leggibili ai programmatori. Esistono numerosissimi package utilizzabili dai programmatori nel [[linguaggio Java]]. Ad esempio esistono package:
* di [[Input/output|input e output]] (''java.io'');
* per i [[Funzione (informatica)|metodi]] e le [[costanti matematiche]] (''java.Math'');
* per la creazione di applet (''java.applet'');
* per creare [[Applicazione (informatica)|applicazioni]] di rete (''javax.net'');
* per la [[stampa]] (''javax.print'');
* per la [[Sicurezza informatica|sicurezza]] (''java.security'' e ''javax.security'').
* per la creazione di [[Interfaccia grafica|GUI]] (java.awt)
 
== Documentazione ==
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 tool [[Javadoc]] e regolato da specifiche ufficiali ben definite (seppure esterne al linguaggio)<ref>{{cita web|url=http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html|titolo=How to Write Doc Comments for the Javadoc Tool|accesso=16 giugno 2011}}</ref>. 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 le [[annotazione (Java)|annotazioni]], introdotte nella terza versione delle specifiche di linguaggio<ref>{{cita web|url=http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#253695|titolo=The Java Language Specification, Annotations|accesso=16 giugno 2011}}</ref>. Pur avendo una sintassi formalmente differente dai commenti Javadoc, esse sono usate per lo stesso scopo, cioè fornire [[metadato|metadati]] 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<ref>Il tipo che definisce l'annotazione in uso deve essere stato marcato con la meta-annotazione <code style="user-select: auto;">@Retention</code>. Vedi {{cita web|url=http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#255829|titolo=The Java Language Specification, Interfaces|accesso=16 giugno 2011}}</ref>, le informazioni che forniscono sono compilate insieme al codice e possono essere lette perfino a [[run-time|tempo di esecuzione]], cosa che i commenti non possono fare.
 
== Versioni ==
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.
 
{| class="wikitable"
|-
! Versione
| '''Tipo di Variabile''' || '''Descrizione'''
! Data pubblicazione
! End of Free<br />Public Updates<ref name="auto9">{{Cita web|url=https://www.oracle.com/technetwork/java/java-se-support-roadmap.html|titolo=Oracle Java SE Support Roadmap}}</ref><ref>{{Cita web|url=https://adoptopenjdk.net/support.html#roadmap|titolo=Support &#124; AdoptOpenJDK|sito=adoptopenjdk.net}}</ref><ref>{{Cita web|url=https://aws.amazon.com/about-aws/whats-new/2020/08/amazon-corretto-8-11-support-extended/ |titolo=Amazon Corretto 8 & 11 support extended}}</ref><ref>{{Cita web |url=https://kr.azul.com/products/azul-support-roadmap/ |titolo=Azul Java Support Roadmap |accesso=27 agosto 2021 |dataarchivio=22 settembre 2021 |urlarchivio=https://web.archive.org/web/20210922175432/https://kr.azul.com/products/azul-support-roadmap/ |urlmorto=sì }}</ref>
! Extended<br />Support Until
|-
| {{Version|o|JDK Beta}} || 1995 || {{dunno}} || {{dunno}}
| byte || intero con segno a 8 bit
|-
| {{Version|o|JDK 1.0}} || gennaio 1996 || {{dunno}} || {{dunno}}
| short || intero con segno a 16 bit
|-
| {{Version|o|JDK 1.1}} || febbraio 1997 || {{dunno}} || {{dunno}}
| int || intero con segno a 32 bit
|-
| {{Version|o|J2SE 1.2 Playground}} || dicembre 1998 || {{dunno}} || {{dunno}}
| long || intero con segno a 64 bit
|-
| {{Version|o|J2SE 1.3 Kestrel}} || maggio 2000 || {{dunno}} || {{dunno}}
| float || virgola mobile a 32 bit singola precisione (standard IEEE 754)
|-
| {{Version|o|J2SE 1.4 Merlin}} || febbraio 2002 || ottobre 2008 || febbraio 2013
| double || virgola mobile a 64 bit doppia precisione (standard IEEE 754)
|-
| {{Version|o|J2SE 5.0 Tiger}} || settembre 2004 || novembre 2009 || aprile 2015
| char || carattere singolo Unicode
|-
| {{Version|o|Java SE 6 Mustang}} || dicembre 2006 || aprile 2013 || dicembre 2018<br />dicembre 2026, supporto a pagamento per Azul Platform Core<!-- (formerly Zulu)--><ref name="Azul"/><br />marzo 2026 per Liberica JDK BellSoft<ref>{{Cita web|titolo=Liberica JDK 6 roadmap|url=https://bell-sw.com/support/#roadmap}}</ref>
| boolean || vero o falso
|-
| {{Version|o|Java SE 7 Dolphin}} || luglio 2011 || aprile 2015 || luglio 2022 <br />marzo 2026 per Liberica JDK BellSoft<ref>{{Cita web|titolo=Liberica JDK 7 roadmap|url=https://bell-sw.com/support/#roadmap}}</ref>
|-
| {{Version|co|Java SE 8 (LTS)}} || marzo 2014 || '''gennaio 2019 per uso commerciale Oracle'''<br />dicembre 2030 per uso non commerciale Oracle<br />dicembre 2030 per Azul<br />Almeno maggio 2026 per AdoptOpenJDK<br />Almeno maggio 2026 per Amazon Corretto <br />marzo 2031 per Liberica JDK BellSoft<ref>{{Cita web|titolo=Liberica JDK 8 roadmap|url=https://bell-sw.com/support/#roadmap}}</ref>|| dicembre 2030
|-
| {{Version|o|Java SE 9}} || settembre 2017 || marzo 2018 per OpenJDK || Non disponibile
|-
| {{Version|o|Java SE 10}} || marzo 2018 || settembre 2018 per OpenJDK || Non disponibile
|-
| {{Version|co|Java SE 11 (LTS)}} || settembre 2018 || settembre 2026 per Azul<br />Almeno ottobre 2024 per AdoptOpenJDK<br />Almeno settembre 2027 per Amazon Corretto<br />Almeno ottobre 2024 per Microsoft<ref>{{Cita web|titolo=Support roadmap for the Microsoft Build of OpenJDK|url=https://docs.microsoft.com/en-us/java/openjdk/support|accesso=3 agosto 2021|sito=docs.microsoft.com|lingua=en}}</ref><ref>{{Cita web|data=25 maggio 2021|titolo=Announcing General Availability of Microsoft Build of OpenJDK|url=https://devblogs.microsoft.com/java/announcing-general-availability-of-microsoft-build-of-openjdk/|accesso=3 agosto 2021|sito=Java at Microsoft|lingua=en}}</ref> <br />marzo 2027 per Liberica JDK BellSoft<ref>{{Cita web|titolo=Liberica JDK 11 roadmap|url=https://bell-sw.com/support/#roadmap}}</ref>|| settembre 2026<br />settembre 2028 per Azul<ref name="Azul"/>
|-
| {{Version|o|Java SE 12}} || marzo 2019 || settembre 2019 per OpenJDK || Non disponibile
|-
| {{Version|o|Java SE 13}} || settembre 2019 || marzo 2020 per OpenJDK || Non disponibile
|-
| {{Version|o|Java SE 14}} || marzo 2020 || settembre 2020 per OpenJDK || Non disponibile
|-
| {{Version|o|Java SE 15}} || settembre 2020 || marzo 2021 per OpenJDK<br />marzo 2023 per Azul<ref name="Azul">{{Cita web|titolo=Azul Support Roadmap|url=https://www.azul.com/products/azul-support-roadmap/|accesso=8 luglio 2021|sito=Azul {{!}} Better Java Performance, Superior Java Support|lingua=en}}</ref> || {{n/a}}
|-
| {{Version|o|Java SE 16}} || marzo 2021 || settembre 2021 per OpenJDK || Non disponibile
|-
| {{Version|co|Java SE 17 (LTS)}} || settembre 2021 || settembre 2029 per Azul<br />Almeno settembre 2027 per Microsoft <br />marzo 2030 per Liberica JDK BellSoft<ref>{{Cita web|titolo=Liberica JDK 17 roadmap|url=https://bell-sw.com/support/#roadmap}}</ref>|| settembre 2029 o successivo<br />settembre 2031 per Azul Platform Prime
|-
| {{Version|o|Java SE 18}} || marzo 2022 || settembre 2022 per OpenJDK || Non disponibile
|-
| {{Version|o|Java SE 19}} || settembre 2022|| marzo 2023 per OpenJDK || Non disponibile
|-
| {{Version|o|Java SE 20}} || marzo 2023|| settembre 2023 per OpenJDK || Non disponibile
|-
| {{Version|co|Java SE 21 (LTS)}} || settembre 2023|| settembre 2028 <br />marzo 2032 per Liberica JDK BellSoft<ref>{{Cita web|titolo=Liberica JDK 21 roadmap|url=https://bell-sw.com/support/#roadmap}}</ref>|| settembre 2031 per Oracle
|-
| {{Version|o|Java SE 22}} || marzo 2024|| settembre 2024 || {{dunno}}
|-
| {{Version|c|Java SE 23}} || settembre 2024 || marzo 2025 || {{dunno}}
|-
| {{Version|p|Java SE 24}} || marzo 2025 || settembre 2025 || {{dunno}}
|-
| {{Version|p|Java SE 25 (LTS)}} || settembre 2025 || settembre 2028 per Oracle || Settembre 2033 per Oracle
|-
| colspan="4" | {{Version|l|show=111101}}
|}
 
Java fu inizialmente distribuito come Java Development Kit 1.0 (JDK 1.0). Questo comprende il ''runtime 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 la [[Java 5|J2SE 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.
I caratteri usano la codifica a 16 bit Unicode. Contiene tutti i caratteri usuali, oltre a tutti i set di caratteri di molte lingue come Greco, Cirillico, Cinese, Arabo, ecc. In si Java possono usare tutti questi caratteri, anche se molti editor non hanno il supporto per i set di caratteri diversi dal ASCII. Gli Array e le stringhe non sono tipi primitivi ma oggetti.
 
===; 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 le [[Java Specification Request]] e conseguentemente implementati nel compilatore <code>javac</code>.
* JDK 1.0 1996, Solaris, Windows, Mac OS Classic, Linux
* The Java Programming Language, First Edition
* JDK 1.1 1997, Solaris, Windows, Mac OS Classic, Linux
* The Java Programming Language, Second Edition
* JDK 1.2 1998, Solaris, Windows, Linux, ?
* The Java Programming Language, Third Edition
* JDK 1.3 2000 (conosciuto come Java 2), Solaris, Windows, Mac OS X, Linux
* The Java Programming Language, Java SE 7 Edition
* JDK 1.4 2002, Solaris, Windows, Mac OS X, Linux
* The Java Programming Language, Java SE 8 Edition
* JDK 1.5 2004, Solaris, Windows, Mac OS X, Linux
* The Java Programming Language, Java SE 9 Edition
 
== Note ==
Java fu inizialmente rilasciato come il Java Development Kit 1.0 (JDK 1.0). Questo comprende '''Java Runtime''' (la virtual machine e le librerie di classi), e gli strumenti di sviluppo (es. il compilatore Java). Successivamente, Sun fornì un pacchetto che comprendeva solo Java 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 &egrave; Java(TM) 2 Platform, Standard Edition 1.4.
<references />
 
== Bibliografia ==
Il linguaggio &egrave; rimasto stabile dal JDK 1.0; la libreria di classi che viene fornita con JDK &egrave; stata progressivamente ampliata e modificata in alcune parti. Le estensioni e architetture legate al linguaggio Java comprendono:
; Fonti usate per la stesura della voce
*[[J2SE]] Java 2 Platform Standard Edition;
* {{cita libro|url=http://www.claudiodesio.com|titolo=Object Oriented && Java 5|autore=Claudio De Sio Cesari|accesso=29 giugno 2019}}
*[[J2EE]] Java 2 Platform Enterprise Edition;
* Sezione "[[#Storia|Storia]]": {{cita web|url=http://www.oracle.com/technetwork/java/chapter1-159190.pdf|formato=pdf|titolo=Java 2 Micro Edition basics|accesso=5 maggio 2011}}
*[[J2ME]] Java 2 Platform Micro Edition;
* ''The Java Language Specification, Java SE 7 Edition'' (vedi sotto)
*[[Servlets]];
* {{cita libro|Fabrizia|Scorzoni|Informatica Programmazione in Java|2009|Loescher|Torino|ISBN=978-88-8433-030-7}}
*[[EJB]] Enterprise JavaBeans;
*[[JSP]] JavaServer Pages;
*[[JDO]] Java Data Objects;
*[[JMS]] Java Message Service;
*[[JAF]] JavaBeans Activation Framework;
*[[Java Mail]];
*[[JNI]] Java Native Interface;
*[[JNDI]] Java Naming and Directory Interface;
*[[JSML]] Java Speech Grammar Specification;
*[[JDBC]] Java Database Connectivity;
*[[JAIN]] Java Integrated Networks;
*[[JDMK]] Java Dynamic Management Kit;
*[[Jini]] Java Intelligent Network Infrastructure;
*[[Jiro]] Java Interface for Regular Objects;
*[[JXTA]] sigla che sta per "juxtapose" (porre a canto);
*[[JavaSpaces]];
*[[JMI]] Java Metadata Interface;
*[[JMX]] Java Management Extensions.
*[[JAXB]] Java Architecture for XML Binding
*[[JAXP]] Java API for XML Processing
*[[SAAJ]] SOAP with Attachments API for Java
*[[JAX-RPC]] Java API for XML-based RPC
*[[JAXR]] Java API for XML Registries
 
; Specifiche di linguaggio
A parte il linguaggio molto semplice da imparare l'utilizzo delle archittetture e delle specifiche richiede un tempo di apprendimento molto lungo.
Le diverse edizioni delle specifiche sono {{cita testo|url=https://docs.oracle.com/javase/specs/|titolo=accessibili sul sito della Oracle}} L'ultima edizione è la seguente:
* {{Cita libro|autore = James Gosling, Bill Joy, Guy Steele, Gilad Bracha, Alex Buckley|titolo = The Java Language Specification, Java SE 8 Edition|lingua = inglese|url = https://docs.oracle.com/javase/specs/jls/se8/jls8.pdf|formato = PDF|accesso = 18 marzo 2014}}
* {{Cita libro|autore = James Gosling, Bill Joy, Guy Steele, Gilad Bracha, Alex Buckley|titolo = The Java Language Specification, Java SE 7 Edition|lingua = inglese|url = https://docs.oracle.com/javase/specs/jls/se7/jls7.pdf|formato = PDF|accesso = 28 agosto 2012}}
 
; Testi di approfondimento
=== Come programmare in Java ===
* {{Cita libro|autore = [[Ken Arnold]], [[James Gosling]], David Holmes|titolo = The Java Programming Language, Fourth Edition|editore = Addison-Wesley Professional|anno = 2005|lingua = inglese|ISBN = 0-321-34980-6}}
 
== Voci correlate ==
La programmazione in Java &egrave; una specializzazione della programmazione con linguaggi orientati agli oggetti.
{{Div col}}
* [[Annotazione (Java)]]
* [[Applet]]
* [[Servlet]]
* [[JavaServer Pages]] (JSP)
* [[Java Card]]
* [[Java EE]]
* [[Generics Java]]
* [[Linguaggio di programmazione]]
* [[Macchina virtuale Java]]
* [[Piattaforma Java]]
* [[Java Development Kit]] (JDK)
* [[JAR (formato di file)]]
* [[JavaScript]]
* [[Java Native Interface]]
* [[Polimorfismo (informatica)]]
* [[Incapsulamento (informatica)]]
{{Div col end}}
 
== Altri progetti ==
Il linguaggio Java &egrave; un linguaggio orientato agli oggetti con una sintassi simile al [[linguaggio C]] e al [[Linguaggio C Plus Plus|linguaggio C++]]. Allo sviluppatore gi&agrave; esperto di programmazione OO, alcuni punti dovrebbero essere evidenziati:
{{interprogetto|b=Java|wikt=Java}}
 
# Java supporta solo la singola ereditariet&agrave; di classi, ma permette l'ereditariet&agrave; multipla di interfacce.
# Java ha una libreria di classi molto grande (detta Java API) simile a SmallTalk, e supporta molte caratteristiche, dai contenitori di oggetti a complesse esigenze di sicurezza.
# Java viene eseguito attraverso una Virtual Machine
 
L'apprendimento del linguaggio non &egrave; difficile, sebbene la padronanza completa delle librerie sia un processo lungo. La maggior parte degli utenti iniziano con le classi come String e ArrayList.
 
Un buon punto di partenza per imparare Java &egrave; il [http://java.sun.com/docs/books/tutorial/ tutorial di Sun].
 
Un'altra pagina molto utile per i principianti e gli esperti &egrave; la pagina della sintassi Java aggiornata all'ultima versione, sempre presso il sito Sun, che si trova [http://java.sun.com/j2se/1.4.1/docs/api/ qui]
 
Per sviluppare programmi in Java è sufficente un qualsiasi editor di testo. Comunque per aiutarci nella realizzazione dei nostri progetti estistono diversi IDE (Integrated Development Environment, ambiente di sviluppo integrato) che ci aiutano in tal senso alcuni dei quali a pagamento altri gratuiti.
 
Un ambiente di sviluppo per Java gratuito e soprattuto leggero è GEL (realizzato in Delphi), disponibile alla pagina http://www.gexperts.com solo per Windows; mentre Bluej, di chiara impostazione didattica, è disponibile per tutti i sistemi operativi al sito gratuito http://www.bluej.org/. Un altro ambiente per lo sviluppo in Java (e non solo) più complesso, potente e sempre gratuito è Eclipse donato alla comunità di sviluppatori da IBM e scaricabile dalla pagina http://www.eclipse.org Inoltre la Sun mette a disposizione un proprio ambiente di sviluppo gratuito (esiste anche una versione a pagamento) Sun One Studio Comunity Edition utilizzabile su diversi sistemi operativi. Questo ambiente è ricco di funzionalità ed è molto pesante. Il download è possibile effettuarlo da questa pagina http://wwws.sun.com/software/download/
 
== Curiosità ==
J. Gosling e A. Van Hoof (considerati gli autori del linguaggio Java) si trovavano spesso ad un caffè presso il quale discutevano del linguaggio stesso. E così il linguaggio prese il nome da tale abitudine ([[Java (caffè)|Java]] è una qualità di caffè), tanto che il magic number che identifica un file .java è 0xCAFEBABE (probabilmente riferendosi alla cameriera che li serviva).
 
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* {{FOLDOC}}
* {{cita web|url=http://www.oracle.com/it/technologies/java/overview/index.html|titolo=Java sul sito di Oracle}}
* {{cita web|url=https://home.java.net/|titolo=Il portale di Java OpenSource|lingua=en|accesso=19 marzo 2014|urlarchivio=https://web.archive.org/web/20151103174045/https://home.java.net/|urlmorto=sì}}
* {{cita web|url=http://java-source.net/|titolo=Java e le sue tecnologie (Opensource)|lingua=en|accesso=14 settembre 2007|dataarchivio=15 marzo 2009|urlarchivio=https://web.archive.org/web/20090315001856/http://java-source.net/|urlmorto=sì}}
* {{cita web|url=http://today.java.net/pub/a//today/2006/11/13/open-source-java-editorial.html|titolo=Java open source: not an hoax|lingua=en|accesso=13 novembre 2006|urlarchivio=https://web.archive.org/web/20061115064813/http://today.java.net/pub/a//today/2006/11/13/open-source-java-editorial.html|urlmorto=sì}}
* {{cita web|url=https://openjdk.java.net/|titolo=OpenJDK|lingua=en}}
 
{{Principali linguaggi di programmazione}}
* [http://java.sun.com/ Java sul sito della Sun Microsystems]
{{FOSS}}
* [http://www.sun.com/ Sito della Sun Microsystems]
{{Controllo di autorità}}
 
{{portale|informatica}}
{{Template:Principali linguaggi di programmazione}}
[[Categoria:Linguaggi di programmazione]]
[[Categoria:Piattaforme Computer]]
 
[[arCategoria:جافاJava| ]]
[[Categoria:Linguaggi per JVM]]
[[bg:Java]]
[[ca:Java]]
[[cs:Java]]
[[da:Java (programmeringssprog)]]
[[de:Java (Programmiersprache)]]
[[en:Java programming language]]
[[eo:Java]]
[[es:Lenguaje de programación Java]]
[[fi:Java]]
[[fr:Java (langage)]]
[[he:Java]]
[[hu:Java programozási nyelv]]
[[ja:Java言語]]
[[lt:Java (kalba)]]
[[nl:Programmeertaal Java]]
[[pl:Java]]
[[pt:Linguagem de programação Java]]
[[ru:Java]]
[[sv:Java (programspråk)]]
[[tr:Java]]
[[uk:Мова програмування Java]]
[[vi:Java]]
[[zh:Java编程语言]]