Giava | ||
Data della prima versione | 1995 | |
---|---|---|
Paradigma | Orientato agli oggetti , strutturato , imperativo , funzionale | |
Autore | Microsistemi solari | |
Sviluppatori | Oracle Corporation | |
Ultima versione | Java SE 16.0.1 (20 aprile 2021) | |
Digitando | Statico , forte , sicuro , nominativo | |
Influenzato da | Obiettivo-C , C++ , Smalltalk , Eiffel , Ada 83 , Mesa , Modula-3 , Oberon , UCSD Pascal | |
influenzato | C# , J# , Ada 2005 , Gambas , BeanShell , Clojure , ECMAScript , Groovy , JavaScript , PHP , Kotlin , Python , Scala , Seed7 , Vala , Processing | |
implementazioni | Elenco JVM | |
Sistema operativo | Multi piattaforma | |
Licenza | GNU GPLV2 + CPE | |
Sito web | www.oracle.com/java/technologies | |
Estensione del file | java, class, jar, jad e jmod | |
Java è un linguaggio di programmazione orientato agli oggetti creato da James Gosling e Patrick Naughton , dipendenti di Sun Microsystems , con il supporto di Bill Joy (co-fondatore di Sun Microsystems nel 1982 ), presentato ufficialmente il23 maggio 1995a SunWorld .
La società Sun è stata poi acquistata nel 2009 dalla società Oracle che ora possiede e mantiene Java .
Una particolarità di Java è che il software scritto in questo linguaggio è compilato in una rappresentazione binaria intermedia che può essere eseguita in una Java Virtual Machine (JVM) indipendentemente dal sistema operativo .
Il linguaggio Java riprende in gran parte la sintassi del linguaggio C++ . Tuttavia, Java è stato spogliato della maggior parte dei concetti sottili di C ++ e sia il più confusione, come ad esempio i puntatori e riferimenti, o l'ereditarietà multipla bypassati dalla realizzazione di interfacce . Allo stesso modo, dalla versione 8, l'arrivo delle interfacce funzionali introduce l'ereditarietà multipla (senza la gestione degli attributi) con i suoi vantaggi e svantaggi come l'ereditarietà del diamante . I progettisti hanno privilegiato l' approccio orientato agli oggetti in modo che in Java tutto sia oggetto tranne i tipi primitivi ( interi , numeri in virgola mobile, ecc.) che però hanno le loro varianti che ereditano dall'oggetto Object (Integer, Float, ...).
Java consente di sviluppare applicazioni client-server . Dal lato client, le applet sono all'origine della notorietà del linguaggio. È soprattutto lato server che Java si è imposto nel mondo degli affari grazie alle servlet , lato server delle applet, e più recentemente JSP ( JavaServer Pages ) che può sostituire PHP , ASP e ASP.NET .
Java ha dato vita a un sistema operativo ( JavaOS ), ambienti di sviluppo ( eclipse / JDK ), macchine virtuali ( MSJVM (en) , JRE ) un'applicazione multipiattaforma ( JVM ), una variazione per dispositivi mobili / embedded ( J2ME ), una grafica libreria di progettazione dell'interfaccia ( AWT / Swing ), applicazioni pesanti (Jude, Oracle SQL Worksheet, ecc.), tecnologie web (servlet, applet) e una variazione per l'azienda ( J2EE ). La portabilità del bytecode Java è assicurata dalla Java virtual machine, ed eventualmente dalle librerie standard incluse in un JRE. Questa macchina virtuale può interpretare il bytecode o compilarlo al volo in linguaggio macchina. La portabilità dipende dalla portabilità delle JVM su ciascun sistema operativo.
Il linguaggio Java deriva da un progetto Sun Microsystems risalente al 1990: l'ingegnere Patrick Naughton non era soddisfatto del linguaggio C++ utilizzato da Sun, delle sue interfacce di programmazione in linguaggio C, nonché degli strumenti associati. Pur considerando una migrazione a NeXT, gli è stato offerto di lavorare su una nuova tecnologia ed è così che è nato Project Stealth ( stealth ).
Il progetto Stealth è stato rapidamente ribattezzato Green Project con l'arrivo di James Gosling e Mike Sheridan. Insieme, con l'aiuto di altri ingegneri, hanno iniziato a lavorare in un ufficio in Sand Hill Street a Menlo Park , in California . Hanno cercato di sviluppare una tecnologia per lo sviluppo di applicazioni di nuova generazione, offrendo a Sun la prospettiva di opportunità uniche.
Il team inizialmente aveva pianificato di utilizzare il linguaggio C++, ma lo ha abbandonato per diversi motivi. Prima di tutto, stavano sviluppando su un sistema embedded con risorse limitate e sentivano che l'uso di C++ richiedeva troppi investimenti e che questa complessità era una fonte di errore per gli sviluppatori. La mancanza di garbage collection significava che la gestione della memoria doveva essere programmata manualmente, una sfida ma anche una fonte di errori.
Il team era anche insoddisfatto delle carenze del linguaggio C++ in termini di sicurezza, programmazione distribuita e multi-threading . Inoltre, volevano una piattaforma che potesse essere trasferita su qualsiasi tipo di dispositivo o piattaforma.
Bill Joy aveva immaginato un nuovo linguaggio che combina il meglio linguaggio di programmazione Mesa (in) e il linguaggio C . In un articolo intitolato Ulteriori ( Inoltre ) , ha proposto di Sun che i suoi tecnici stanno sviluppando un ambiente orientato agli oggetti sulla base di C ++. In origine, Gosling aveva pianificato di modificare e migliorare il linguaggio C++, che chiamò C++++, ma l'idea fu presto abbandonata a favore dello sviluppo di un nuovo linguaggio di programmazione che chiamarono Oak. (oak) in riferimento, secondo la leggenda, ad un albero piantato davanti alla finestra del loro ufficio .
Il team ha lavorato sodo e, nell'estate del 1992, hanno potuto dimostrare una piattaforma che includeva il sistema operativo Green , il linguaggio Oak (1992), librerie e hardware. Il loro primo successo, presentato su3 settembre 1992, è stata la costruzione di un palmare chiamato Star7 con un'interfaccia grafica e un agente intelligente chiamato Duke per assistere l'utente.
Nel novembre dello stesso anno, il Green Project fu interrotto per diventare FirstPerson, Inc , interamente di proprietà di Sun Microsystems, e il team si trasferì a Palo Alto. Il team di FirstPerson era interessato alla creazione di strumenti altamente interattivi e quando Time Warner ha pubblicato una gara d'appalto per un decodificatore multifunzione, FirstPerson ha cambiato la propria attenzione per offrire una piattaforma del genere.
Tuttavia, l'industria della televisione via cavo ha scoperto che offriva troppe opzioni per l'utente e FirstPerson ha perso il mercato a favore di Silicon Graphics . Incapace di interessare l'industria audiovisiva, la società è stata reintegrata all'interno di Sun.
giugno a luglio 1994, dopo tre giorni di brainstorming con John Gage, James Gosling, Joy, Naughton, Wayne Rosing ed Eric Schmidt , il team ha riorientato la piattaforma sul web . Credevano che con l'avvento del browser Mosaic , Internet fosse il luogo in cui sviluppare lo stesso tipo di strumento interattivo che avevano immaginato per l'industria dei cavi. Naughton sviluppò come prototipo un piccolo browser web, WebRunner, che sarebbe poi diventato HotJava .
Lo stesso anno la lingua è stata ribattezzata Java dopo che si è scoperto che il nome Oak era già in uso da un produttore di schede video.
Origine del nome JavaIl nome "Java" non è un acronimo , è stato scelto durante un brainstorming per sostituire il nome originale "Oak" , a causa di un conflitto con un marchio esistente, perché il caffè ( "java" in slang americano) è la bevanda preferita di molti programmatori . Il logo scelto da Sun è anche una tazza di caffè fumante.
Lancio pubblico di JavaNel ottobre 1994, HotJava e la piattaforma Java sono stati presentati per Sun Executives . Java 1.0a era disponibile per il download nel 1994 ma è arrivata la prima versione pubblica del browser HotJava23 maggio 1995alla conferenza SunWorld .
L'annuncio è stato dato da John Gage, direttore scientifico di Sun Microsystems. Il suo annuncio è stato accompagnato dall'annuncio a sorpresa di Marc Andressen, vicepresidente dell'esecutivo di Netscape, che Netscape avrebbe incluso il supporto Java nei suoi browser. Il9 gennaio 1996, il gruppo Javasoft è stato formato da Sun Microsystems per sviluppare questa tecnologia. Due settimane dopo era disponibile la prima versione di Java.
La comparsa della versione 1.2 del linguaggio segna una svolta significativa: è nel 2000 che la versione compare contemporaneamente su due piattaforme Java:
Sun li qualifica quindi come una piattaforma Java 2 rispetto alle prime generazioni 1.0 e 1.1. Tutte le versioni successive, da J2EE 1.2 a Java SE o Java EE 7 rimangono indicate come piattaforme Java 2, sebbene da allora la "2" sia stata ufficialmente interrotta.
applet
Storicamente, la capacità dei browser Web di avviare applet Java era l'unica soluzione per visualizzare applicazioni rich client (RIA per rich Internet application ). Poi sono emerse tecnologie concorrenti tra cui Macromedia Flash , JavaScript DHTML , Silverlight basato su XAML o Xul .
Gli applet sulla workstation Client possono comunicare con i servlet sul Server, così come Javascript può comunicare con il Server tramite AJAX . Flex utilizza la tecnologia Flash tramite Adobe Flash Player .
In un'epoca in cui JavaScript soffriva di problemi di compatibilità tra browser, le applet Java avevano il vantaggio della portabilità perché il porting di interfacce complesse era difficile per tutti i browser sul mercato.
Oltre alle ricadute della "moda" Java, i progressi compiuti nelle tecnologie in competizione con Java hanno portato la maggior parte degli sviluppatori ad allontanarsi dalle applet Java e dai problemi inerenti a questa tecnologia (incompatibilità tra JVM, scarse prestazioni, scarse librerie. grafica, complessità ). Infine, i browser moderni non includono più sistematicamente l'ambiente Java a causa delle sue grandi dimensioni e la percentuale di macchine in grado di visualizzare applet era solo del 70% nel 2010, molto più bassa che per Flash per esempio. Nel 2010, quasi tutte le applicazioni rich client utilizzavano tecnologie alternative; Flash per la maggior parte ma anche GWT .
Infine, l'arrivo di HTML5 , destinato a incorporare molte funzionalità RIA e multimediali , rende obsolete anche le applet.
JavaFX
Con la comparsa di Java 8 in marzo 2014, JavaFX diventa lo strumento ufficiale per la creazione di toolkit GUI Java, per tutti i tipi di applicazioni (applicazioni mobili, applicazioni desktop, applicazioni Web, ecc.), Lo sviluppo del suo predecessore Swing viene interrotto (ad eccezione delle correzioni di bug). JavaFX è una pura API Java (il linguaggio di scripting specifico ad esso associato per un po' di tempo è stato abbandonato). JavaFX contiene un'ampia varietà di strumenti, inclusi supporti audio e video, grafica 2D e 3D, programmazione web , programmazione parallela e altro ancora.
Lato serverCon i server delle applicazioni , gli EJB vengono utilizzati per incapsulare le classi precedentemente definite. Questi elementi vengono utilizzati nelle architetture J2EE per applicazioni multistrato. Il vantaggio che otteniamo da questo lavoro è quello di poter nascondere al client l'implementazione del codice lato server.
Uso della stazione di lavoroL'uso nativo del linguaggio Java per le applicazioni su workstation è rimasto fino ad ora relativamente raro a causa della loro mancanza di velocità. Tuttavia, con il rapido aumento della potenza dei computer, i miglioramenti durante gli anni 2000 nella macchina virtuale Java e nella qualità dei compilatori, diverse tecnologie hanno guadagnato terreno come NetBeans e l'ambiente Eclipse , le tecnologie dei file condivisi LimeWire , Vuze (ex Azureus) e I2P . Java è utilizzato anche nel programma di matematica MATLAB , a livello di interfaccia uomo-macchina e per l'algebra del computer. Anche le applicazioni Swing stanno emergendo come alternativa alla tecnologia .NET.
Utilizzare con i cellulariOracle annuncia l'inizioottobre 2012al convegno JavaOne la volontà di offrire soluzioni Java per il settore del software embedded, per processori meno potenti di quelli normalmente disponibili sui PC. Oracle riunisce un intero ecosistema di aziende specializzate in questi segmenti di mercato, come l'editore MicroEJ o anche STMicroelectronics che offre Java sui suoi STM32 il cui core è un CortexM3 / M4.
Java, in particolare tramite Eclipse e NetBeans , offre già ambienti di sviluppo integrati per dispositivi mobili. Java è il linguaggio principale utilizzato per sviluppare applicazioni per il sistema operativo gratuito di Google per Mobile : Android .
JavaFX può anche consentire l'uso di Java sui cellulari, sebbene questo non sia il suo scopo principale.
Sistema operativo Windows, Mac OS X e GNU/LinuxMicrosoft ha fornito nel 2001 un ambiente di lavoro di tipo Java, chiamato J++ , con i suoi sistemi operativi prima del rilascio di Windows XP . A seguito di una decisione del tribunale , e in considerazione del mancato rispetto delle specifiche di questo linguaggio, Microsoft ha dovuto abbandonare questo e creare un nuovo linguaggio, chiamato C# (vedi capitolo " Indipendenza rispetto alla piattaforma " più basso)
Molti produttori di computer continuano a includere un ambiente JRE sui propri sistemi Windows.
Java appare anche come standard in Mac OS X di Apple e per le distribuzioni Linux . Quindi, al giorno d'oggi, la maggior parte degli utenti può avviare applicazioni Java senza alcun problema. Tuttavia, sui computer Apple, la distribuzione di Java 5 in Java 6 è stata gestita direttamente da Apple e non da Oracle. Questa politica ha comportato ritardi e restrizioni di versione:
Pertanto J2SE 1.4 non era disponibile prima di Mac OS X v10.2 (nome in codice Jaguar ), J2SE 5.0 da Mac OS X v10.4 ( Tiger ), Java SE 6 funziona solo con Mac OS X v10.5 ( Leopard ) dotato di un Processore Intel e Java 7 richiedono un computer Mac Intel con Mac OS X v10.7 .3 ( Lion ).Licenze open sourceIl 11 novembre 2006, il codice sorgente per il compilatore javac e la macchina virtuale HotSpot sono stati rilasciati come Open Source sotto la GNU General Public License .
Il 13 novembre 2006, Sun Microsystems annuncia il passaggio di Java, ovvero il JDK (JRE e strumenti di sviluppo) e gli ambienti Java EE (già su licenza CDDL) e Java ME su licenza GPL da quimarzo 2007, sotto il nome del progetto OpenJDK .
Nel maggio 2007, Sun rilascia OpenJDK con una licenza gratuita. Tuttavia OpenJDK dipende ancora da frammenti di codice non libero che Sun non possiede. Questo è il motivo per cui la società Redhat sta lanciando ingiugno 2007il progetto IcedTea (in) che mira a sostituire i frammenti di codice non libero e rendere così fruibile OpenJDK senza alcun software proprietario. Nelgiugno 2008, il progetto IcedTea ha superato rigorosi test di compatibilità Java (TCK). IcedTea è quindi un'implementazione open source delle specifiche Java. Sun, quindi Oracle, mantiene comunque il controllo della tecnologia attraverso un catalogo di brevetti applicati a Java, oltre che mantenendo il TCK sotto una licenza proprietaria.
Acquisizione da parte di OracleLa società Oracle ha acquisito la società Sun Microsystems nel 2009 . Ora possiamo vedere il logo Oracle apparire nella documentazione dell'API Java.
Il 12 aprile 2010, James Gosling , il creatore del linguaggio di programmazione Java, si dimette da Oracle per ragioni che non vuole rivelare. Era diventato il CTO della divisione software client per Oracle.
Nel 2018, Oracle ha annunciato che gli aggiornamenti alla sua versione Java SE 8 per uso professionale sarebbero stati soggetti a una licenza a pagamento dagennaio 2019.
Il linguaggio Java ha subito diverse evoluzioni a partire da JDK 1.0 ( Java Development Kit ) con l'aggiunta di molte classi e pacchetti alla libreria standard. A partire da J2SE1.4, l'evoluzione di Java è guidata dal JCP ( Java Community Process ) che utilizza le JSR ( Java Specifications Requests ) per proporre aggiunte e modifiche sulla piattaforma Java. La lingua stessa è specificata dalla Java Language Specification (JLS ), con le modifiche al JLS gestite sotto il codice JSR 901.
Va notato che le successive evoluzioni del linguaggio difficilmente riguardano la sua sintassi - relativamente stabile fin dall'inizio - ma principalmente sull'arricchimento delle sue funzioni, con l'imbarco e l'ottimizzazione di librerie software ( API ) in campi molto vari. : database, gestione XML, informatica distribuita e web, multimedia, sicurezza, ecc.
Numerazione della versioneDobbiamo distinguere la versione del linguaggio Java da quelle delle piattaforme e del JRE:
A volte possono essere offerte due versioni contemporaneamente, come 8u65 e 8u66: la differenza consiste generalmente in correzioni di bug minori (senza in particolare alcun impatto sulla sicurezza), per cui l'aggiornamento all'ultima versione non è critico ed è quindi lasciato alla scelta degli amministratori (JRE) o sviluppatori (JDK).
Le versioni pubbliche di Java possono essere seguite da versioni non pubbliche, denominate Advanced, riservate all'uso commerciale; quindi Java 1.6u45 è l'ultima versione pubblica di Java6, ma 6u113 è l'ultima versione disponibilemarzo 2016.
Versione | Ultima versione | Nome JSE / JRE | Nome in codice | Specifiche | JDK | Stato ottobre 2018 | Periodo di manutenzione | Supporto esteso |
---|---|---|---|---|---|---|---|---|
1.0 | 1.0.2 | Java 1.0 | Quercia | JSR 52 | JDK 1.0.2 | Non più attivamente supportato | 1996-2000 | |
1.1 | 8_16 | Java 1.1 | JSR 52 | 1.1.8_16 | Non più attivamente supportato | 1997-2000 | ||
1.2 | 2_017 | J2SE 1.2 | Terreno di gioco | JSR 52 | 1.2.2_11 | Non più attivamente supportato | 2000-2006 | |
1.3 | 1_29 | J2SE 1.3 | Gheppio | JSR 58 | 1.3.1_29 | Obsoleto | 2000-2001 | |
1.4 | 2_30 | J2SE 1.4 | Merlino | JSR 59 | 1.4.2_30 | Obsoleto | 2000-2008 | |
1.5 | da 0_22 a 0_85 | J2SE 5.0 | Tigre | JSR 176 | 1.5.0_22 | Deprecato, da 5u51 a 5u85 disponibile solo con supporto Oracle specifico | 2002-2009 | maggio 2015 |
1.6 | 0_45 a 0_111 | Java SE 6 | Mustang | JSR 270 | 6u113 | Deprecato, da 6u51 a 6u111 disponibile solo con supporto Oracle specifico | 2005-2013 | Dicembre 2018 |
1.7 | 0_79 a 0_80 | Java SE 7 | Delfino | JSR 336 | 1.7.0_79 | Stabile, versione 1.7.0_79 | 2011- 2015 | luglio 2022 |
1.8 | 0_171 | Java SE 8 | Kenai poi Spider | JSR 337 | 1.8.0_171 | Stabile, versione 1.8.0_171 offerta agli utenti | 2014-settembre2018 | luglio 2019 |
9 | 9.0.4 | Java SE 9 | Ombrello | JSR 379 | 9.0.4 | Stabile | 2018-? | |
10 | 10.0.1 | Java SE 10 | JSR 383 | 10.0.1 | supportato 6 mesi prima della prossima versione di JDK Java11-LTS | 2018, non una versione LTS (supporto a lungo termine) | ||
11 | 11.0.1 | Java SE 11 | JSR 384 | 11.0.1 | Versione LTS | 2023 | 2026 | |
12 | 12.0.2 | Java SE 12 | JSR 386 | 12.0.2 | ||||
13 | Java SE 13 | JSR 388 | 13.0 | |||||
14 | Java SE 14 | JSR 389 | 14.0.1 |
Qui sono elencati solo i numeri di versione più recenti per ogni versione. I dettagli delle successive modifiche per versione e per aggiornamento sono disponibili su wikipedia.en/java_history .
Contenuti e sviluppi Da JDK 1.0 a J2SE 1.4Rilasciato il 30 settembre 2004(3.270 classi e interfacce), il suo nome in codice è Tiger . Inizialmente è numerato 1.5, che viene sempre utilizzato come numero di versione interno. Sviluppato da (in) JSR 176 , Tiger ha aggiunto un numero significativo di nuove funzionalità al linguaggio:
Questo esempio illustra il contenuto dell'oggetto widgets della classe Iterable e contiene solo riferimenti agli oggetti della classe Widget, assegnando ciascuno di questi elementi alla variabile w e quindi chiama il metodo display() sull'elemento w ( specificato in JSR 201). Una sintassi simile sarà introdotta nel 2011 in C++ 11 .
Oltre ai cambiamenti di lingua, negli anni si sono verificati cambiamenti più significativi che hanno portato da poche centinaia di classi in JDK 1.0 a oltre 3.000 in J2SE 5.0. Intere API, come Swing o Java2D, sono state aggiunte e molti metodi del JDK 1.0 originale sono stati dichiarati deprecati (ovvero deprecati, potrebbero essere rimossi in una versione successiva di Java).
Java SE 6Rilasciato il 11 dicembre 2006(3.777 classi e interfacce in oltre 20 pacchetti), il suo nome in codice è Mustang . Una versione beta è stata rilasciata il15 febbraio 2006, un'altra beta in giugno 2006, una versione " release candidate " innovembre 2006, e la versione finale su 12 dicembre 2006. Con questa versione, Sun cambia in modo permanente il nome J2SE in Java SE e rimuove lo .0 dal numero di versione.
Questa versione è stata oggetto di numerose vulnerabilità di sicurezza e dei relativi aggiornamenti correttivi, portando alla versione 1.6.0_45 di Oracle e persino 1.6.0_51 per la sua versione per Mac OS. Questa è anche l'ultima versione di Java in esecuzione per Mac OS X 10.6 e versioni precedenti.
Java SE 7Rilasciato il 7 luglio 2011(8000 classi e interfacce), il suo nome in codice è Dolphin . Questa è la prima versione sotto licenza GNU GPL .
Dall'aggiornamento 6 (7u6), l'edizione standard Oracle di Java supporta nuovamente Mac OS X, gli aggiornamenti per questo sistema operativo non sono più supportati da Apple ma da Oracle. Tuttavia, questa versione di Java non è supportata da Mac OS X v10.6 : infatti alcune API richieste da Java 7 sono state incluse da Apple in Mac OS X 10.7.3, ma non è previsto che vengano implementate su versioni precedenti di Mac OS. La versione 7u90 diaprile 2015 è l'ultimo aggiornamento pubblicamente disponibile per Java 7.
Java 7 offre le seguenti nuove funzionalità, tra le altre:
Nome in codice Kenai. Varie versioni in fase di sviluppo di JDK sono disponibili per il download a partire dall'autunno 2013 e Java 8 viene rilasciato a metàmarzo 2014in conformità con una tabella di marcia presentata da Oracle damaggio 2013.
Una delle principali novità di questa versione è l'aggiunta di lambda , che porta a una riprogettazione di parte dell'API, in particolare le raccolte e la nozione di flusso . Altre importanti aggiunte includono opzioni, implementazioni predefinite all'interno di un'interfaccia, una riprogettazione dell'API della data e altro ancora. La versione Enterprise Edition (Java 8 EE) invece non è prevista prima del 2017.
La modularizzazione della JVM con il progetto Jigsaw , inizialmente prevista per questa versione, è da parte sua rinviata alla versione 9, in particolare a causa delle vulnerabilità di sicurezza riscontrate da Java 6, che Oracle ha preferito correggere nel 2013 rispetto alle evoluzioni di Java.
Java SE 9Originariamente prevista per il 2015 ma posticipata in parte a causa del progetto Jigsaw, questa versione è stata finalmente rilasciata il 21 settembre 2017.
Java 9 integra:
Questa versione è stata rilasciata il 20 marzo 2018.
Questa nuova versione include in particolare:
Questa versione è stata rilasciata il 25 settembre 2018.
Oltre alla modifica del modello di supporto della versione a lungo termine, questa versione include in particolare:
Questa versione è stata rilasciata il 19 marzo 2019.
Questa versione integra 8 evoluzioni:
Questa versione è stata rilasciata il 17 settembre 2019.
Questa versione è stata rilasciata il 17 marzo 2020
Questa versione è stata rilasciata il 15 settembre 2020.
Java SE 16Questa versione è stata rilasciata il 16 marzo 2021.
Quando è stato creato il linguaggio Java, è stato deciso che questo linguaggio doveva soddisfare cinque obiettivi:
La prima caratteristica, il carattere orientato agli oggetti ("OO") e colloquiale, si riferisce ad un metodo di programmazione e progettazione del linguaggio e al fatto che un programma scritto in Java è abbastanza simile ad un programma scritto in C++ .
Sebbene ci siano diverse interpretazioni dell'espressione orientata agli oggetti , un'idea chiave in questo tipo di sviluppo è che i diversi tipi di dati devono essere direttamente associati alle diverse operazioni che possono essere eseguite su quei dati. Di conseguenza, i dati (chiamati Properties ) e il codice che li manipola (chiamati Methods ) vengono combinati in un'unica entità chiamata Object Class . Il codice diventa logicamente suddiviso in piccole entità coerenti e diventa così più semplice da mantenere e più facilmente riutilizzabile, essendo intrinsecamente modulare.
Altri meccanismi come l' ereditarietà consentono di sfruttare tutte le caratteristiche di una Classe precedentemente scritta nei propri programmi senza nemmeno doverne conoscere il funzionamento interno - si vede solo l' interfaccia (l'interfaccia descritta proprietà e metodi senza fornire il codice associato) . Java vieta la nozione di ereditarietà da diverse classi padre a meno che non siano interfacce.
Nella versione 1.5 del linguaggio sono stati aggiunti i generics , un meccanismo di polimorfismo simile (ma diverso) ai template del linguaggio C++ o ai funtori di OCaml . I generici consentono di esprimere in modo più semplice e sicuro (dal punto di vista della tipizzazione) le proprietà di oggetti come i contenitori (liste, alberi, ecc.): il tipo lista viene quindi considerato genericamente rispetto al tipo d' oggetto contenuto nell'elenco.
Questo elemento contribuisce alla robustezza e alle prestazioni dei programmi, il Garbage Collector viene chiamato regolarmente e automaticamente durante l'esecuzione del programma. Sui sistemi multiprocessore e/o multicore , questo impiega anche più thread a bassa priorità per interrompere il meno possibile l'esecuzione del programma. Inoltre, il programmatore può suggerire di eseguire il Garbage Collector utilizzando il metodo System.gc() se necessario .
Una denuncia ricorrente contro linguaggi come il C++ è l'oneroso compito di dover programmare manualmente la gestione della memoria. In C++, la memoria allocata dal programma per creare un oggetto viene deallocata quando viene distrutta (ad esempio tramite una chiamata esplicita all'operatore delete ). Se il programmatore dimentica di codificare la deallocazione, ciò si traduce in una " perdita di memoria " e il programma consuma sempre di più. Peggio ancora, se un programma richiede erroneamente la deallocazione più volte o utilizza un'area di memoria dopo aver richiesto la sua deallocazione, molto probabilmente diventerà instabile e causerà un errore fatale.
In Java, molti di questi problemi vengono evitati dalla garbage collection . Lo spazio di memoria richiesto per ogni oggetto creato è gestito in un memory heap (in inglese : memory heap ) riservato a questo scopo. Il programma accede a ciascun oggetto tramite un riferimento nell'heap. Quando non c'è più alcun riferimento per raggiungere un oggetto, il garbage collector lo distrugge automaticamente - poiché è diventato inaccessibile - liberando memoria e prevenendo così qualsiasi perdita di memoria.
Il Garbage Collector utilizza un algoritmo di tagging e rilascio (in inglese : mark and sweep ) per la gestione di casi complessi di oggetti che fanno riferimento l'uno all'altro o riferimenti ciclici (per un esempio di doppio concatenamento di elenchi ). In pratica, ci sono ancora casi di errore di programmazione in cui il garbage collector ritiene che un oggetto sia ancora utile mentre il programma non vi accede più funzionalmente (ma mantiene un riferimento all'oggetto), il che costituisce un caso particolare di " memory leak ".
La Garbage Collection rende la gestione della memoria notevolmente più semplice e sicura. I progettisti e gli utenti di programmi o librerie non devono preoccuparsi della deallocazione degli oggetti (operatore delete in C++), se non forse per motivi di prestazioni.
L'indipendenza dalla piattaforma significa che i programmi scritti in Java si comportano in modo molto simile su diverse architetture hardware. La licenza di Sun per Java insiste quindi sul fatto che tutte le implementazioni devono essere compatibili. In teoria, possiamo così effettuare lo sviluppo su una data architettura ed eseguire l'applicazione finale su tutte le altre.
Questo risultato si ottiene da:
Si noti che anche se esiste esplicitamente una prima fase di compilazione, il bytecode Java viene interpretato o convertito al volo in codice nativo da un compilatore al volo ( just in time , JIT).
Tipi di compilationLe prime implementazioni del linguaggio utilizzavano una macchina virtuale interpretata per ottenere la portabilità. Queste implementazioni producevano programmi che venivano eseguiti più lentamente di quelli scritti in un linguaggio compilato (C, C ++, ecc.), quindi il linguaggio soffriva di una reputazione di scarse prestazioni.
Le implementazioni più recenti della Java Virtual Machine (JVM) producono programmi molto più velocemente di prima, utilizzando tecniche diverse:
Dopo che Sun ha scoperto che l'implementazione di Microsoft non supportava le interfacce RMI e JNI e aveva elementi specifici della piattaforma rispetto alla sua piattaforma originale, Sun ha intentato una causa contro Microsoft e ha ottenuto danni (20 milioni di dollari). Questo atto di giustizia ha ulteriormente rafforzato i termini della licenza di Sun. In risposta, Microsoft ha interrotto il supporto per Java sulle sue piattaforme e nelle versioni recenti di Windows Internet Explorer non supporta le applet Java senza aggiungere plug-in. Tuttavia, Sun rende disponibili gratuitamente gli ambienti runtime Java per le varie piattaforme Microsoft.
La portabilità è tecnicamente un obiettivo sfuggente e il successo di Java in quest'area è stato misto. Sebbene sia effettivamente possibile scrivere programmi per la piattaforma Java che funzionino bene su molte macchine target, il gran numero di piattaforme con piccoli errori e incongruenze ha portato a un uso improprio dello slogan di Sun " Scrivi una volta, esegui ovunque " ( " Scrivi una volta, esegui ovunque " ) su " scrivi una volta, esegui il debug ovunque " ( " Scrivi una volta, esegui il debug ovunque " )!
L'indipendenza dalla piattaforma di Java ha comunque successo con applicazioni lato server come servizi Web, servlet e Java Beans, nonché sistemi embedded su OSGi, utilizzando l'ambiente Embedded Java .
La piattaforma Java è stato uno dei primi sistemi a offrire supporto per l'esecuzione di codice da fonti remote. Un applet può essere eseguito in di un utente browser web , l'esecuzione di codice scaricato da un HTTP Server . Il codice di un'applet funziona in uno spazio molto restrittivo, che protegge l'utente da codici errati o dannosi. Questo spazio è delimitato da un oggetto chiamato gestore della sicurezza . Tale oggetto esiste anche per il codice locale, ma per impostazione predefinita è inattivo.
Il gestore della sicurezza (la classe SecurityManager ) consente di definire un certo numero di autorizzazioni per l'utilizzo delle risorse del sistema locale (file system, rete, proprietà del sistema, ecc.). Un'autorizzazione definisce:
Gli editor di applet possono richiedere un certificato per consentire loro di firmare digitalmente un'applet come sicura, dando loro potenzialmente (con l'autorizzazione appropriata) il permesso di uscire dallo spazio restrittivo e accedere alle risorse del sistema locale.
Ecco un esempio di un tipico programma Hello world scritto in Java:
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } }Il file sorgente porta quasi sempre il nome della classe con l'estensione ".java" (qui "HelloWorld.java", sarebbe addirittura obbligatorio perché la classe ha l'attributo public nella sua dichiarazione - rendendolo accessibile a tutti gli altri programmi) . Possiamo compilare e quindi eseguire questo esempio sul terminale con i seguenti comandi (sotto Linux ):
javac HelloWorld.java export CLASSPATH=. java HelloWorldLa riga “ export CLASSPATH =. È usato per dire a Java che dovrebbe anche cercare i programmi di classe nella directory corrente. Questo percorso può essere specificato anche all'avvio del programma utilizzando l'opzione -classpath (o -cp in breve):
java -cp. HelloWorldAppunti:
( fonte )
Una classe è la descrizione di dati chiamati attributi e di operazioni chiamate metodi. Questo è un modello di definizione per oggetti con lo stesso insieme di attributi e lo stesso insieme di operazioni. Da una classe possiamo creare uno o più oggetti per istanziazione; ogni oggetto è un'istanza di una singola classe.
Visibilità:
Un attributo è definito dando il suo tipo, quindi il suo nome e possibilmente una parte di inizializzazione.
Visibilità:
Un metodo è definito da:
Visibilità:
Nome | Dimensione in byte durante i calcoli | Valore predefinito | Valori possibili |
---|---|---|---|
booleano | Un singolo bit è sufficiente, ma spesso riserviamo un byte per memorizzarli. | false | true, false |
byte | 1 | 0 | numeri interi compresi tra -128 e +127 (-2 7 e 2 7 -1) |
pantaloncini | 2 | 0 | interi compresi tra −32 768 e 32 767 (-2 15 e 2 15 -1) |
int | 4 | 0 | numeri interi compresi tra -2 147 483 648 e +2 147 483 647 (-2 31 e 2 31 -1) |
lungo | 8 | 0 | numeri interi compresi tra −9 223 372 036 854 775 808 e 9 223 372 036 854 775 807 (-2 63 e 2 63 -1) |
carro armato | 2 | '\u0000' | Tutti i valori Unicode (valori U + U + 0000 a FFFF, 4 cifre richieste dopo '\u') I primi 128 caratteri sono codici ASCII e note apostrofi: 'a', '1', '\'', '\n'. |
galleggiante | 4 | 0.0 | Insieme di numeri [−3.402 823 47 × 10 38 .. −1.402 398 46 × 10 −45 ], 0, [1.402 398 46 × 10 −45 .. 3.402 823 47 × 10 38 ] |
Doppio | 8 | 0.0 | Insieme di numeri [−1.797 693 134 862 315 70 × 10 308 .. −4.940 656 458 412 465 44 × 10 -324 ], 0, [4.940 656 458 412 465 44 × 10 -324 .. 1.797 693 134 862 315 70 × 10.308 ] |
Oggetto | Dipendente dalla macchina virtuale | null |
La tabella sopra elenca i tipi di base, tuttavia ci sono altri tipi in Java che sono oggetti e devono essere usati come tali. Ad esempio per definire un intero possiamo usare il tipo 'Integer' il cui valore di inizializzazione di default sarànull
Per istanziare una variabile, la sintassi (qui la stessa di C) è la seguente:
NomDuType maVariable;myVariable viene quindi allocato nello stack.
Spesso è necessario memorizzare molti dati nelle raccolte: lista della spesa, appunti degli studenti, ecc. Le raccolte possono essere consultate, modificate, possiamo ordinarle, ricopiarle, cancellarle, ecc. Possono avere una dimensione fissa o variabile.
Le raccolte a dimensione fissa sono più leggere delle raccolte a dimensione variabile.
Collezioni a dimensione fissaLa classe abstract AbstractListviene fornita per implementare raccolte di dimensioni variabili.
Per inizializzare un ArrayList devi importare la classe java.util.ArrayListe scrivere liste = new ArrayList<T>();o liste = new ArrayList<>(); da JDK 7.0.
Dal JDK 1.5, abbiamo la possibilità di indicare il tipo degli elementi contenuti in un ArrayList: interi, stringhe di caratteri o altri oggetti.
Per aggiungere un elemento scriviamo liste.add(Objet);
Per accedere a un elemento di ArrayList: liste.get(index);
Per scoprire il numero di elementi che contiene un elenco: liste.size();
Per eliminare un elemento: liste.remove(index);gli elementi che seguono l'elemento eliminato verranno spostati a sinistra.
Sebbene abbiano tutti un ruolo simile, ogni ciclo è comunque adattato a una situazione:
Nota : è possibile combinare condizioni (espressioni booleane) utilizzando operatori aggiuntivi: il logico "AND" && (istruzione eseguita se tutte le condizioni sono vere):
C'è anche il logico "OR" || (istruzione eseguita se almeno una delle condizioni è vera):
if (<condition 1> || <condition 2>) { instruction(s) si au moins une des deux est vraie }Infine, c'è il "NO" logico ! che consente di invertire il risultato di una condizione.
È possibile combinare queste operazioni per ottenere strutture condizionali complesse. È possibile aggiungere parentesi per definire le priorità delle condizioni (come in un calcolo). In altri casi, la JVM esegue i vari controlli da sinistra a destra.
La scelta dell'esecuzione delle istruzioni è determinata dall'espressione seguente switch il cui tipo può essere intero ( int , char , byte o short o classi di buste corrispondenti), enumerato ( enum ) o String (stringa di caratteri, dal momento che solo Java 7 ).
Nota: ' L' operatore condizionale o operatore ternario ? : può essere utilizzato per evitare l'uso di un'istruzione condizionale. Un'espressione condizionale avrà uno dei due valori dopo aver testato la condizione booleana:
<expression booléenne> ? <valeur si vrai> : <valeur si faux> Connessioni incondizionateIl blocco di codice finalmente verrà eseguito indipendentemente dal risultato quando il programma esce dal blocco try-catch .
Ecco un esempio di cattura di un'eccezione:
FileOutputStream fos = null; try { //Chacune de ces deux instructions peut générer une exception // création d'un flux pour écrire dans un fichier fos = new FileOutputStream(...); // écriture de données dans ce flux fos.write(...); } catch (IOException e) { //Gestion de l'erreur de création ou d'écriture dans le flux e.printStackTrace(); } finally{ //Cette section de code est toujours exécutée, qu’il y ait une exception ou pas // fermeture du flux s'il a été ouvert if(fos != null) fos.close(); }Questo esempio illustra il meccanismo delle eccezioni in Java. In caso di errore di input/output nel blocco try , l'esecuzione riprende nel blocco catch corrispondente a questa situazione (eccezione di tipo IOException ).
In questo blocco catch , la variabile e fa riferimento all'eccezione che si è verificata. Qui invochiamo il metodo printStackTrace() che visualizza nella console le informazioni sull'eccezione che si è verificata: nome, motivo, stato dello stack di chiamate quando è stata generata l'eccezione e, facoltativamente, numero di riga in cui si è verificato l'errore.
Viene quindi eseguito il blocco finalmente (qui per chiudere le risorse utilizzate). Questo è solo un esempio, l'azione da intraprendere quando si verifica un'eccezione dipende dal funzionamento generale dell'applicazione e dalla natura dell'eccezione.
Tipi genericiUn tipo generico è altrimenti chiamato Template, prende uno o più altri tipi come argomenti. Il tipo passato come parametro viene determinato durante l'istanza.
Ciò rende possibile in particolare nel contesto di ArrayLists evitare i cast.
public class ArrayList<E> { ArrayList<String> al = new ArrayList<String>(); }Questi tipi generici vengono utilizzati solo in fase di compilazione, non direttamente nel bytecode.
Differenza con C++: i modelli in C++ duplicano una classe per ogni tipo. Java, d'altra parte, agisce in fase di compilazione come se avessimo duplicato le classi di questi tipi intrinseci ma in realtà si occupa solo di una classe.
Codifica del codice sorgenteLe specifiche del linguaggio Java specificano che è formato da caratteri in formato UTF-16 , che permette l'utilizzo nel codice sorgente di tutti i caratteri esistenti nel mondo:
public class HelloWorld { private String text = "hello world"; }Per garantire la portabilità tra piattaforme, i nomi delle classi dovrebbero, tuttavia, essere costituiti solo da caratteri ASCII .
Operatore | Senso |
---|---|
== | Uguale (da non confondere con = che è l'operatore di assegnazione) |
! = | Diverso |
< | Inferiore |
> | Superiore |
<= | Minore o uguale |
> = | Maggiore o uguale a |
JavaStyle sono convenzioni di programmazione del linguaggio Java definite da Sun. Il rispetto di rigide convenzioni garantisce omogeneità nel codice sorgente di un'applicazione sviluppata da un intero team e favorisce la distribuzione del codice sorgente a una comunità che condivide le stesse convenzioni di codifica.
Il caso cammello inferiore viene utilizzato per i nomi di metodi e variabili.
Sun fornisce un gran numero di framework e API per consentire l'uso di Java per un'ampia varietà di usi.
Ci sono essenzialmente quattro framework principali :
La persistenza si basa su standard:
Tuttavia, esistono molte altre tecnologie, API ed estensioni opzionali per Java:
La programmazione può essere eseguita da un prompt dei comandi lanciando un compilatore Java (spesso chiamato javac ), ma per maggiore comodità, è meglio utilizzare un ambiente di sviluppo integrato o IDE (che consente di compilare automaticamente), alcuni sono gratuiti. Per esempio :
Un programma Java può essere prodotto con strumenti che automatizzano il processo di compilazione (ovvero l'automazione di determinate attività che comportano un numero potenzialmente elevato di dipendenze come l'uso di librerie, compilazione, generazione di archivi, documentazione, distribuzione, ecc.). I più utilizzati sono:
Risultati:
% scons -Q javac -d classes -sourcepath src src/Exemple1.java src/Exemple2.java src/Exemple3.java jar cf test.jar classes