Technopedia Center
PMB University Brochure
Faculty of Engineering and Computer Science
S1 Informatics S1 Information Systems S1 Information Technology S1 Computer Engineering S1 Electrical Engineering S1 Civil Engineering

faculty of Economics and Business
S1 Management S1 Accountancy

Faculty of Letters and Educational Sciences
S1 English literature S1 English language education S1 Mathematics education S1 Sports Education
  • Registerasi
  • Brosur UTI
  • Kip Scholarship Information
  • Performance
  1. WeltenzyklopÀdie
  2. Java (langage)
Java (langage) 👆 Click Here! Read More..
Un article de Wikipédia, l'encyclopédie libre.
(Redirigé depuis Java (programming language))
Page d’aide sur l’homonymie

Pour les articles homonymes, voir Java.

Page d’aide sur l’homonymie

Ne doit pas ĂȘtre confondu avec JavaScript.

Java
Logo.

Date de premiĂšre version 23 mai 1995 (30 ans)
Paradigme Orienté objet, structuré, impératif, fonctionnel, générique
Auteur Sun Microsystems
Développeurs Oracle Corporation
DerniĂšre version 25 (16 septembre 2025[1])
Typage Statique, fort, sûr, nominatif
Influencé par Objective-C, C++, Smalltalk, Eiffel[3], Ada 83, Mesa, Modula-3, Oberon, Pascal
A influencé C#, J#, Ada 2005, Gambas, BeanShell, Clojure, ECMAScript, Groovy, JavaScript, PHP, Kotlin, Python[4], Scala, Seed7, Vala, Processing
Implémentations Liste de JVM
SystĂšme d'exploitation Multiplateformes
Licence GNU GPLV2+CPE
Site web www.oracle.com/java/technologies
Extension de fichier java, class, jar, jad et jmodVoir et modifier les données sur Wikidata
modifier 

Java est un langage de programmation de haut niveau orienté objet créé par James Gosling et Patrick Naughton, employés de Sun Microsystems, avec le soutien de Bill Joy (cofondateur de Sun Microsystems en 1982), présenté officiellement le 23 mai 1995 au SunWorld.

La société Sun est rachetée en 2009 par la société Oracle qui détient et maintient désormais Java.

Un logiciel Ă©crit en langage Java a pour particularitĂ© d'ĂȘtre compilĂ© vers un code intermĂ©diaire formĂ© de bytecodes qui peut ĂȘtre exĂ©cutĂ© dans une machine virtuelle Java (JVM) en faisant abstraction du systĂšme d'exploitation.

Java 25 est officiellement disponible depuis le 16 septembre 2025. Cette version fait suite Ă  la LTS Java 23.

Aperçu

[modifier | modifier le code]

Le langage Java reprend en grande partie la syntaxe du langage C++. NĂ©anmoins, Java est Ă©purĂ© des concepts les plus subtils du C++ et Ă  la fois les plus dĂ©routants, tels que les pointeurs et rĂ©fĂ©rences, ou l’hĂ©ritage multiple contournĂ© par l’implĂ©mentation des interfaces. De mĂȘme, depuis la version 8, l'arrivĂ©e des interfaces fonctionnelles introduit l'hĂ©ritage multiple (sans la gestion des attributs) avec ses avantages et inconvĂ©nients tels que l'hĂ©ritage en diamant. Les concepteurs ont privilĂ©giĂ© l’approche orientĂ©e objet de sorte qu’en Java, tout est objet Ă  l’exception des types primitifs (nombres entiers, nombres Ă  virgule flottante, etc.) qui ont cependant leurs variantes qui hĂ©ritent de l'objet Object (Integer, Float, Double, etc.).

Java permet de dĂ©velopper des applications client-serveur. CĂŽtĂ© client, les applets sont Ă  l’origine de la notoriĂ©tĂ© du langage. C’est surtout cĂŽtĂ© serveur que Java s’est imposĂ© dans le milieu de l’entreprise grĂące aux servlets, le pendant serveur des applets, et plus rĂ©cemment les JavaServer Pages (JSP) qui peuvent se substituer Ă  PHP, Active Server Pages (ASP) et ASP.NET.

Java donne naissance Ă  un systĂšme d'exploitation (JavaOS), Ă  des environnements de dĂ©veloppement (Eclipse/Java Development Kit), l'Environnement d'exĂ©cution Java (JRE), des machines virtuelles (MSJVM (en), applicatives multiplateforme (JVM), une dĂ©clinaison pour les pĂ©riphĂ©riques mobiles/embarquĂ©s (J2ME), une bibliothĂšque de conception d'interface graphique (AWT/Swing), des applications lourdes (Jude, Oracle SQL Worksheet, etc.), des technologies web (servlets, applets) et une dĂ©clinaison pour l'entreprise (J2EE). La portabilitĂ© du bytecode Java est assurĂ©e par la machine virtuelle Java, et Ă©ventuellement par des bibliothĂšques standard incluses dans un JRE. Cette machine virtuelle peut interprĂ©ter le bytecode ou la compilation Ă  la volĂ©e en langage machine. La portabilitĂ© est dĂ©pendante de la qualitĂ© de portage des JVM sur chaque OS.

Logiciel ou application dévelopé avec java

[modifier | modifier le code]
  • Gghidra[5]
  • Eclipse

Historique

[modifier | modifier le code]

Origine du langage

[modifier | modifier le code]

Le langage Java est issu d’un projet de Sun Microsystems datant de 1990 : l’ingĂ©nieur Patrick Naughton n’était pas satisfait par le langage C++ utilisĂ© chez Sun, ses interfaces de programmation en langage C, ainsi que les outils associĂ©s. Alors qu’il envisageait une migration vers NeXT, on lui proposa de travailler sur une nouvelle technologie et c’est ainsi que le Projet Stealth (furtif) vit le jour.

Le Projet Stealth fut rapidement rebaptisĂ© Green Project avec l’arrivĂ©e de James Gosling et de Mike Sheridan. Ensemble, aidĂ©s par d’autres ingĂ©nieurs, ils commencĂšrent Ă  travailler dans un bureau de la rue Sand Hill Ă  Menlo Park en Californie. Ils essayĂšrent d’élaborer une technologie pour le dĂ©veloppement d’applications d’une nouvelle gĂ©nĂ©ration, offrant Ă  Sun la perspective d’opportunitĂ©s uniques[6].

L’équipe envisageait initialement d’utiliser le langage C++, mais l’abandonna pour diffĂ©rentes raisons. Tout d’abord, ils dĂ©veloppaient sur un systĂšme embarquĂ© avec des ressources limitĂ©es et estimaient que l’utilisation du C++ demandait un investissement trop important et que cette complexitĂ© Ă©tait une source d’erreur pour les dĂ©veloppeurs. L'absence de ramasse-miettes impliquait que la gestion de la mĂ©moire devait ĂȘtre programmĂ©e manuellement, un dĂ©fi mais aussi une source d’erreurs[6].

L’équipe Ă©tait Ă©galement insatisfaite des lacunes du langage C++ au niveau de la sĂ©curitĂ©, de la programmation distribuĂ©e, du multi-threading. De plus, ils voulaient une plateforme qui puisse ĂȘtre portĂ©e sur tout type d’appareils ou de plateformes[6].

Bill Joy avait envisagĂ© un nouveau langage combinant le meilleur du langage de programmation Mesa (en) et du langage C. Dans un article appelĂ© Plus loin (Further), il proposa Ă  Sun que ses ingĂ©nieurs dĂ©veloppent un environnement orientĂ© objet basĂ© sur le langage C++. À l’origine, Gosling envisageait de modifier et d’amĂ©liorer le langage C++, qu’il appelait C++ ++ --, mais l’idĂ©e fut bientĂŽt abandonnĂ©e au profit du dĂ©veloppement d’un nouveau langage de programmation qu’ils appelĂšrent Oak (chĂȘne) en rĂ©fĂ©rence, selon la lĂ©gende, Ă  un arbre plantĂ© devant la fenĂȘtre de leur bureau[rĂ©f. souhaitĂ©e].

À l’étĂ© 1992, ils furent capables de faire une dĂ©monstration constituĂ©e d'une plateforme incluant le systĂšme d’exploitation Green[rĂ©f. souhaitĂ©e], le langage Oak (1992), les bibliothĂšques et le matĂ©riel. Leur premiĂšre rĂ©alisation, prĂ©sentĂ©e le 3 septembre 1992, fut la construction d’un PDA appelĂ© Star7 ayant une interface graphique et un agent intelligent appelĂ© Duke pour prĂȘter assistance Ă  l’utilisateur[6].

En novembre de la mĂȘme annĂ©e, le Green Project fut abandonnĂ© pour devenir FirstPerson, Inc, appartenant en totalitĂ© Ă  Sun Microsystems et l’équipe fut relocalisĂ©e Ă  Palo Alto. L’équipe FirstPerson Ă©tait intĂ©ressĂ©e par la construction d’outils hautement interactifs et quand Time Warner publia un appel d’offres en faveur d’un dĂ©codeur multifonctions, FirstPerson changea d’objectif pour proposer une telle plateforme.

Cependant, l’industrie de la tĂ©lĂ©vision par cĂąble trouva qu’elle offrait trop de possibilitĂ©s Ă  l’utilisateur et FirstPerson perdit le marchĂ© au profit de Silicon Graphics. Incapable d’intĂ©resser l’industrie audiovisuelle, la sociĂ©tĂ© fut rĂ©intĂ©grĂ©e au sein de Sun.

Java rencontre Internet

[modifier | modifier le code]
Duke, la mascotte de Java

De juin Ă  juillet 1994, aprĂšs trois jours de remue-mĂ©ninges avec John Gage, James Gosling, Joy, Naughton, Wayne Rosing et Eric Schmidt, l’équipe recentra la plateforme sur le web. Ils pensaient qu’avec l’avĂšnement du navigateur Mosaic, Internet Ă©tait le lieu oĂč allait se dĂ©velopper le mĂȘme genre d’outil interactif que celui qu’ils avaient envisagĂ© pour l’industrie du cĂąble. Naughton dĂ©veloppa comme prototype un petit navigateur web, WebRunner qui deviendra par la suite HotJava[6].

Origine du nom Java

[modifier | modifier le code]

Le nom « Java Â» n'est pas un acronyme, il a Ă©tĂ© choisi lors d'un brainstorming[7] en remplacement du nom d'origine « Oak Â», Ă  cause d'un conflit avec une marque de carte vidĂ©o, parce que le cafĂ© (« java Â» en argot amĂ©ricain)[8] est la boisson favorite de nombreux programmeurs[9]. Le logo choisi par Sun est d'ailleurs une tasse de cafĂ© fumant.

Lancement public de Java

[modifier | modifier le code]

En octobre 1994, HotJava et la plateforme Java furent présentés pour Sun Executives. Java 1.0a fut disponible en téléchargement en 1994 mais la premiÚre version publique du navigateur HotJava arriva le 23 mai 1995 à la conférence SunWorld[10].

L’annonce fut effectuĂ©e par John Gage, le directeur scientifique de Sun Microsystems. Son annonce fut accompagnĂ©e de l’annonce surprise de Marc Andressen, vice-prĂ©sident de l’exĂ©cutif de Netscape que Netscape allait inclure le support de Java dans ses navigateurs. Le 9 janvier 1996, le groupe Javasoft fut constituĂ© par Sun Microsystems pour dĂ©velopper cette technologie[11]. Deux semaines plus tard la premiĂšre version de Java Ă©tait disponible.

AvĂšnement de Java 2

[modifier | modifier le code]

L'apparition de la version 1.2 du langage marque un tournant significatif : c'est en 2000 qu'apparait simultanĂ©ment la dĂ©clinaison en deux plateformes Java :

  • Java 2 Standard Edition (J2SE), plateforme avec les API et bibliothĂšques de bases, devenue depuis Java SE ;
  • Java 2 Enterprise Edition (J2EE), extension avec des technologies pour le dĂ©veloppement d'applications d’entreprise, devenue Java EE.

Sun les qualifie alors de plateforme Java 2 par opposition aux premiÚres générations 1.0 et 1.1. Toutes les versions ultérieures, de J2EE 1.2 à Java SE ou Java EE 7 restent désignées sous le qualificatif de plateformes Java 2, bien que le '2' ait été depuis officiellement abandonné.

Histoire récente

[modifier | modifier le code]

Utilisation Web

[modifier | modifier le code]
CÎté client
[modifier | modifier le code]

Applets

Historiquement, la possibilité des navigateurs Web de lancer des applets Java était la seule solution pour afficher des applications clientes riches (RIA pour rich Internet application). Puis des technologies concurrentes ont émergé parmi lesquelles Macromedia Flash, le DHTML JavaScript, Silverlight basé sur XAML ou Xul, ou le Scol.

Les applets sur le poste Client peuvent communiquer avec des servlets sur le Serveur, tout comme Javascript peut communiquer avec le Serveur au moyen d’AJAX. Flex utilise quant à lui la technologie Flash par le biais du Adobe Flash Player.

À une Ă©poque oĂč JavaScript souffrait de problĂšmes de compatibilitĂ© inter-navigateurs, les applets Java avaient l'avantage de la portabilitĂ© car le portage d'interfaces complexes Ă©tait difficile Ă  assurer pour tous les navigateurs du marchĂ©.

Outre la retombĂ©e de la « mode Â» Java, les progrĂšs faits dans les technologies concurrentes Ă  Java ont amenĂ© la plupart des dĂ©veloppeurs Ă  se dĂ©tourner des applets Java et des problĂšmes inhĂ©rents Ă  cette technologie (incompatibilitĂ©s entre les JVM, mauvaises performances, pauvretĂ© des bibliothĂšques graphiques, complexitĂ©). Enfin, les navigateurs modernes n'incluent plus systĂ©matiquement l'environnement Java Ă  cause de sa taille importante, et le taux de machines capables d'afficher des applets n'Ă©tait plus que de 70 % en 2010, bien plus faible que pour Flash par exemple[12]. En 2010, la quasi-totalitĂ© des applications clients riches utilisent des technologies alternatives ; Flash pour l'essentiel mais aussi GWT.

Enfin, l'arrivée de HTML5, destiné à embarquer de nombreuses fonctionnalités RIA et multimédia, rend également les applets caducs.

JavaFX

Avec l'apparition de Java 8 en mars 2014, JavaFX devient l'outil de création d'interface graphique ('GUI toolkit') officiel de Java, pour toutes les sortes d'application (applications mobiles, applications sur poste de travail, applications Web
), le développement de son prédécesseur Swing étant abandonné (sauf pour les corrections de bogues). JavaFX est une pure API Java (le langage de script spécifique qui lui a été un temps associé est maintenant abandonné). JavaFX contient des outils trÚs divers, notamment pour les médias audio et vidéo, le graphisme 2D et 3D, la programmation Web, la programmation parallÚle, etc.

CÎté serveur
[modifier | modifier le code]

Avec les serveurs d’applications, on utilise des EJB pour encapsuler les classes dĂ©finies prĂ©cĂ©demment. Ces Ă©lĂ©ments sont utilisĂ©s dans des architectures J2EE pour des applications multicouches. L'avantage qu'on tire de ce travail est de pouvoir cacher au client l'implĂ©mentation du code cĂŽtĂ© serveur.

Utilisation sur poste de travail

[modifier | modifier le code]

L’utilisation native du langage Java pour des applications sur un poste de travail restait jusqu'Ă  prĂ©sent relativement rare Ă  cause de leur manque de rapiditĂ©. Cependant, avec l’accroissement rapide de la puissance des ordinateurs, les amĂ©liorations au cours des annĂ©es 2000, de la machine virtuelle Java et de la qualitĂ© des compilateurs, plusieurs technologies ont gagnĂ© du terrain comme NetBeans et l’environnement Eclipse, les technologies de fichiers partagĂ©s LimeWire, Vuze (ex Azureus), et I2P. Java est aussi utilisĂ© dans le programme de mathĂ©matiques MATLAB, au niveau de l’interface homme machine et pour le calcul formel. Les applications Swing apparaissent Ă©galement comme une alternative Ă  la technologie .NET.

Utilisation avec les mobiles

[modifier | modifier le code]
Android utilise beaucoup les technologies Java

Oracle annonce dĂ©but octobre 2012 Ă  la confĂ©rence JavaOne sa volontĂ© de proposer des solutions Java pour le domaine des logiciels embarquĂ©s, pour processeurs moins puissants que ceux habituellement disponibles sur les PC. Oracle fĂ©dĂšre autour d'elle tout un Ă©cosystĂšme d'entreprises spĂ©cialistes de ces segments de marchĂ©s, comme l'Ă©diteur MicroEJ[13] ou encore STMicroelectronics qui propose du Java sur ses STM32[14] dont le cƓur est un CortexM3/M4.

Java, notamment via Eclipse et NetBeans, offre dĂ©jĂ  des environnements de dĂ©veloppement intĂ©grĂ©s pour mobile. Java est le principal langage utilisĂ© pour dĂ©velopper des applications pour le systĂšme d'exploitation libre pour Mobile de Google : Android.

JavaFX peut aussi permettre l'utilisation de Java sur mobiles, bien que ce ne soit pas son objectif principal.

OS Windows, Mac OS X et GNU/Linux

[modifier | modifier le code]

Microsoft a fourni en 2001 un environnement de travail de type Java, dĂ©nommĂ© J++, avec ses systĂšmes d’exploitation avant la sortie de Windows XP. À la suite d'une dĂ©cision de justice[rĂ©f. nĂ©cessaire], et au vu du non-respect des spĂ©cifications de ce langage, Microsoft a dĂ» abandonner celui-ci et crĂ©er un nouveau langage, de nom C# (cf. chapitre « IndĂ©pendance vis-Ă -vis de la plateforme Â» plus bas)

Beaucoup de fabricants d’ordinateurs continuent d’inclure un environnement JRE sur leurs systùmes Windows.

Java apparaĂźt Ă©galement comme un standard au niveau du Mac OS X d’Apple aussi bien que pour les distributions Linux. Ainsi, de nos jours, la plupart des utilisateurs peuvent lancer des applications Java sans aucun problĂšme. Toutefois, sur ordinateur Apple, la distribution de Java 5 Ă  Java 6 fut assurĂ©e directement par Apple, et non par Oracle[15]. Cette politique entraĂźna des retards et des restrictions de version :

Ainsi J2SE 1.4 ne fut pas disponible avant Mac OS X v10.2 (nom de code Jaguar), J2SE 5.0 à partir de Mac OS X v10.4 (Tiger), Java SE 6 fonctionne uniquement sous Mac OS X v10.5 (Leopard) équipé de processeur Intel[16], et Java 7 exige un ordinateur Mac Intel exécutant la version Mac OS X v10.7.3 (Lion).

Passage sous licence open-source

[modifier | modifier le code]

Le 11 novembre 2006, le code source du compilateur javac et de la machine virtuelle HotSpot ont été publiés en Open Source sous la Licence publique générale GNU[17].

Le 13 novembre 2006, Sun Microsystems annonce le passage de Java, c’est-Ă -dire le JDK (JRE et outils de dĂ©veloppement) et les environnements Java EE (dĂ©jĂ  sous licence CDDL) et Java ME sous licence GPL d’ici mars 2007, sous le nom de projet OpenJDK[18].

En mai 2007, Sun publie effectivement OpenJDK sous licence libre. Cependant OpenJDK dĂ©pend encore de fragments de code non libre que Sun ne dĂ©tient pas. C'est pourquoi la sociĂ©tĂ© Redhat lance en juin 2007 le projet IcedTea (en) qui vise Ă  remplacer les fragments de code non libre et ainsi rendre OpenJDK utilisable sans aucun logiciel propriĂ©taire. En juin 2008, le projet IcedTea a passĂ© les tests rigoureux de compatibilitĂ© Java (TCK)[19]. IcedTea est donc une implĂ©mentation open-source des spĂ©cifications de Java. Sun, puis Oracle, garde toutefois le contrĂŽle de la technologie par le biais d'un catalogue de brevets s'appliquant Ă  Java, ainsi que par le maintien du TCK sous une licence propriĂ©taire.

Acquisition par Oracle

[modifier | modifier le code]

La société Oracle a acquis en 2009 l'entreprise Sun Microsystems. On peut désormais voir apparaßtre le logo Oracle dans les documentations de l'api Java.

Le 12 avril 2010, James Gosling, le crĂ©ateur du langage de programmation Java, dĂ©missionne d’Oracle pour des motifs qu’il ne souhaite pas divulguer. Il Ă©tait devenu le directeur technologique de la division logicielle client pour Oracle.

En 2018, Oracle annonce que les mises Ă  jour de sa version Java SE 8 pour un usage professionnel seraient soumis Ă  une licence payante Ă  partir de janvier 2019[20].

En 2023, Oracle modifie en profondeur son mode de licence pour Java SE, en ne proposant plus les licences au processeur ou à l'utilisateur nommé, mais uniquement au nombre total d'employés de l'entreprise concernée, y compris ceux qui n'utilisent pas Java[21], ce qui risque d'augmenter significativement le coûts[22] et provoque des réactions négatives parmi les entreprises concernées[23].

Historique des versions

[modifier | modifier le code]

Le langage Java a connu plusieurs Ă©volutions depuis le JDK 1.0 (Java Development Kit) avec l’ajout de nombreuses classes et packages Ă  la bibliothĂšque standard. Depuis le J2SE1.4, l’évolution de Java est dirigĂ©e par le JCP (Java Community Process) qui utilise les JSR (Java Specifications Requests) pour proposer des ajouts et des changements sur la plateforme Java. Le langage lui-mĂȘme est spĂ©cifiĂ© par le JLS (Java Language Specification), les modifications du JLS Ă©tant gĂ©rĂ©es sous le code JSR 901[24].

Il faut noter que les Ă©volutions successives du langage ne portent guĂšre sur sa syntaxe -relativement stable depuis le dĂ©but- mais principalement sur l'enrichissement de ses fonctions, avec l'embarquement et l'optimisation de bibliothĂšques logicielles (API) dans des domaines trĂšs variĂ©s de l'informatique : bases de donnĂ©es, gestion XML, informatique distribuĂ©e et web, multimĂ©dia, sĂ©curité 

Numérotation des versions

[modifier | modifier le code]

Il faut distinguer la version du langage Java de celles des plateformes et du JRE :

  • Le numĂ©ro majeur de version du langage (par exemple Java 5) spĂ©cifiĂ©e par le JLS, est ainsi le numĂ©ro mineur pour le JRE ou la plateforme (par ex JRE 1.5 ou Java SE 1.5)[25] ;
  • Le JRE et la plateforme Java SE sont eux identifiĂ©s depuis Java 5 par un mĂȘme numĂ©ro de version : ainsi Java SE 1.6.0.43, et le JRE 1.6.0.43, sont tous deux conformes au langage Java 6, mais ont fait l'objet notamment de correctifs de sĂ©curitĂ©[26] ;
  • Java FX (orientĂ© RIA), constituĂ© essentiellement d'un sous-ensemble de JavaSE, suit Ă©galement le mĂȘme numĂ©ro de version : Java FX en est ainsi sa version 2.7 pour 1.7[27](Ă©galement compatible JRE 1.6) ;
  • En revanche, les plateformes Enterprise Edition (Java EE) et Mobile Edition (Java ME) sont identifiĂ©es par le numĂ©ro de version de leur propre SDK ; ainsi dĂ©but 2013 :
    • Java EE en Ă©tait encore Ă  la version 6 (Java EE 6 SDK Update 4), mais fonctionnait avec les JDK 6 ou 7[28]; il n'est rĂ©ellement passĂ© Ă  Java 7 que mi-juin 2013[29],
    • Java ME en est Ă  sa version 3.3 (SDK v. 3.3)[30].

Versions successives

[modifier | modifier le code]

Deux versions peuvent parfois ĂȘtre proposĂ©es simultanĂ©ment, telles que 8u65 & 8u66 : la diffĂ©rence consiste gĂ©nĂ©ralement en des corrections de bugs mineurs (sans incidence de sĂ©curitĂ© notamment), pour lesquelles la mise Ă  jour Ă  la toute derniĂšre version n'est pas critique et est de ce fait laissĂ©e au choix des administrateurs (JRE) ou dĂ©veloppeurs (JDK).

Les versions publiques de Java peuvent ĂȘtre suivies de versions non publiques, dites Advanced, rĂ©servĂ©es Ă  des usages commerciaux ; ainsi Java 1.6u45 est la derniĂšre version publique de Java6, mais 6u113 l'ultime version disponible fin mars 2016.

En date du 31/05/2025, les versions LTS (pour Long Term Support) actuelles sont Java 8, 11, 17 et 21[31].

Version DerniÚre version Dénomination JSE/JRE Nom de code Spécifications JDK Statut mai 2025 Période de maintenance Support étendu[32]
1.0 1.0.2 Java 1.0 Oak JSR 52 JDK 1.0.2 ObsolĂšte 1996-2000
1.1 8_16 Java 1.1 JSR 52 1.1.8_16 ObsolĂšte 1997-2000
1.2 2_017 J2SE 1.2 Playground JSR 52 1.2.2_11 ObsolĂšte 2000-2006
1.3 1_29 J2SE 1.3 Kestrel JSR 58 1.3.1_29 ObsolĂšte 2000-2001
1.4 2_30 J2SE 1.4 Merlin JSR 59 1.4.2_30 ObsolĂšte 2000-2008[33]
1.5 0_22 Ă  0_85 J2SE 5.0 Tiger JSR 176 1.5.0_22 ObsolĂšte 2002-2009[33] Mai 2015
1.6 0_45 à 0_111 Java SE 6 Mustang JSR 270 6u113 ObsolÚte 2005-2013[33] Décembre 2018
1.7 0_79 Ă  0_80 Java SE 7 Dolphin JSR 336 1.7.0_79 ObsolĂšte 2011- 2015[33] Juillet 2022
1.8 0_451 Java SE 8 Kenai[34] puis Spider JSR 337 8u451 Stable Mars 2022 Décembre 2030
9 9.0.4 Java SE 9 Umbrella JSR 379[35] 9.0.4 ObsolĂšte 2018
10 10.0.2 Java SE 10 JSR 383 10.0.2 ObsolĂšte 2018
11 11.0.13 Java SE 11 JSR 384 11.0.13+10 version LTS Septembre 2023 Janvier 2032
12 12.0.2 Java SE 12 JSR 386 12.0.2 ObsolĂšte 2021
13 13.0.2 Java SE 13 JSR 388 13.0.2 ObsolĂšte 2021
14 14.0.2 Java SE 14 JSR 389 14.0.2 ObsolĂšte 2021
15 15.0.2 Java SE 15 JSR 390 15.0.2 ObsolĂšte 2021
16 16.0.2 Java SE 16 JSR 391 16.0.2 ObsolĂšte 2021
17 17.0.1+12 Java SE 17 JSR 392 17.0.1 version LTS Septembre 2026 Septembre 2029
18 18.0.2.1 Java SE 18 JSR 393 18.0.2.1 ObsolĂšte Septembre 2022
19 19.0.2 Java SE 19 JSR 394 19.0.2 ObsolĂšte Mars 2023
20 20.0.2 Java SE 20 JSR 395 20.0.2 ObsolĂšte Septembre 2023
21 21.0.1 Java SE 21 JSR 396 21.0.1 version LTS Septembre 2028 Septembre 2031
22 22.0.1 Java SE 22 JSR 397 22.0.1 ObsolĂšte Septembre 2024
23 23.0.1 Java SE 23 JSR 398 23.0.1 ObsolĂšte Mars 2025
24 24.0.1 Java SE 24 JSR 399 24.0.1 Stable Septembre 2025

Contenu et évolutions

[modifier | modifier le code]
Du JDK 1.0 au J2SE 1.4
[modifier | modifier le code]
  • JDK 1.0 (23 janvier 1996 - 211 classes et interfaces) — Version initiale[36].
  • JDK 1.1 (19 fĂ©vrier 1997 - 477 classes et interfaces) — De nombreux ajouts[37] avec notamment :
    • une refonte complĂšte du modĂšle Ă©vĂ©nementiel AWT ;
    • les classes internes sont ajoutĂ©es au langage ;
    • JavaBeans ;
    • JDBC ;
    • Java Remote Invocation (RMI).
  • J2SE 1.2 (9 dĂ©cembre 1998 - 1 524 classes et interfaces) — Nom de code Playground. Cette version et les suivantes jusque J2SE 7.0 sont rebaptisĂ©es Java 2 et la version nommĂ©e J2SE (Java 2 Platform, Standard Edition) remplace JDK pour distinguer la plateforme de base de la version J2EE (Java 2 Platform, Enterprise Edition) et de la version J2ME (Java 2 Platform, Micro Edition). Plusieurs ajouts[38] dont :
    • le mot-clĂ© strictfp (strict floating-point : virgule flottante stricte) ;
    • la rĂ©flexion ;
    • l’API graphique Swing est intĂ©grĂ©e ;
    • pour la premiĂšre fois, la machine virtuelle Java de Sun inclut un compilateur « Compilation Ă  la volĂ©e Â» (Just in Time) ;
    • Java Plug-in ;
    • Java IDL, une implĂ©mentation de IDL pour l’interopĂ©rabilitĂ© avec CORBA ;
    • le framework Collections.
  • J2SE 1.3 (8 mai 2000 - 1 840 classes et interfaces) — Nom de code Kestrel. Changements principaux[39] :
    • HotSpot JVM inclus (La machine virtuelle HotSpot sortit en avril 1999 pour la machine virtuelle du J2SE 1.2) ;
    • changement pour les RMI pour ĂȘtre basĂ© sur CORBA ;
    • JavaSound ;
    • JNDI (Java Naming and Directory Interface) inclus de base (disponible auparavant comme extension) ;
    • JPDA (Java Platform Debugger Architecture).
  • J2SE 1.4 (6 fĂ©vrier 2002 - 2 723 classes et interfaces) — Nom de code Merlin. Ce fut la premiĂšre rĂ©vision de la plateforme sous JCP (Java Community Process)[40]. Les principaux changements[41] sont :
    • le mot-clĂ© assert (SpĂ©cifiĂ© dans JSR 41[42]) ;
    • les expressions rationnelles modĂ©lisĂ©es en s’inspirant du langage Perl ;
    • le chaĂźnage d’exception permet Ă  une exception d’encapsuler l’exception de bas niveau d’origine. (SpĂ©cifiĂ© dans (en) JSR 51) ;
    • API de journalisation (SpĂ©cifiĂ©e dans (en) JSR 47) ;
    • l’API Image I/O pour lire et Ă©crire des images dans des formats comme JPEG et PNG ;
    • l'intĂ©gration d’un parser XML et du moteur XSLT nommĂ© JAXP (SpĂ©cifiĂ© dans (en) JSR 5 et (en) JSR 63) ;
    • l'intĂ©gration des extensions de sĂ©curitĂ© JCE (Java Cryptography Extension (en)), JSSE et JAAS ;
    • Java Web Start (introduit pour la premiĂšre fois en mars 2001 pour J2SE 1.3 - SpĂ©cifiĂ© dans (en) JSR 56).
J2SE 5.0
[modifier | modifier le code]

Sortie le 30 septembre 2004 (3 270 classes et interfaces), son nom de code est Tiger. Elle est initialement numĂ©rotĂ©e 1.5, qui est toujours utilisĂ© comme numĂ©ro de version interne[43]. DĂ©veloppĂ© par (en) JSR 176, Tiger ajoute un nombre significatif de nouveautĂ©s[44] au langage :

  • intĂ©gration du composant logiciel Java Web Start dans l'environnement d'exĂ©cution Java (JRE)[45] ;
  • programmation gĂ©nĂ©rique — (SpĂ©cifiĂ© par (en) JSR 14) ;
  • metadata — Ă©galement appelĂ©es annotations, permet au langage de construire des classes et des mĂ©thodes Ă©tiquetĂ©es avec des donnĂ©es additionnelles qui peuvent ĂȘtre utilisĂ©es en tant que mĂ©ta-donnĂ©es (SpĂ©cifiĂ©e dans (en) JSR 175) ;
  • autoboxing/unboxing — conversion automatique entre des types primitifs (comme le type int) et le Wrapper de classe correspondant (comme la classe Integer) (SpĂ©cifiĂ© dans (en) JSR 201) ;
  • Ă©numĂ©rations — le mot-clĂ© enum permet de crĂ©er une liste ordonnĂ©e de valeurs en gardant la sĂ»retĂ© du typage. Auparavant, ceci pouvait seulement ĂȘtre rĂ©alisĂ© par des entiers constants (SpĂ©cifiĂ© dans JSR 201) ;
  • varargs — la syntaxe Object
 utilisĂ©e dans une dĂ©claration de mĂ©thode permet de spĂ©cifier un nombre variable d’arguments pour cette mĂ©thode. C’est un fonctionnement Ă©quivalent Ă  la fonction « printf Â» en C ;
  • imports statiques — Cette fonctionnalitĂ© permet d’utiliser les constantes d’une classe sans spĂ©cifier le nom de cette classe et sans passer par « l’anti-pattern Constant Interface Â» (c’est l’expression utilisĂ©e sur le site de Sun) ;
  • extension du for pour les boucles — la syntaxe du for est Ă©tendue avec une syntaxe spĂ©ciale pour itĂ©rer sur n’importe quel objet itĂ©rable comme un tableau, ou une collection en utilisant la syntaxe :
        void displayWidgets (Iterable<Widget> widgets) {
            for (Widget w : widgets) {
                w.display();
            }
        }

Cet exemple parcourt le contenu de l’objet widgets de la classe Iterable et contenant uniquement des rĂ©fĂ©rences vers des objets de la classe Widget, assignant chacun de ces Ă©lĂ©ments Ă  la variable w et ensuite appelle la mĂ©thode display() sur l’élĂ©ment w (spĂ©cifiĂ© dans JSR 201). Une syntaxe similaire sera introduite en 2011 dans C++11.

En plus des changements au niveau du langage, des changements plus importants ont eu lieu au fil des annĂ©es qui ont conduit des quelques centaines de classes dans le JDK 1.0 Ă  plus de 3 000 dans J2SE 5.0. Des API entiĂšres, comme Swing ou Java2D, ont Ă©tĂ© ajoutĂ©es et beaucoup de mĂ©thodes de l’original JDK 1.0 ont Ă©tĂ© dĂ©clarĂ©es deprecated (c’est-Ă -dire dĂ©conseillĂ©es, elles pourraient ĂȘtre supprimĂ©es dans une version ultĂ©rieure de Java).

Java SE 6
[modifier | modifier le code]

Sortie le 11 dĂ©cembre 2006 (3 777 classes et interfaces dans plus de 20 paquetages), son nom de code est Mustang[46]. Une version bĂȘta est sortie le 15 fĂ©vrier 2006, une autre bĂȘta en juin 2006, une version « release candidate Â» en novembre 2006, et la version finale le 12 dĂ©cembre 2006. Avec cette version, Sun remplace dĂ©finitivement le nom J2SE par Java SE et supprime le .0 au numĂ©ro de version[47].

Cette version a Ă©tĂ© l'objet de nombreuses failles de sĂ©curitĂ© et leurs mises Ă  jour correctives, conduisant Ă  la version 1.6.0_45 par Oracle et mĂȘme 1.6.0_51 pour sa version Mac OS. C'est d'ailleurs lĂ  la derniĂšre version de Java fonctionnant pour Mac OS X 10.6 et antĂ©rieurs.

Java SE 7 (LTS)
[modifier | modifier le code]

Sortie le 7 juillet 2011 (8 000[48] classes et interfaces), son nom de code est Dolphin. Il s’agit de la premiĂšre version sous la licence GNU GPL.

DĂšs l'update 6 (7u6), l'Ă©dition standard Oracle de Java supportant de nouveau pleinement Mac OS X[49], les mises Ă  jour pour cet OS ne sont plus prises en charge par Apple mais par Oracle. Toutefois cette version de Java n'est pas supportĂ©e par Mac OS X v10.6 : En effet certaines API requises par Java 7 ont bien Ă©tĂ© incluses par Apple dans Mac OS X 10.7.3, mais il n'est pas prĂ©vu qu'elles soient implĂ©mentĂ©es sur les prĂ©cĂ©dentes versions de Mac OS[50]. La version 7u90 d'avril 2015 est la derniĂšre mise Ă  jour de Java 7 disponible publiquement[51].

Java 7 propose entre autres les nouveautĂ©s suivantes :

  • la notation binaire ;
  • le formatage numĂ©rique pour plus de lisibilitĂ© ;
  • les switch avec des string ;
  • l'infĂ©rence des types Ă  la crĂ©ation d'instance pour Ă©viter une redondance de syntaxe (cf. List<String> lst = new ArrayList<>();) ;
  • le multicatch permettant de concatĂ©ner les exceptions catchĂ©es via des | ;
  • java.nio (JSR 203) qui propose notamment une nouvelle interface Path, un systĂšme de parcours des rĂ©pertoires, un service de watch

  • les tasks pour parallĂ©liser les calculs jugĂ©s trop lourd ou trop coĂ»teux ;
  • l'autoboxing d'objets vers les types primitifs ;
  • interface utilisateur : transparence des frames, bordures arrondies, gestion des Ă©vĂšnements asynchrones via les secondary loops, les JLayers, les Painters, le nouveau style Nimbus

Java SE 8 (LTS)
[modifier | modifier le code]

Nom de code Kenaï. Diverses releases en cours de développement du JDK sont disponibles au téléchargement dÚs l'automne 2013[52], et Java 8 sort mi-mars 2014 conformément à une feuille de route présentée par Oracle dÚs mai 2013[53].

Une des nouveautĂ©s majeures de cette version est l’ajout des lambdas[54], entraĂźnant une refonte d'une partie de l'API, notamment les collections et la notion de stream. Les autres ajouts notables incluent les optionnels, les implĂ©mentations par dĂ©faut au sein d'une interface, une refonte de l'API date, etc. En revanche la version Enterprise Edition (Java 8 EE) n'est pas attendue avant 2017.

La modularisation de la JVM avec le projet Jigsaw, initialement prévue pour cette version, est quant à elle reportée à la version 9[55], du fait notamment des failles de sécurité rencontrées par Java 6 dont Oracle a privilégié la correction en 2013 par rapport aux évolutions de Java.

Java SE 9
[modifier | modifier le code]

Initialement prévue pour 2015 mais reportée en partie à cause du projet Jigsaw, cette version est finalement sortie le 21 septembre 2017[56].

Java 9 intĂšgre :

  • le projet Jigsaw permettant de modulariser les modules chargĂ©s au sein du JDK ;
  • JShell[57], le projet Kulla visant la crĂ©ation d'un shell pour Java sur le format read–eval–print loop (en) ;
  • le projet Valhalla visant une amĂ©lioration des types Java ;
  • un support natif de HTTP/2[58] Cf Release Note Oracle[59]. Il faut utiliser des bibliothĂšques pour JSON[60].
Java SE 10
[modifier | modifier le code]

Cette version est sortie le 20 mars 2018[61].

Cette nouvelle version intĂšgre notamment :

  • JEP 286[62] : infĂ©rence des types des variables locales;
  • JEP 310[63] : partage de binaire pour permettre un lancement plus rapide
  • JEP 317[64] : activation de Graal un compilateur JIT en Java
Java SE 11 (LTS)
[modifier | modifier le code]

Cette version est sortie le 25 septembre 2018[65].

Au-delĂ  du changement du modĂšle de support Ă  long terme des versions, cette version intĂšgre notamment :

  • JEP 323 : amĂ©lioration sur les paramĂštres des lambda
  • JEP 321 : un client HTTP plus Ă©voluĂ©
  • JEP 320 : suppression des modules CORBA et EE par dĂ©faut
Java SE 12
[modifier | modifier le code]

Cette version est sortie le 19 mars 2019[66].

Cette version intĂšgre 8 Ă©volutions :

  • JEP 189 : Shenandoah, un ramasse miette avec de courte pauses (ExpĂ©rimentale)
  • JEP 230 : suite d'outils de microbenchmark pour le code source du JDK
  • JEP 325 : expressions Switch (aperçu)
  • JEP 334 : API Constants, permettant d'ajouter des informations dans les mĂ©tadonnĂ©es dans les fichiers .class, utile pour les langages sur la JVM)
  • JEP 340 : un seul portage pour l'architecture ARM 64bits
  • JEP 341 : Default CDS Archives, chargement des informations des classes de la JVM plus rapide
  • JEP 344 et JEP 346 : amĂ©liorations du ramasse miette G1
Java SE 13
[modifier | modifier le code]

Cette version est sortie le 17 septembre 2019[67].

  • JEP 355 : Text Blocks
  • JEP 354 : (Switch - aperçu v2) Nouveau case case...-> (case traditionnel case...:)
    switch(nombre){
        //case traditionnel
        case 5:
            System.out.println("La variable est égale à 5");
            break;
            
        //nouveau case
        case 5 -> System.out.println("La variable est égale à 5");
    }
    
Java SE 14
[modifier | modifier le code]

Cette version est sortie le 17 mars 2020[68]

  • JEP 343 : Incubator
  • JEP 358 : Plus de prĂ©cision de la part du compilateur sur les erreurs NullPointerExceptions
  • JEP 361 : (Switch - version finale) Nouveau case case...-> (case traditionnel case...:)[69]
  • JEP 362 : DĂ©prĂ©ciation des ports Solaris et SPARC
  • JEP 368 : Text Blocks
Java SE 15
[modifier | modifier le code]

Cette version est sortie le 15 septembre 2020[70].

? Pas de JEP ?

Java SE 16
[modifier | modifier le code]

Cette version est sortie le 16 mars 2021[71].

? Pas de JEP ?

Java SE 17 (LTS)
[modifier | modifier le code]

Cette version est sortie le 14 septembre 2021[72].

  • JEP 306 : Restauration de la sĂ©mantique stricte permanente pour la virgule flottante
  • JEP 356 : GĂ©nĂ©rateur amĂ©liorĂ© de nombre pseudo-alĂ©atoire
  • JEP 382 : Nouveau pipeline de rendu macOS
  • JEP 391 : Portage macOS AArch64
  • JEP 398 : DĂ©prĂ©ciation pour suppression de l'API Applet
  • JEP 403 : Encapsulation forte des internes du JDK
  • JEP 406 : Filtrage par motif (Pattern Matching) pour switch (prĂ©version)
  • JEP 407 : Suppression de l'activation de RMI
  • JEP 409 : Classes scellĂ©es
  • JEP 410 : Suppression du compilateur expĂ©rimental AOT et JIT
  • JEP 411 : DĂ©prĂ©ciation pour suppression du gestionnaire de sĂ©curitĂ©
  • JEP 412 : API de fonction Ă©trangĂšre et de mĂ©moire (incubation)
  • JEP 414 : API vectorielle (deuxiĂšme incubation)
  • JEP 415 : Filtres de dĂ©sĂ©rialisation spĂ©cifiques au contexte
Java SE 18
[modifier | modifier le code]

Cette version est sortie le 22 mars 2022[73].

Liste des JEP[74]:

  • JEP 400 : UTF-8 par dĂ©faut
  • JEP 408 : Simple Web Server
  • JEP 413 : Code Snippets dans la documentation de l'API Java
  • JEP 416 : RĂ©implĂ©menter la Core Reflection with Method Handles
  • JEP 417 : API Vector (TroisiĂšme Incubateur)
  • JEP 418 : Internet-Address Resolution SPI
  • JEP 419 : Foreign Function & Memory API (deuxiĂšme incubateur)
  • JEP 420 : Pattern Matching for switch (Second Preview)
  • JEP 421 : Deprecate Finalization for Removal
Java SE 19
[modifier | modifier le code]

Cette version est sortie le 20 septembre 2022[75].

  • JEP 415 : le JDK est portĂ© pour Linux sur l'architecture RISC-V.
Java SE 20
[modifier | modifier le code]

Cette version est sortie le 21 mars 2023[76].

  • JEP 429 : Valeurs ciblĂ©es (incubation)
  • JEP 432 : ModĂšles d'enregistrement (deuxiĂšme aperçu)
  • JEP 433 : Correspondance des modĂšles pour switch (quatriĂšme aperçu)
  • JEP 434 : API de mĂ©moire et de fonctions Ă©trangĂšres (second aperçu)
  • JEP 436 : Fils virtuels (deuxiĂšme aperçu)
  • JEP 437 : SimultanĂ©itĂ© structurĂ©e (deuxiĂšme incubation)
  • JEP 438 : API de vecteur (cinquiĂšme incubation)
Java SE 21 (LTS)
[modifier | modifier le code]

Cette version est sortie le 19 septembre 2023[77].

Java SE 22
[modifier | modifier le code]

Cette version est sortie le 19 mars 2024[78].

Java SE 23
[modifier | modifier le code]

Cette version est sortie le 17 septembre 2024[79].

Java SE 24
[modifier | modifier le code]

Cette version est sortie le 18 mars 2025[80].

Philosophie

[modifier | modifier le code]

Lors de la crĂ©ation du langage Java, il avait Ă©tĂ© dĂ©cidĂ© que ce langage devait rĂ©pondre Ă  cinq objectifs[81] :

  1. simple, orientĂ© objet et familier ;
  2. robuste et sĂ»r ;
  3. indĂ©pendant de la machine employĂ©e pour l'exĂ©cution ;
  4. trĂšs performant ;
  5. compilé, multi-tùches et dynamique.

Langage orienté objet et familier

[modifier | modifier le code]
Article connexe : Programmation orientĂ©e objet.

La premiĂšre caractĂ©ristique, le caractĂšre orientĂ© objet (« OO Â») et familier, fait rĂ©fĂ©rence Ă  une mĂ©thode de programmation et de conception du langage et le fait qu'un programme Ă©crit en Java ressemble assez fort Ă  un programme Ă©crit en C++.

Bien qu’il existe plusieurs interprĂ©tations de l’expression orientĂ© objet, une idĂ©e phare dans ce type de dĂ©veloppement est que les diffĂ©rents types de donnĂ©es doivent ĂȘtre directement associĂ©s avec les diffĂ©rentes opĂ©rations qu’on peut effectuer sur ces donnĂ©es. En consĂ©quence, les donnĂ©es (appelĂ©es PropriĂ©tĂ©s) et le code les manipulant (appelĂ© MĂ©thodes) sont combinĂ©s dans une mĂȘme entitĂ© appelĂ©e Classe d'objet. Le code devient logiquement dĂ©coupĂ© en petites entitĂ©s cohĂ©rentes et devient ainsi plus simple Ă  maintenir et plus facilement rĂ©utilisable, Ă©tant intrinsĂšquement modulaire.

D’autres mĂ©canismes tels que l’hĂ©ritage permettent d’exploiter toutes les caractĂ©ristiques d’une Classe prĂ©cĂ©demment Ă©crite dans ses propres programmes sans mĂȘme avoir Ă  en connaĂźtre le fonctionnement interne — on n’en voit que l’interface (l'interface dĂ©crit les propriĂ©tĂ©s et les mĂ©thodes sans fournir le code associĂ©). Java interdit la notion d'hĂ©ritage depuis plusieurs classes parent sauf si elles sont des interfaces.

Dans la version 1.5 du langage ont Ă©tĂ© rajoutĂ©s les gĂ©nĂ©riques, un mĂ©canisme de polymorphisme similaire (mais diffĂ©rent) aux templates du langage C++ ou aux foncteurs d’OCaml. Les gĂ©nĂ©riques permettent d’exprimer d’une façon plus simple et plus sĂ»re (du point de vue du typage) les propriĂ©tĂ©s d’objets comme des conteneurs (listes, arbres
) : le type liste est alors considĂ©rĂ© gĂ©nĂ©riquement par rapport au type d’objet contenu dans la liste.

Mécanisme du ramasse-miettes

[modifier | modifier le code]
Article connexe : Ramasse-miettes en informatique.

Cet Ă©lĂ©ment contribue Ă  la robustesse et Ă  la performance des programmes, le ramasse-miettes (Garbage Collector) est appelĂ© rĂ©guliĂšrement et automatiquement pendant l'exĂ©cution du programme. Sur les systĂšmes multi-processeurs et/ou multi-cƓurs, celui-ci emploie mĂȘme des threads multiples Ă  faible prioritĂ© afin de perturber le moins possible l'exĂ©cution du programme[82]. En outre, le programmeur peut au besoin suggĂ©rer de lancer le ramasse-miettes Ă  l’aide de la mĂ©thode System.gc().

Un grief rĂ©current Ă  l’encontre de langages comme C++ est la lourde tĂąche d’avoir Ă  programmer manuellement la gestion de la mĂ©moire. En C++, la mĂ©moire allouĂ©e par le programme pour crĂ©er un objet est dĂ©sallouĂ©e lors de la destruction de celui-ci (par exemple par un appel explicite Ă  l'opĂ©rateur delete). Si le programmeur oublie de coder la dĂ©sallocation, ceci aboutit Ă  une « fuite mĂ©moire Â», et le programme en consomme de plus en plus. Pire encore, si par erreur un programme demande plusieurs fois une dĂ©sallocation, ou emploie une zone de mĂ©moire aprĂšs avoir demandĂ© sa dĂ©sallocation, celui-ci deviendra trĂšs probablement instable et causera une erreur fatale.

En Java, une grande partie de ces problĂšmes est Ă©vitĂ©e grĂące au ramasse-miettes. L'espace mĂ©moire nĂ©cessaire Ă  chaque objet créé est gĂ©rĂ© dans un tas de mĂ©moire (en anglais : memory heap) rĂ©servĂ© Ă  cet usage. Le programme accĂšde Ă  chaque objet via une rĂ©fĂ©rence dans le tas. Quand il n'existe plus aucune rĂ©fĂ©rence permettant d'atteindre un objet, le ramasse-miettes le dĂ©truit automatiquement — puisqu'il est devenu inaccessible â€” libĂ©rant la mĂ©moire et prĂ©venant ainsi toute fuite de mĂ©moire.

Le ramasse-miettes emploie un algorithme de marquage puis libĂ©ration (en anglais : mark and sweep[82]) qui permet de gĂ©rer les cas complexes d'objets se rĂ©fĂ©rençant mutuellement ou de boucles de rĂ©fĂ©rences (cas d'une liste Ă  chaĂźnage double par exemple). En pratique, il subsiste des cas d'erreur de programmation oĂč le ramasse-miettes considĂšre qu'un objet est encore utile alors que le programme n'y accĂšde plus fonctionnellement (mais garde une rĂ©fĂ©rence sur l'objet), ce qui constitue un cas particulier de « fuite mĂ©moire Â».

Le ramasse-miettes rend sensiblement plus simple et plus sûre la gestion de la mémoire. Les concepteurs et les utilisateurs de programmes ou bibliothÚques (en anglais Libraries) n'ont pas à se soucier de la désallocation des objets (opérateur delete en C++), sauf éventuellement pour des raisons de performance.

Indépendance vis-à-vis de la plateforme

[modifier | modifier le code]
Articles connexes : Bytecode Java et Compilation Ă  la volĂ©e.

L’indĂ©pendance vis-Ă -vis de la plateforme signifie que les programmes Ă©crits en Java fonctionnent de maniĂšre parfaitement similaire sur diffĂ©rentes architectures matĂ©rielles. La licence de Sun pour Java insiste ainsi sur le fait que toutes les implĂ©mentations doivent ĂȘtre compatibles. On peut ainsi thĂ©oriquement effectuer le dĂ©veloppement sur une architecture donnĂ©e et faire tourner l’application finale sur toutes les autres.

Ce rĂ©sultat est obtenu par :

  • des bibliothĂšques standard fournies pour pouvoir accĂ©der Ă  certains Ă©lĂ©ments de la machine hĂŽte (le graphisme, le multithreading, la programmation rĂ©seau
) exactement de la mĂȘme maniĂšre sur toutes les architectures ;
  • des compilateurs Java qui compilent le code source « Ă  moitiĂ© Â» afin d’obtenir un bytecode (plus prĂ©cisĂ©ment le bytecode Java, un langage de type assembleur, proche de la machine virtuelle et spĂ©cifique Ă  la plateforme Java).
Ce bytecode a ensuite vocation Ă  ĂȘtre interprĂ©tĂ© sur une machine virtuelle Java (JVM en anglais), un programme Ă©crit spĂ©cifiquement pour la machine cible qui interprĂšte le bytecode Java et fait exĂ©cuter par la machine les instructions traduites en code natif.

Noter que mĂȘme s’il y a explicitement une premiĂšre phase de compilation, le bytecode Java est soit interprĂ©tĂ©, soit converti Ă  la volĂ©e en code natif par un compilateur Ă  la volĂ©e (just in time, JIT).

Types de compilations

[modifier | modifier le code]

Les premiĂšres implĂ©mentations du langage utilisaient une machine virtuelle interprĂ©tĂ©e pour obtenir la portabilitĂ©. Ces implĂ©mentations produisaient des programmes qui s’exĂ©cutaient plus lentement que ceux Ă©crits en langage compilĂ© (C, C++, etc.) si bien que le langage souffrit d’une rĂ©putation de faibles performances.

Des implĂ©mentations plus rĂ©centes de la machine virtuelle Java (JVM) produisent des programmes beaucoup plus rapides qu’auparavant, en utilisant diffĂ©rentes techniques :

  • La premiĂšre technique est de compiler directement en code natif comme un compilateur traditionnel, supprimant complĂštement la phase de bytecode. Des compilateurs Java tels que GNU Compiler for Java (GCJ) compilent ainsi directement le Java en code objet natif pour la machine cible. On obtient ainsi de bonnes performances, mais aux dĂ©pens de la portabilitĂ© : le code final produit par ces compilateurs ne peut de ce fait ĂȘtre exĂ©cutĂ© que sur une seule architecture ;
  • Une autre technique appelĂ©e compilation « juste-Ă -temps Â», ou « Ă  la volĂ©e Â» (just in time, JIT), traduit le byte code en code natif durant la phase de lancement du programme ;
  • Certaines machines virtuelles plus sophistiquĂ©es utilisent une recompilation dynamique durant laquelle la machine virtuelle analyse le comportement du programme et en recompile sĂ©lectivement certaines parties. La recompilation dynamique permet d’obtenir de meilleurs rĂ©sultats que la compilation statique car les compilateurs dynamiques peuvent optimiser en fonction de leur connaissance de l’environnement cible et des classes qui sont utilisĂ©es.
La compilation JIT et la recompilation dynamique permettent à Java de tirer profit de la rapidité du code natif sans perdre la portabilité.

Bilan de la portabilité Java

[modifier | modifier le code]

AprĂšs que Sun eut constatĂ© que l’implĂ©mentation de Microsoft ne supportait pas les interfaces RMI et JNI, et comportait des Ă©lĂ©ments spĂ©cifiques Ă  certaines plateformes par rapport Ă  sa plateforme initiale, Sun dĂ©posa plainte en justice contre Microsoft[83], et obtint des dommages et intĂ©rĂȘts (20 millions de dollars). Cet acte de justice renforça encore les termes de la licence de Sun. En rĂ©ponse, Microsoft arrĂȘta le support de Java sur ses plateformes et, sur les versions rĂ©centes de Windows, Internet Explorer ne supporte pas les applets Java sans ajouter de plug-in. Cependant, Sun met Ă  disposition gratuitement des environnements d’exĂ©cution de Java pour les diffĂ©rentes plateformes Microsoft.

La portabilitĂ© est techniquement un objectif difficile Ă  atteindre et le succĂšs de Java en ce domaine est mitigĂ©. Quoiqu’il soit effectivement possible d’écrire des programmes pour la plateforme Java qui fonctionnent correctement sur beaucoup de machines cibles, le nombre important de plateformes avec de petites erreurs et des incohĂ©rences a abouti Ă  un dĂ©tournement du slogan de Sun « Write once, run anywhere Â» (« Ă‰crire une fois, exĂ©cuter n'importe oĂč Â») en « Write once, debug everywhere Â» (« Ă‰crire une fois, dĂ©boguer partout Â») !

L’indĂ©pendance de Java vis-Ă -vis de la plateforme est cependant un succĂšs avec les applications cĂŽtĂ© serveur comme les services web, les servlets et les JavaBeans aussi bien que les systĂšmes embarquĂ©s sur OSGi, utilisant l’environnement Embedded Java.

Exécution sécurisée de code distant

[modifier | modifier le code]

La plateforme Java fut l’un des premiers systĂšmes Ă  offrir le support de l’exĂ©cution du code Ă  partir de sources distantes. Une applet peut fonctionner dans le navigateur web d’un utilisateur, exĂ©cutant du code tĂ©lĂ©chargĂ© d’un serveur HTTP. Le code d’une applet fonctionne dans un espace trĂšs restrictif, ce qui protĂšge l’utilisateur des codes erronĂ©s ou mal intentionnĂ©s. Cet espace est dĂ©limitĂ© par un objet appelĂ© gestionnaire de sĂ©curitĂ©. Un tel objet existe aussi pour du code local, mais il est alors par dĂ©faut inactif.

Le gestionnaire de sĂ©curitĂ© (la classe SecurityManager) permet de dĂ©finir un certain nombre d’autorisations d’utilisation des ressources du systĂšme local (systĂšme de fichiers, rĂ©seau, propriĂ©tĂ©s systĂšme
). Une autorisation dĂ©finit :

  1. Un code accesseur (typiquement, une applet — Ă©ventuellement signĂ©e — envoyĂ©e depuis un serveur web) ;
  2. Une ressource locale concernĂ©e (par exemple un rĂ©pertoire) ;
  3. Un ensemble de droits (par exemple lire/écrire).

Les Ă©diteurs d’applet peuvent demander un certificat pour leur permettre de signer numĂ©riquement une applet comme sĂ»re, leur donnant ainsi potentiellement (moyennant l’autorisation adĂ©quate) la permission de sortir de l’espace restrictif et d’accĂ©der aux ressources du systĂšme local.

ÉlĂ©ments du langage

[modifier | modifier le code]

Voici un exemple d’un programme Hello world typique Ă©crit en Java :

 public class HelloWorld {
     public static void main(String[] args) {
         System.out.println("Hello world!");
     }
 }

Le fichier source porte presque toujours le nom de la classe avec l'extension « .java Â» (ici « HelloWorld.java Â», ce serait mĂȘme obligatoire car la classe possĂšde l'attribut public dans sa dĂ©claration — la rendant alors accessible Ă  tout autre programme). On peut compiler puis exĂ©cuter cet exemple sur le terminal avec les commandes suivantes (sous Linux) :

javac HelloWorld.java
export CLASSPATH=.
java HelloWorld

La ligne « export CLASSPATH=. Â» sert Ă  indiquer Ă  Java qu’il doit Ă©galement chercher les programmes class dans le rĂ©pertoire courant. Ce chemin peut Ă©galement ĂȘtre spĂ©cifiĂ© au lancement du programme par l’option -classpath (ou -cp en abrĂ©gĂ©) :

java -cp. HelloWorld

Mots réservés, primitifs et littéraux

[modifier | modifier le code]

Les Ă©lĂ©ments syntaxiques suivants sont les mots-clĂ©s du langage Java :

abstract else instanceof static try boolean false
assert (1.4) enum (5.0) interface strictfp (1.2) volatile byte true
break extends native super while char
case final new switch double
catch finally package synchronized float
class for private this int
const (*) goto (*) protected throw long
continue if public throws short
default implements return transient void null
do import

Notes :

  • (*) ces mots clefs sont rĂ©servĂ©s mais n'ont pas de signification pour le compilateur (il est juste interdit d'employer ce nom pour une variable par exemple) ;
  • (1.2), (1.4) et (5.0) ces mots clefs ont Ă©tĂ© ajoutĂ©s avec la version indiquĂ©e du langage.

(source)

Classe, attribut, méthode

[modifier | modifier le code]

Notion de classe

[modifier | modifier le code]

Une classe est la description de donnĂ©es appelĂ©es attributs, et d’opĂ©rations appelĂ©es mĂ©thodes. Il s'agit d'un modĂšle de dĂ©finition pour des objets ayant le mĂȘme ensemble d’attributs, et le mĂȘme ensemble d’opĂ©rations. À partir d’une classe on peut crĂ©er un ou plusieurs objets par instanciation ; chaque objet est une instance d’une seule classe.

VisibilitĂ© :

  • Public : le mot class est alors prĂ©cĂ©dĂ© de public, tout utilisateur qui importe le paquetage peut utiliser la classe. Dans ce cas elle doit ĂȘtre dĂ©finie dans un fichier qui a pour nom le nom de la classe.
  • PrivĂ© : le mot class est alors prĂ©cĂ©dĂ© de private, seules des classes dĂ©finies dans le mĂȘme fichier peuvent utiliser cette classe.
  • Paquetage : le mot class n’est pas prĂ©cĂ©dĂ© de mot particulier, toutes les classes du paquetage peuvent utiliser la classe.

Notion d'attribut

[modifier | modifier le code]

Un attribut se définit en donnant son type, puis son nom, et éventuellement une partie initialisation.

VisibilitĂ© :

  • Public : sa dĂ©finition est prĂ©cĂ©dĂ©e de public, et il peut ĂȘtre utilisĂ© par tout utilisateur de la classe.
  • PrivĂ© : sa dĂ©finition est prĂ©cĂ©dĂ©e de private, et il ne peut ĂȘtre utilisĂ© qu’à l’intĂ©rieur de la classe.
  • ProtĂ©gĂ© : sa dĂ©finition est prĂ©cĂ©dĂ©e de protected, et il ne peut ĂȘtre utilisĂ© qu’à l’intĂ©rieur de la classe, du paquetage, ou des classes dĂ©rivĂ©es.
  • Paquetage : aucun mot particulier ne prĂ©cĂšde sa dĂ©finition, ainsi il peut ĂȘtre utilisĂ© dans toute classe du mĂȘme paquetage.

Notion de méthode

[modifier | modifier le code]

Une mĂ©thode est dĂ©finie par :

  • son type de retour : type de la valeur retournĂ©e par la mĂ©thode. Si la mĂ©thode ne retourne pas de valeur le type spĂ©cifiĂ© est alors void ;
  • son nom ;
  • ses paramĂštres : les paramĂštres sont spĂ©cifiĂ©s par leur type et leur nom et sont sĂ©parĂ©s par des virgules.

VisibilitĂ© :

  • Public : sa dĂ©finition est prĂ©cĂ©dĂ©e de public, et elle peut ĂȘtre utilisĂ©e par tout utilisateur de la classe.
  • PrivĂ© : sa dĂ©finition est prĂ©cĂ©dĂ©e de private, et elle ne peut ĂȘtre utilisĂ©e qu’à l’intĂ©rieur de la classe.
  • ProtĂ©gĂ© : sa dĂ©finition est prĂ©cĂ©dĂ©e de protected, et elle ne peut ĂȘtre utilisĂ©e qu’à l’intĂ©rieur de la classe, du paquetage, ou des classes dĂ©rivĂ©es.
  • Paquetage : aucun mot particulier ne prĂ©cĂšde sa dĂ©finition, ainsi la mĂ©thode peut ĂȘtre utilisĂ© dans toute classe du mĂȘme paquetage.

Types

[modifier | modifier le code]
Nom Taille en octets lors des calculs Valeur par défaut Valeurs possibles
boolean Un seul bit suffit, mais on réserve souvent un octet pour les stocker. false true, false
byte 1 0 entiers compris entre -128 et +127 (-27 et 27-1)
short 2 0 entiers compris entre −32 768 et 32 767 (-215 et 215-1)
int 4 0 entiers compris entre −2 147 483 648 et +2 147 483 647 (-231 et 231-1)
long 8 0 entiers compris entre −9 223 372 036 854 775 808 et 9 223 372 036 854 775 807 (-263 et 263-1)
char 2 '\u0000' Ensemble des valeurs Unicode (valeurs de U+0000 Ă  U+FFFF, 4 chiffres obligatoires aprĂšs '\u') Les 128 premiers caractĂšres sont les codes ASCII et se notent entre apostrophes : 'a', '1', '\'', '\n'.
float 4 0.0 Ensemble des nombres [−3,402 823 47 Ă— 1038 .. −1,402 398 46 Ă— 10−45], 0, [1,402 398 46 Ă— 10−45 .. 3,402 823 47 Ă— 1038]
double 8 0.0 Ensemble des nombres [−1,797 693 134 862 315 70 Ă— 10308 .. −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 Ă— 10308]
Object Dépendant de la machine virtuelle null

Le tableau ci-dessus recense les types de base, cependant il existe en Java d'autres types qui sont des objets et sont à utiliser en tant que tel. Par exemple pour définir un entier on peut utiliser le type 'Integer' dont la valeur d'initialisation par défaut vaudra null

Pour instancier une variable, la syntaxe (ici la mĂȘme qu'en C) est la suivante :

NomDuType maVariable;

maVariable est alors allouée sur la pile.

Les collections d'objets

[modifier | modifier le code]

Il est souvent nĂ©cessaire de stocker de nombreuses donnĂ©es dans des collections : liste d’achats, notes des Ă©lĂšves, etc. Les collections peuvent ĂȘtre consultĂ©es, modifiĂ©es, on peut les trier, les recopier, les supprimer, etc. Elles peuvent avoir une taille fixe ou variable.

Les collections Ă  taille fixe sont moins lourdes que les collections Ă  taille variable.

Collections de taille fixe

[modifier | modifier le code]
  • Les tableaux :
Comme en C, les indices d'un tableau de taille n vont de 0 à n-1. Un des plus grands avantages des tableaux est l’accùs en temps constant O(1), à chaque case du tableau.
Les tableaux sont des objets en Java. Pour initialiser un tableau tab d’entiers de 10 cases, on peut Ă©crire (entre autres) :
int[] tab = new int[10];
ou :
int tab[] = new int[10];
ou :
int tab[] = {0, 0, 0, 0, 0,
    0, 0, 0, 0, 0};
Les indices de tab vont de 0 Ă  9, et il ne pourra pas ĂȘtre redimensionnĂ©.
Chaque élément de tab est initialisé à sa valeur par défaut, ici 0 car il s'agit d'un tableau d'entiers (int). La valeur par défaut d'un objet est null, celle d'un booléen est false.
Pour lire ou modifier l'Ă©lĂ©ment de tab d'indice i, pour 0 ≀ i ≀ 9, on utilise tab[i].
Exemple : Pour attribuer la valeur 2 Ă  une case de tab, on Ă©crit : tab[i] = 2;
La propriĂ©tĂ© length (exemple : tab.length) fournit le nombre d'Ă©lĂ©ments du tableau. Si on essaie de modifier un Ă©lĂ©ment qui n’existe pas, par exemple avec tab [10] = 4;, une exception IndexOutOfBoundsException est dĂ©clenchĂ©e (notre tableau tab ne contient que 10 cases, numĂ©rotĂ©es de 0 Ă  9 inclus).

Collections de taille variable

[modifier | modifier le code]

La classe abstraite AbstractList est fournie pour implémenter les collections à taille variable.

Pour initialiser une ArrayList il faut importer la classe java.util.ArrayList et écrire liste = new ArrayList<T>(); ou liste = new ArrayList<>(); depuis le JDK 7.0.

Depuis le JDK 1.5, on a la possibilitĂ© d’indiquer le type des Ă©lĂ©ments contenus dans une ArrayList : Entiers, chaĂźnes de caractĂšres ou autres objets.

  • Cette collection est vide aprĂšs l’appel du constructeur ;
  • On peut ajouter autant d’élĂ©ments que l’on veut.

Pour ajouter un élément on écrit liste.add(Objet);

Pour accĂ©der Ă  un Ă©lĂ©ment de l’ArrayList : liste.get(index);

Pour connaĂźtre le nombre d’élĂ©ments que contient une liste : liste.size();

Pour supprimer un Ă©lĂ©ment : liste.remove(index); les Ă©lĂ©ments qui suivent l’élĂ©ment supprimĂ© seront dĂ©calĂ©s Ă  gauche.

Structures de contrĂŽle

[modifier | modifier le code]

Boucles

[modifier | modifier le code]

Bien qu’elles aient toutes un rĂŽle similaire, chaque boucle est pourtant adaptĂ©e Ă  une situation :

  • Structure tant que (adaptĂ©e pour effectuer des opĂ©rations tant qu’une condition est remplie) :
 while (<expression booléenne>) {
 	instruction(s)
 }
  • Structure faire 
 tant que (comme la structure tant que mais la premiĂšre itĂ©ration est exĂ©cutĂ©e quelle que soit la condition, pour les autres itĂ©rations la condition doit ĂȘtre remplie) :
 do {
    instruction(s)
 }
 while (<expression booléenne>);
  • Structure pour (adaptĂ©e lorsqu'une collection doit ĂȘtre parcourue en totalitĂ© pour traitement) :
 for (<initialisation> ; <condition de poursuite> ; <expression d’incrĂ©mentation>) {
    instruction(s)
 }
  • Structure pour chaque (simplification du for en for each, dans laquelle l'expression doit ĂȘtre un tableau ou une collection) :
 for (type variable : <expression>) {
    instruction(s)
 }
  • Structure pour (Java 1.5) :
 for (<Objet rĂ©cupĂ©rant l’occurrence suivante de la collection> : <collection d’objets>) {
    instruction(s)
 }

Structures conditionnelles

[modifier | modifier le code]
  • Structure si : condition simple
 if (<expression booléenne>) {
    instruction(s)
 }

Remarque : il est possible de combiner des conditions (expressions boolĂ©ennes) en utilisant des opĂ©rateurs supplĂ©mentaires : le « ET Â» logique && (instruction exĂ©cutĂ©e si toutes les conditions sont vraies) :

if (<condition 1> && <condition  2>) {
    instruction(s) si les conditions 1 et 2 sont vraies
}

Il existe aussi le « OU Â» logique || (instruction exĂ©cutĂ©e si au moins une des conditions est vraie) :

if (<condition 1> || <condition 2>) {
    instruction(s) si au moins une des deux est vraie
}

Enfin, il y a le « NON Â» logique ! qui permet d'inverser le rĂ©sultat d'une condition.

Il est possible de combiner ces opérations pour obtenir des structures conditionnelles complexes. On peut ajouter des parenthÚses pour définir les priorités des conditions (comme dans un calcul). Dans les autres cas, la JVM effectue les différentes vérifications de gauche à droite.

  • Structure si 
 sinon : condition avec alternative unique
 if (<expression booléenne>) {
     instruction(s)
 }
 else {
     instruction(s)
 }
  • Structure si 
 ou si 
 ou si 
 : condition avec alternatives multiples
 if (<expression booléenne>) {
     instruction(s)
 }
 else if (<expression booléenne>) {
     instruction(s)
 }
 else if (<expression booléenne>) {
     instruction(s)
 }
 else {
     instruction(s)
 }
  • Structure atteindre 
 cas x 
 cas y 
 : embranchement vers un bloc d’instructions Ă©numĂ©rĂ©.
 switch (<expression>) {
    case <constante>:
         instruction(s)
         break;
    case <constante>:
        instruction(s)
        break;
    [...]
    default:
         instruction(s)
         break;
 }

Le choix d'exĂ©cution des instructions est dĂ©terminĂ© par l'expression suivant switch dont le type peut ĂȘtre entier (int, char, byte ou short ou classes enveloppes correspondantes), Ă©numĂ©rĂ© (enum) ou String (chaĂźne de caractĂšres, depuis Java 7 seulement).

Remarque : L'opĂ©rateur conditionnel ou opĂ©rateur ternaire ? : peut permettre d'Ă©viter l'utilisation d'une instruction conditionnelle. Une expression conditionnelle aura l'une ou l'autre valeur aprĂšs test de la condition boolĂ©enne :

 <expression booléenne> ? <valeur si vrai> : <valeur si faux>

Branchements inconditionnels

[modifier | modifier le code]
  • L'instruction break fait sortir immĂ©diatement de la boucle en cours (for, while, do), mais permet Ă©galement de sortir d’une clause contenue dans un switch. Si le break est omis, l'exĂ©cution du switch se poursuit de case en case.
  • L'instruction continue termine l’itĂ©ration en cours et continue Ă  la prochaine. Son usage ainsi que celui de break dans les boucles est controversĂ© (de la mĂȘme maniĂšre que goto dans d'autres langages structurĂ©s). Elle tendrait Ă  favoriser un type de programmation non structurĂ©e (programmation spaghetti).
  • L’instruction return termine une mĂ©thode. Avec return uneValeur, uneValeur sera renvoyĂ©e Ă  la mĂ©thode appelante.

Traitement des exceptions

[modifier | modifier le code]
 try {
       instruction(s)
 }
 catch (<type exception> <variable>) {
       instruction(s)
 } 
 [...]
 finally {
       instruction(s)
 }

Le bloc de code finally sera exécuté quel que soit le résultat lorsque le programme sortira du bloc try-catch.

Voici un exemple de capture d’une exception :

  
 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();
 }

Cet exemple permet d’illustrer le mĂ©canisme des exceptions en Java. Dans le cas d’une erreur d’entrĂ©e/sortie dans le bloc try, l’exĂ©cution reprend dans le bloc catch correspondant Ă  cette situation (exception de type IOException).

Dans ce bloc catch, la variable e rĂ©fĂ©rence l’exception qui s’est produite. Ici, nous invoquons la mĂ©thode printStackTrace() qui affiche dans la console des informations sur l’exception qui s’est produite : nom, motif, Ă©tat de la pile d’appels au moment de la levĂ©e de l’exception et, Ă©ventuellement, numĂ©ro de ligne auquel l’erreur s’est produite.

Le bloc finally est ensuite exĂ©cutĂ© (ici pour refermer les ressources utilisĂ©es). Il ne s’agit ici que d’un exemple, l’action Ă  mettre en Ɠuvre lorsqu’une exception survient dĂ©pend du fonctionnement gĂ©nĂ©ral de l’application et de la nature de l’exception.

Types génériques

[modifier | modifier le code]

Un type générique est autrement appelé un Template, il prend un ou plusieurs autres types en arguments. Le type passé en paramÚtre est déterminé lors de l'instanciation.

Cela permet notamment dans le cadre des ArrayList d'éviter les transtypages.

 public class ArrayList<E> {
    ArrayList<String> al = new ArrayList<String>();
 }

Ces types génériques ne sont utilisés qu'à la compilation, et non directement dans le bytecode.

DiffĂ©rence avec le C++ : les templates en C++ dupliquent une classe pour chaque type. Java, au contraire, agit au moment de la compilation comme si on avait dupliquĂ© les classes de ces types intrinsĂšques mais ne traite en rĂ©alitĂ© qu'avec une seule classe.

Codage du code source

[modifier | modifier le code]

Les spĂ©cifications du langage Java prĂ©cisent qu’il est formĂ© de caractĂšres au format UTF-16, ce qui permet l’utilisation dans le code source de tous les caractĂšres existant dans le monde :

 public class HelloWorld {
    private String text = "hello world";
 }

Pour assurer la portabilitĂ© entre plateformes, les noms de classes devraient nĂ©anmoins ĂȘtre formĂ©s uniquement de caractĂšres ASCII.

Opérateur de comparaison

[modifier | modifier le code]
Opérateur Signification
== Égal (ne pas confondre avec = qui est l'opĂ©rateur d'assignation)
!= Différent
< Inférieur
> Supérieur
<= Inférieur ou égal
>= Supérieur ou égal

Critiques du langage Java

[modifier | modifier le code]

Failles de sécurité

[modifier | modifier le code]

La plate-forme de dĂ©veloppement Java propose un gestionnaire de sĂ©curitĂ©[84] (cf. supra § ExĂ©cution sĂ©curisĂ©e de code distant) qui permet Ă  un utilisateur de tester un exĂ©cutable douteux dans un « bac Ă  sable Â» pour Ă©viter de contaminer ses pĂ©riphĂ©riques de stockage. Ce mode d'exĂ©cution restreint l'accĂšs par l'exĂ©cutable Ă  des options et interfaces exploitĂ©es par les logiciels malveillants : les manipulations sur les bases de fichiers locaux, plusieurs commandes systĂšmes ou de bas niveau, ou l'accĂšs au rĂ©seau informatique.

Peu aprĂšs 2010, des chercheurs ont mis au jour plusieurs failles de sĂ©curitĂ© dans les versions de Java les plus courantes : celle d'Oracle, par exemple, laisse filtrer du code non-autorisĂ© malgrĂ© le mĂ©canisme d’isolation, et expose ses utilisateurs Ă  des piratages. Ces failles n'affectent que les applications Java exĂ©cutant alĂ©atoirement des programmes non explicitement approuvĂ©s par l'utilisateur : greffons de navigateur web exploitant des applets Java tĂ©lĂ©chargĂ©s depuis des sites ouverts.

Le 31 aoĂ»t 2012, une grave faille de sĂ©curitĂ© a Ă©tĂ© dĂ©tectĂ©e dans Java 6 et 7 pour Microsoft Windows, OS X et Linux, qui permettait de prendre le contrĂŽle Ă  distance en chargeant une page web factice[85],[86]. La mĂȘme faille a Ă©tĂ© retrouvĂ©e dans Java 5 par la suite[87]. Ainsi, le 10 janvier 2013, trois spĂ©cialistes de l'informatique prirent position contre Java, affirmant Ă  l'Agence Reuters que ce langage n'Ă©tait pas sĂ»r et que les internautes feraient bien de le dĂ©sactiver par dĂ©faut. Jaime Blasco, directeurs du laboratoire d'AlienVault Labs, a dĂ©clarĂ© : « Java est un vrai fouillis. Ce n'est pas sĂ»r. Il faut le dĂ©sactiver[88]. Â»

En 2014, compte tenu de ces problĂšmes de sĂ©curitĂ© et de vulnĂ©rabilitĂ© avec Java, l'influenceur Brian Krebs appelait les internautes Ă  retirer le greffon Java de leur navigateur[89]. « C'Ă©tait prometteur au dĂ©but, mais son utilitĂ© pour la navigation sur le web a fait long feu, et c'est Ă  prĂ©sent un cauchemar qui fait les dĂ©lices des cyber-criminels aux dĂ©pens des internautes[90]. Â»

Dans le cas particulier du greffon Java de navigateurs web, comme il n'est indispensable que pour un petit nombre d'applications en ligne, plusieurs experts en sécurité informatique recommandent de limiter au maximum le recours à celui-ci[91],[92].

Avec la disparition progressive du greffon Java de navigateur durant les années 2010, et l'évolution par des mises à jour, Java n'est plus considéré à la fin des années 2010 comme un risque majeur pour les ordinateurs de bureau[93]. Il a, au début des années 2020, en tant que premier langage des applications d'entreprise, un niveau de sécurité similaire à son principal concurrent dans ce domaine, Microsoft .NET[94].

La « classite Â»

[modifier | modifier le code]

Dans son essai sur la conception des logiciels[95], J. Ousterhout, l'auteur de Tcl/Tk, diagnostique chez les concepteurs de Java une forme d'idĂ©e fixe qu'il appelle « classite Â» (classitis), Ă  savoir que « comme les classes objet sont favorables Ă  la structuration du code, plus on crĂ©e de classes, mieux c'est. Â» Selon cet auteur, la multiplication du nombre de classes objet, si elle favorise l'Ă©criture de routines individuellement courtes et faciles Ă  analyser, augmente corrĂ©lativement la complexitĂ© de l'ensemble d'un programme et le rend difficile Ă  comprendre, Ă  corriger et Ă  Ă©tendre.

La généricité du langage Java

[modifier | modifier le code]

Lorsque Java 5.0 a Ă©tĂ© dotĂ© de la programmation gĂ©nĂ©rique, son rĂ©pertoire de classes objet (dont plusieurs Ă©taient mĂȘme dĂ©jĂ  dĂ©suĂštes!) Ă©tait trĂšs fourni. Il a Ă©tĂ© dĂ©cidĂ© d'utiliser la gĂ©nĂ©ricitĂ© des procĂ©dures en mode « ignorer Â» (Type erasure) pour favoriser une compatibilitĂ© ascendante et rĂ©utiliser le code des classes existantes ; mais cette dĂ©cision a limitĂ© les avantages de la programmation gĂ©nĂ©rique par rapport Ă  d'autres langages[96],[97], et l'accumulation de mĂ©tacaractĂšres dans le typage a rendu Java incohĂ©rent[98].

Types de données manquants

[modifier | modifier le code]

Java n'a pas, en propre, de type d'entier non signĂ© : dans ce langage, ils sont donc souvent produits par des sous-programmes Ă©crits en langage C. Cette lacune s'oppose, du reste, Ă  un passage de paramĂštre fluide entre les deux langages, C et Java. Enfin, on sait que les grands entiers positifs sont trĂšs utilisĂ©s, notamment pour la cryptographie, ce qui rend Java moins attractif pour ce genre de traitement[99]. Bien qu'on puisse en partie contourner ce problĂšme par conversion de code et recours Ă  des types de donnĂ©es plus grands (par exemple en utilisant un entier 64 bits pour coder un entier 32 bits non signĂ©), Java est malcommode pour la manipulation des grands entiers[100].

Écarts aux normes de codage en virgule flottante

[modifier | modifier le code]

S'il est vrai que l'arithmĂ©tique en virgule flottante de Java respecte pour l'essentiel les directives de la norme IEEE 754 (Standard for Binary Floating-Point Arithmetic), elle s'en Ă©carte sur quelques points (par exemple l'indicateur binaire de dĂ©bordement de type ou la gestion des arrondis), mĂȘme lorsque l'on active le modificateur strictfp. En outre, les types de flottants de prĂ©cision Ă©tendue reconnus par la norme 754 et dĂ©jĂ  disponibles sur de nombreux processeurs, n'existent pas en Java[101],[102].

Faible performance

[modifier | modifier le code]

Dans les débuts de Java (c'est-à-dire avant le lancement de la machine virtuelle HotSpot dans Java 1.3 en 2000), la lenteur de Java était bien connue. La plate-forme comparative Benchmarks avait notamment relevé que Java était deux fois plus lent que le langage C[103],[104],[105].

Mais il est vrai que la vitesse d'exécution de Java s'est considérablement améliorée depuis[106]. La compilation à la volée, moyennant une certaine discipline dans l'écriture du code source, est aujourd'hui à peine inférieure à celle des compilateurs natifs[106],[107].

Environnements de développement

[modifier | modifier le code]

JavaStyle

[modifier | modifier le code]

Les JavaStyle sont des conventions de programmation en langage Java dĂ©finies par Sun. Le respect de conventions strictes assure une homogĂ©nĂ©itĂ© dans le code source d’une application dĂ©veloppĂ©e par toute une Ă©quipe et favorise la diffusion du code source auprĂšs d’une communautĂ© partageant les mĂȘmes conventions de codage.

Le lower camel case est utilisé pour les noms de méthodes et de variables.

Frameworks et API

[modifier | modifier le code]

Sun fournit un grand nombre de frameworks et d’API afin de permettre l’utilisation de Java pour des usages trĂšs diversifiĂ©s.

On distingue essentiellement quatre grands frameworks :

  • Java SE (anciennement J2SE) : Ce framework est destinĂ© aux applications pour poste de travail ;
  • Java EE (anciennement J2EE) : Ce framework est spĂ©cialisĂ© dans les applications serveurs. Il contient pour ce faire un grand nombre d’API et d’extensions ;
  • Java ME (anciennement J2ME) : Ce framework est spĂ©cialisĂ© dans les systĂšmes embarquĂ©s et dĂ©cline plusieurs variantes pour les applications mobiles, tĂ©lĂ©phones, tĂ©lĂ©visions, ainsi que les cartes Ă  puces notamment Java Card.

La persistance est fondĂ©e sur les standards :

  • JDBC (Java DataBase Connectivity) ;
  • JDO (Java Data Objects) ;
  • EJB (Enterprise JavaBeans).

On trouve toutefois de nombreuses autres technologies, API et extensions optionnelles pour Java :

  • Java Media Framework (en) : framework multimĂ©dia, contenant notamment les API Java2D, Java 3D, JavaSound, Java advanced Imaging ;
  • Java Telephony API (en) ;
  • Java TV (en) ;
  • JXTA : SystĂšme de peer-to-peer reposant sur Java ;
  • Jini ;
  • JAIN ;
  • Java Dynamic Management Kit (es) (JDMK) ;
  • Java Speech ;
  • JMI ;
  • JavaSpaces.
  • JavaFX

Outils de développement

[modifier | modifier le code]

La programmation peut se faire depuis une invite de commande en lançant un compilateur Java (souvent nommĂ© javac), mais pour avoir plus de confort, il est prĂ©fĂ©rable d’utiliser un environnement de dĂ©veloppement intĂ©grĂ© ou IDE (qui permet de compiler automatiquement), certains sont gratuits. Par exemple :

  • BlueJ ;
  • CodeWarrior ;
  • Eclipse ;
  • IntelliJ IDEA ;
  • JBuilder ;
  • JCreator ;
  • jDeveloper 2 ;
  • NetBeans.

Automatisation

[modifier | modifier le code]

Un programme Java peut ĂȘtre produit avec des outils qui automatisent le processus de construction (c'est-Ă -dire l'automatisation de certaines tĂąches faisant appel Ă  un nombre potentiellement grand de dĂ©pendances comme l'utilisation de bibliothĂšques, la compilation, la gĂ©nĂ©ration d'archives, de documentation, le dĂ©ploiement, etc.). Les plus utilisĂ©s sont :

  • Apache Ant (gĂ©nĂ©ration portable, dĂ©crite en XML) ;
  • Apache Maven (gĂ©nĂ©ration portable, dĂ©crite en XML) ;
  • Gradle (gĂ©nĂ©ration portable, en utilisant le langage Groovy) ;
  • SCons (gĂ©nĂ©ration portable, en utilisant le langage Python). Exemple :
Java(target = 'classes', source = 'src')
      Jar(target = 'test.jar', source = 'classes')

RĂ©sultats :

     % scons -Q
     javac -d classes -sourcepath src src/Exemple1.java src/Exemple2.java src/Exemple3.java
     jar cf test.jar classes

Notes et références

[modifier | modifier le code]
  • (en) Cet article est partiellement ou en totalitĂ© issu de l’article de WikipĂ©dia en anglais intitulĂ© « Java (software platform) Â» (voir la liste des auteurs).
  1. ↑ [1]
  2. ↑ « JDK 25 Â»
  3. ↑ In Java 5.0, several features (the enhanced for loop, autoboxing, varargs, annotations and enums) were introduced, after proving themselves useful in the similar (and competing) language [2][3][4]
  4. ↑ « PEP 318 -- Decorators for Functions and Methods Â», sur Python.org (consultĂ© le 1er aoĂ»t 2020).
  5. ↑ (en) NationalSecurityAgency, « ghidra/Ghidra/Framework/Gui/src/test/java/generic/theme at master · NationalSecurityAgency/ghidra Â», sur GitHub (consultĂ© le 4 septembre 2025)
  6. ↑ a b c d et e Steven Vaughan-Nichols, « Java Ă  30 ans : comment un langage conçu pour un gadget complĂštement foireux est devenu un pilier de la technologie moderne Â» AccĂšs libre, ZDNet, 2 juin 2025 (consultĂ© le 2 juin 2025)
  7. ↑ « So why did they decide to call it Java? Â», sur JavaWorld, 4 octobre 1996
  8. ↑ Core Web Programming, Marty Hall, Larry Brown
  9. ↑ Object-oriented Programming with Java, Barry J. Holmes, Daniel T. Joyce
  10. ↑ (en) Java Technology: The Early Years.
  11. ↑ (en) Sun Microsystems Announces Formation Of Javasoft.
  12. ↑ (en) « HugeDomains Â», sur HugeDomains (consultĂ© le 12 avril 2023).
  13. ↑ MicroEJ
  14. ↑ Java sur STM32
  15. ↑ Apple Java 6 pour Mac OS X FAQ http://www.java.com/fr/download
  16. ↑ Technical Notes TN2110 developer.apple.com
  17. ↑ (en) "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."Free and Open Source Java FAQ; the source is being released via the OpenJDK project.
  18. ↑ « Sun Open Sources Java Platform Â», Sun Microsystems, 13 novembre 2006 (consultĂ© le 13 novembre 2006)
  19. ↑ « Rich Sharples’ Blog  Â» Blog Archive  Â» Java is finally Free and Open Â», sur softwhere.org via Wikiwix (consultĂ© le 8 octobre 2023).
  20. ↑ (en) « Oracle to charge for Java from Jan 2019 Â», sur itassetmanagement.net
  21. ↑ (en) « Oracle Java Licensing Changes Â», sur Palisadecompliance, janvier 2023
  22. ↑ (en) « Oracle changes its Java pricing as customers brace for higher costs Â», sur techzine.eu, 31 janvier 2023
  23. ↑ (en) « Oracle makes significant change to its Java license Â», sur SDTimes, 8 fĂ©vrier 2023
  24. ↑ (en) The Java Community Process(SM) Program - JSRs : Java Specification Requests - detail JSR# 901
  25. ↑ Java Naming http://www.java.com.
  26. ↑ Versions de Java et correctifs de sĂ©curitĂ©.
  27. ↑ (en) « JavaFX GA downloads Â».
  28. ↑ http://www.oracle.com/technetwork/java/javaee/downloads/index.html
  29. ↑ Oracle Announces Availability of Java Platform Enterprise Edition 7 Oracle Press Release June 12, 2013.
  30. ↑ (en) « Java ME SDK Downloads Â».
  31. ↑ (en) « Oracle Java SE Support Roadmap Â» (consultĂ© le 7 septembre 2022)
  32. ↑ Oracle Java SE Commercial Offering Releases oracle.com java commercial offerings
  33. ↑ a b c et d Oracle Java SE Support Roadmap, 13 mai 2013, http://www.oracle.com/technetwork/java/eol-135779.html
  34. ↑ https://jdk8.java.net « Copie archivĂ©e Â» (version du 29 aoĂ»t 2014 sur Internet Archive)
  35. ↑ (en) « Java SE 9 Platform Umbrella JSR (379) Â», sur openjdk.java.net, 25 septembre 2017 (consultĂ© le 25 mai 2018)
  36. ↑ (en) communiquĂ© de presse
  37. ↑ (en) communiquĂ© de presse
  38. ↑ (en) communiquĂ© de presse
  39. ↑ (en) communiquĂ© de presse - (en) liste complĂšte des changements
  40. ↑ (en) JSR 59
  41. ↑ (en) communiquĂ© de presse - (en) liste complĂšte des changements
  42. ↑ (en) JSR 41
  43. ↑ (en) Version 1.5.0 or 5.0?
  44. ↑ (en) communiquĂ© de presse
  45. ↑ Qu'est-ce que le logiciel Java Web Start http://www.java.com
  46. ↑ (en) JSR 270
  47. ↑ (en) Java Naming
  48. ↑ (en) « Java Platform SE 7 Â», sur oracle.com (consultĂ© le 12 avril 2023).
  49. ↑ Oracle met à jour Java SE et JavaFX pour OS X, ARM et Linux Le Monde Informatique
  50. ↑ Informations et configuration minimale requise pour l'installation et l'utilisation de Java 7 pour Mac http://www.java.com
  51. ↑ Auto-update Notice and End of Public Updates for Oracle JDK 7 oracle.com, May 14, 2015
  52. ↑ JDKℱ 8 Early Access Releases java.net.
  53. ↑ JDK8 Schedule and status OpenJDK.
  54. ↑ Everything about Java 8
  55. ↑ [5]
  56. ↑ Mickael Baron, « Java 9 est disponible, la plateforme se met aux modules : tour d'horizon des nouveautĂ©s Â», Developpez.com,‎ 21 septembre 2017 (lire en ligne, consultĂ© le 3 janvier 2018)
  57. ↑ JM Doudoux, « Java 9 – JShell Â» (consultĂ© le 20 septembre 2022)
  58. ↑ Java 9 : ce que l'on sait Journal du net - 16 juin 2015.
  59. ↑ (en) « Consolidated JDK 9 Release Notes Â»
  60. ↑ (en) Mkyong, « Java JSON Tutorials Â» (consultĂ© le 20 septembre 2022)
  61. ↑ « JDK 10 Â», sur openjdk.java.net (consultĂ© le 1er avril 2018)
  62. ↑ « JEP 286: Local-Variable Type Inference Â», sur openjdk.java.net (consultĂ© le 1er avril 2018)
  63. ↑ « JEP 310: Application Class-Data Sharing Â», sur openjdk.java.net (consultĂ© le 1er avril 2018)
  64. ↑ « JEP 317: Experimental Java-Based JIT Compiler Â», sur openjdk.java.net (consultĂ© le 1er avril 2018)
  65. ↑ « JDK 11 Â», sur openjdk.java.net (consultĂ© le 7 novembre 2018)
  66. ↑ « JDK 12 Â», sur openjdk.java.net (consultĂ© le 7 novembre 2018)
  67. ↑ (en) « JDK 13 Â», sur openjdk.java.net (consultĂ© le 25 avril 2019)
  68. ↑ « JDK 14 Â», sur openjdk.java.net (consultĂ© le 26 avril 2020)
  69. ↑ Jean-Michel Doudoux, « Java 14 : Switch expression Â», Blog OXiane,‎ 5 juin 2020 (lire en ligne)
  70. ↑ « The Arrival of Java 15! Â», Oracle, 15 septembre 2020 (consultĂ© le 15 septembre 2020)
  71. ↑ « Oracle annonce Java 16 Â», Oracle France,‎ 16 avril 2021 (lire en ligne, consultĂ© le 22 avril 2021)
  72. ↑ « Oracle annonce Java 17 Â», Oracle France,‎ 14 septembre 2021 (lire en ligne, consultĂ© le 6 octobre 2021)
  73. ↑ (en) « Oracle Announces Java 18 Â»
  74. ↑ JDK 18
  75. ↑ (en) « JDK 19 Â»
  76. ↑ « JDK 20 Â», sur openjdk.org (consultĂ© le 13 avril 2023)
  77. ↑ (en) Oracle, « The Arrival of Java 21 Â» AccĂšs libre, sur Oracle, 19 septembre 2023 (consultĂ© le 13 dĂ©cembre 2023)
  78. ↑ « JDK 22 Â», sur openjdk.org
  79. ↑ (en) « Oracle Releases Java 23 Â»
  80. ↑ (en) « https://www.oracle.com/news/announcement/oracle-releases-java-24-2025-03-18/ Â»
  81. ↑ (en) Design Goals of the Java Programming Language.
  82. ↑ a et b Voir par exemple les dĂ©tails du fonctionnement et la description des options -XX:+UseParallelGC et -XX:+UseConcMarkSweepGC de la JRE de Sun (en) Java SE Virtual Machine Garbage Collection Tuning
  83. ↑ Microsoft poussĂ© Ă  parler Java LibĂ©ration - 26/12/2002
  84. ↑ « Java Security Architecture: Contents Â», sur Docs.oracle.com, 2 octobre 1998 (consultĂ© le 9 fĂ©vrier 2016)
  85. ↑ Michael Horowitz, « Java security flaw: yada yada yada | Computerworld Â», sur Blogs.computerworld.com, 1er aoĂ»t 2012 (version du 24 juillet 2014 sur Internet Archive)
  86. ↑ Chris Brook, « The first stop for security news Â», sur Threatpost (version du 9 avril 2013 sur Internet Archive)
  87. ↑ Chris Brook, « The first stop for security news Â», sur Threatpost (version du 8 mars 2013 sur Internet Archive)
  88. ↑ « Why and How to Disable Java on Your Computer Now - Technology & science - Innovation Â», sur NBC News, 12 janvier 2013 (consultĂ© le 9 fĂ©vrier 2016)
  89. ↑ Brian Krebs, « Good Riddance to Oracle's Java Plugin Â», sur KrebsOnSecurity, 16 fĂ©vrier 2016
  90. ↑ Antone Gonsalves, « Java Is No Longer Needed. Pull The Plug-In Â», sur Wearable World, 5 septembre 2012
  91. ↑ « US Department of Homeland Security Calls On Computer Users To Disable Java Â», sur Forbes.com (consultĂ© le 9 fĂ©vrier 2016)
  92. ↑ Graham Cluley, « "Unless it is absolutely necessary to run Java in web browsers, disable it", DHS-sponsored CERT team says – Naked Security Â», sur Nakedsecurity.sophos.com, 15 janvier 2013 (consultĂ© le 9 fĂ©vrier 2016)
  93. ↑ « Pourquoi Java prĂ©sente moins de risques pour la sĂ©curitĂ© maintenant sur Windows, Mac et Linux Â», sur moyens.net, 2019 (consultĂ© le 4 dĂ©cembre 2023).
  94. ↑ (en) « Application security: Survey finds JavaScript beats Java and .NET with fewer flaws, faster fixes Â», sur devclass.com, 17 janvier 2023 (consultĂ© le 4 dĂ©cembre 2023).
  95. ↑ (en) John Ousterhout, A Philosophy of Software Design, Yaknyam Press, 2018 (ISBN 9781732102217), « Modules should be deep Â»
  96. ↑ « Generics in Java Â», sur Object Computing, Inc. (version du 2 janvier 2007 sur Internet Archive)
  97. ↑ « What's Wrong With Java: Type Erasure Â», 6 dĂ©cembre 2006 (consultĂ© le 9 dĂ©cembre 2006)
  98. ↑ « Java and Scala's Type Systems are Unsound Â», sur Github User's Content
  99. ↑ « Java libraries should provide support for unsigned integer arithmetic Â», sur Oracle/Bug Database, Sun Developer Network (consultĂ© le 18 janvier 2011)
  100. ↑ Sean R. Owens, « Java and unsigned int, unsigned short, unsigned byte, unsigned long, etc. (Or rather, the lack thereof) Â», sur darksleep.com, 5 novembre 2009 (consultĂ© le 9 octobre 2010)
  101. ↑ (en) W. Kahan et Joseph D. Darcy, « How Java's Floating-Point Hurts Everyone Everywhere Â», 1er mars 1998 (consultĂ© le 9 dĂ©cembre 2006)
  102. ↑ (en) « Types, Values, and Variables Â», sur Sun Microsystems (consultĂ© le 9 dĂ©cembre 2006)
  103. ↑ « Which programming languages are fastest? Â», sur Computer Language Benchmarks Game, 14 aoĂ»t 2011 (version du 14 aoĂ»t 2011 sur Internet Archive)
  104. ↑ « speed Ă· C++ GNU g++ speed Â», sur Computer Language Benchmarks Game, 26 septembre 2011 (version du 26 septembre 2011 sur Internet Archive)
  105. ↑ « C++ vs Java performance; It's a tie! | Blog of Christian Felde Â», sur Blog.cfelde.com, 27 juin 2010 (consultĂ© le 9 fĂ©vrier 2016)
  106. ↑ a et b J. P. Lewis et Ulrich Neumann, « Performance of Java versus C++ Â», sur Graphics and Immersive Technology Lab, universitĂ© du Sud de la Californie
  107. ↑ FreeTTS – A Performance Case Study erreur modĂšle {{Lien archive}} : renseignez un paramĂštre « |url= Â».

Voir aussi

[modifier | modifier le code]

Sur les autres projets Wikimedia :

  • Java, sur Wikimedia Commons
  • Java, sur Wikiversity
  • Java, sur Wikibooks

Bibliographie

[modifier | modifier le code]
  • Ken Arnold, James Gosling et David Holmes, Le Langage Java, 2001 (ISBN 978-2-7117-8671-8)
  • (en) Bruce Eckel, Thinking in Java, Prentice-Hall, 2002 (ISBN 978-0-13-100287-6). version tĂ©lĂ©chargeable version Ă©lectronique en ligne traduction francophone : penser en java
  • Alexandre Brillant, Java 5, 2006 (ISBN 978-2-7460-3170-8)
  • Jean Brondeau, Introduction Ă  la programmation objet en Java, Dunod, Paris, 1999 (ISBN 978-2-10-004106-0)
  • Annick Fron, Architectures rĂ©parties en Java, 2007 (ISBN 978-2-10-051141-9)
  • Le tutoriel en ligne How To Program In JAVA [lire en ligne]

Articles connexes

[modifier | modifier le code]
  • Plateforme Java
  • Machine virtuelle Java
  • Bytecode Java
  • Servlet
  • Navigateur HotJava
  • GNU Compiler Collection (inclut un compilateur de code Java vers code natif, GCJ)
  • .properties, maniĂšre de stocker les variables de configuration
  • Processing
  • Java version history (en)

Liens externes

[modifier | modifier le code]
  • Site officiel
  • (en) http://docs.oracle.com/javase/1.5.0/docs : SchĂ©ma de l'architecture logicielle de Java
v Â· m
Java
  • Oracle
  • Sun Microsystems
Technologie
  • Langage Java
  • Plateforme
  • Environnement de dĂ©veloppement (JDK)
  • Machine virtuelle Java (JVM)
  • Environnement d’exĂ©cution (JRE)
Général
  • Java Community Process
Framework
  • Micro Edition (ME)
  • Standard Edition (SE)
  • Jakarta EE
  • Java Card
  • JavaFX
Techniques
  • Bytecode
  • Applets
  • Servlets
  • Scriptlets
  • JavaServer Pages
  • .class
  • Javadoc
Langages de programmation
  • Ceylon
  • Clojure
  • Fortress
  • Groovy
  • Java
  • Kotlin
  • Oxygene (en)
  • Python (Jython)
  • Ruby (JRuby)
  • Scala
  • Xtend
v Â· m
Langages de programmation
Concurrents
  • Ada
  • Erlang
  • Go
  • Modula-2
Déclaratifs
  • Clips
  • Prolog
  • Mercury
Fonctionnels
  • Clojure
  • Common Lisp
  • Erlang
  • F#
  • Gallina
  • Haskell
  • Lisp
  • ML
  • OCaml
  • Opa
  • Scheme
  • Standard ML
Impératifs
  • Algol
  • APL
  • Assembleur
  • Basic
  • BCPL
  • C
  • Cobol
  • DOPE
  • Forth
  • Fortran
  • Julia
  • Limbo
  • Lua
  • Modula-2
  • MUMPS
  • Natural
  • NQC
  • NXC
  • OPL
  • Pascal
  • Perl
  • PL/I
  • RPG
  • PowerShell
  • Rust
  • Tcl
  • WLangage
Orientés objet
  • ActionScript
  • AppleScript
  • C++
  • Common Lisp
  • C#
  • CoffeeScript
  • D
  • Delphi
  • Eiffel
  • Groovy
  • Haxe
  • Java
  • JavaScript
  • Lisaac
  • Logo
  • Objective-C
  • PHP
  • Python
  • Ruby
  • Scala
  • Scratch
  • Simula
  • Smalltalk
  • Swift
  • Kotlin
  • Visual Basic
  • Liste de langages de programmation
  • icĂŽne dĂ©corative Portail de la programmation informatique
Ce document provient de « https://fr.wikipedia.org/w/index.php?title=Java_(langage)&oldid=234249296 Â».
CatĂ©gories :
  • Java (langage)
  • Langage de programmation
  • Langage orientĂ© objet
  • Plateforme Java
  • Langage pour la machine virtuelle Java
CatĂ©gories cachĂ©es :
  • Page utilisant P1195
  • Article utilisant une Infobox
  • Article contenant un appel Ă  traduction en anglais
  • Article Ă  rĂ©fĂ©rence souhaitĂ©e
  • Article Ă  rĂ©fĂ©rence nĂ©cessaire
  • Article contenant un appel Ă  traduction en espagnol
  • Page avec un oldid invalide
  • CatĂ©gorie Commons avec lien local identique sur Wikidata
  • Portail:Programmation informatique/Articles liĂ©s
  • Portail:Informatique/Articles liĂ©s
  • Article de qualitĂ© en malayĂąlam

  • indonesia
  • Polski
  • Ű§Ù„Ű±ÙŠŰ©
  • Deutsch
  • English
  • Español
  • Français
  • Italiano
  • Ù…Ű”Ű±
  • Nederlands
  • æœŹèȘž
  • PortuguĂȘs
  • Sinugboanong Binisaya
  • Svenska
  • ĐŁĐșŃ€Đ°Ń—ĐœŃĐșа
  • Tiáșżng Việt
  • Winaray
  • äž­æ–‡
  • РуссĐșĐž
Sunting pranala
Pusat Layanan

UNIVERSITAS TEKNOKRAT INDONESIA | ASEAN's Best Private University
Jl. ZA. Pagar Alam No.9 -11, Labuhan Ratu, Kec. Kedaton, Kota Bandar Lampung, Lampung 35132
Phone: (0721) 702022
Email: pmb@teknokrat.ac.id