Movatterモバイル変換


[0]ホーム

URL:


Aller au contenu
Wikipédial'encyclopédie libre
Rechercher

Java (langage)

Un article de Wikipédia, l'encyclopédie libre.
Page d’aide sur l’homonymie

Pour les articles homonymes, voirJava.

Page d’aide sur l’homonymie

Ne doit pas être confondu avecJavaScript.

Java
Logo.

Date de première version (30 ans)
ParadigmeOrienté objet,structuré,impératif,fonctionnel,générique
AuteurSun Microsystems
DéveloppeursOracle Corporation
Dernière version25 (16 septembre 2025[1])
TypageStatique,fort,sûr,nominatif
Influencé parObjective-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émentationsListe de JVM
Système d'exploitationMultiplateformes
LicenceGNU GPLV2+CPE
Site webwww.oracle.com/java/technologies
Extension de fichierjava, class, jar, jad et jmodVoir et modifier les données sur Wikidata
modifier 

Java est unlangage de programmation de haut niveauorienté objet créé parJames Gosling etPatrick Naughton, employés deSun Microsystems, avec le soutien deBill Joy (cofondateur de Sun Microsystems en1982), présenté officiellement le auSunWorld.

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

Un logiciel écrit en langage Java a pour particularité d'êtrecompilé vers un code intermédiaire formé debytecodes qui peut être exécuté dans unemachine virtuelle Java (JVM) en faisant abstraction dusystème d'exploitation.

Java 25 est officiellement disponible depuis le. Cette version fait suite à la LTS Java 23.

Aperçu

[modifier |modifier le code]

Le langage Java reprend en grande partie lasyntaxe du langageC++. Néanmoins, Java est épuré des concepts les plus subtils du C++ et à la fois les plus déroutants, tels que lespointeurs et références, ou l’héritage multiple contourné par l’implémentation desinterfaces. 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’approcheorientée objet de sorte qu’en Java, tout est objet à l’exception destypes 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 applicationsclient-serveur. Côté client, lesapplets 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 auxservlets, le pendant serveur des applets, et plus récemment lesJavaServer Pages (JSP) qui peuvent se substituer àPHP,Active Server Pages (ASP) etASP.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), desmachines virtuelles (MSJVM (en), applicativesmultiplateforme (JVM), une déclinaison pour les périphériquesmobiles/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). Laportabilité du bytecode Java est assurée par lamachine virtuelle Java, et éventuellement par des bibliothèques standard incluses dans un JRE. Cette machine virtuelle peutinterpréter le bytecode ou lacompilation à 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]

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, sesinterfaces de programmation en langage C, ainsi que les outils associés. Alors qu’il envisageait une migration versNeXT, on lui proposa de travailler sur une nouvelle technologie et c’est ainsi que leProjetStealth (furtif) vit le jour.

LeProjetStealth fut rapidement rebaptiséGreen Project avec l’arrivée deJames 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 enCalifornie. 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 unsystè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 deramasse-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, dumulti-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 programmationMesa (en) et dulangage 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èrentOak (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'uneplateforme 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, fut la construction d’unPDA appeléStar7 ayant uneinterface graphique et unagent intelligent appeléDuke pour prêter assistance à l’utilisateur[6].

En novembre de la même année, leGreen Project fut abandonné pour devenirFirstPerson, Inc, appartenant en totalité à Sun Microsystems et l’équipe fut relocalisée à Palo Alto. L’équipeFirstPerson é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 latélévision par câble trouva qu’elle offrait trop de possibilités à l’utilisateur et FirstPerson perdit le marché au profit deSilicon 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 à, après trois jours de remue-méninges avec John Gage, James Gosling, Joy, Naughton, Wayne Rosing etEric Schmidt, l’équipe recentra la plateforme sur leweb. Ils pensaient qu’avec l’avènement du navigateurMosaic, 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 suiteHotJava[6].

Origine du nom Java

[modifier |modifier le code]

Le nom« Java » n'est pas unacronyme, il a été choisi lors d'unbrainstorming[7] en remplacement du nom d'origine« Oak », à cause d'un conflit avec une marque decarte 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, HotJava et la plateforme Java furent présentés pourSun Executives. Java 1.0a fut disponible en téléchargement en 1994 mais la première version publique du navigateur HotJava arriva le à la conférenceSunWorld[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 deNetscape que Netscape allait inclure le support de Java dans ses navigateurs. Le, 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 depuisJava SE ;
  • Java 2 Enterprise Edition (J2EE), extension avec des technologies pour le développement d'applications d’entreprise, devenueJava EE.

Sun les qualifie alors de plateformeJava 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 desapplets Java était la seule solution pour afficher des applications clientes riches (RIA pourrich Internet application). Puis des technologies concurrentes ont émergé parmi lesquellesMacromediaFlash, le DHTMLJavaScript,Silverlight basé surXAML ouXul, ou leScol.

Les applets sur le poste Client peuvent communiquer avec desservlets 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 duAdobe 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é desbibliothè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 aussiGWT.

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

JavaFX

Avec l'apparition de Java 8 en,JavaFX devient l'outil de création d'interface graphique ('GUItoolkit') 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 (lelangage 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, laprogrammation Web, laprogrammation parallèle, etc.

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

Avec lesserveurs d’applications, on utilise desEJB pour encapsuler les classes définies précédemment. Ces éléments sont utilisés dans des architecturesJ2EE 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 commeNetBeans et l’environnementEclipse, les technologies de fichiers partagésLimeWire,Vuze (ex Azureus), etI2P. Java est aussi utilisé dans le programme de mathématiquesMATLAB, au niveau de l’interface homme machine et pour lecalcul formel. Les applicationsSwing 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 à 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'éditeurMicroEJ[13] ou encoreSTMicroelectronics qui propose du Java sur ses STM32[14] dont le cœur est un CortexM3/M4.

Java, notamment viaEclipse etNetBeans, 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 deGoogle :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 deWindows 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 nomC# (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 duMac OS X d’Apple aussi bien que pour les distributionsLinux. 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 avantMac OS X v10.2 (nom de codeJaguar), J2SE 5.0 à partir deMac OS X v10.4 (Tiger), Java SE 6 fonctionne uniquement sousMac OS X v10.5 (Leopard) équipé de processeurIntel[16], et Java 7 exige un ordinateur Mac Intel exécutant la versionMac OS X v10.7.3 (Lion).

Passage sous licence open-source

[modifier |modifier le code]

Le, le code source du compilateurjavac et de la machine virtuelleHotSpot ont été publiés enOpen Source sous laLicence publique générale GNU[17].

Le, Sun Microsystems annonce le passage de Java, c’est-à-dire leJDK (JRE et outils de développement) et les environnements Java EE (déjà sous licence CDDL) et Java ME sous licenceGPL d’ici, sous le nom de projetOpenJDK[18].

En, 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 le projetIcedTea (en) qui vise à remplacer les fragments de code non libre et ainsi rendre OpenJDK utilisable sans aucunlogiciel propriétaire. En, 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 parOracle

[modifier |modifier le code]

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

Le,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 à unelicence payante à partir de[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 laplateforme 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, gestionXML, 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 exempleJava 5) spécifiée par le JLS, est ainsi lenumé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 decorrectifs 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 plateformesEnterprise Edition (Java EE) etMobile Edition (Java ME) sont identifiées par le numéro de version de leur propreSDK ; 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-[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.

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

VersionDernière versionDénomination JSE/JRENom de codeSpécificationsJDKStatut mai 2025Période de maintenanceSupport étendu[32]
1.01.0.2Java 1.0OakJSR 52JDK 1.0.2Obsolète1996-2000
1.18_16Java 1.1JSR 521.1.8_16Obsolète1997-2000
1.22_017J2SE 1.2PlaygroundJSR 521.2.2_11Obsolète2000-2006
1.31_29J2SE 1.3KestrelJSR 581.3.1_29Obsolète2000-2001
1.42_30J2SE 1.4MerlinJSR 591.4.2_30Obsolète2000-2008[33]
1.50_22 à 0_85J2SE 5.0TigerJSR 1761.5.0_22Obsolète2002-2009[33]
1.60_45 à 0_111Java SE 6MustangJSR 2706u113Obsolète2005-2013[33]
1.70_79 à 0_80Java SE 7DolphinJSR 3361.7.0_79Obsolète2011- 2015[33]
1.80_451Java SE 8Kenai[34] puis SpiderJSR 3378u451StableMars 2022
99.0.4Java SE 9UmbrellaJSR 379[35]9.0.4Obsolète2018
1010.0.2Java SE 10JSR 38310.0.2Obsolète2018
1111.0.13Java SE 11JSR 38411.0.13+10version LTSSeptembre 2023Janvier 2032
1212.0.2Java SE 12JSR 38612.0.2Obsolète2021
1313.0.2Java SE 13JSR 38813.0.2Obsolète2021
1414.0.2Java SE 14JSR 38914.0.2Obsolète2021
1515.0.2Java SE 15JSR 39015.0.2Obsolète2021
1616.0.2Java SE 16JSR 39116.0.2Obsolète2021
1717.0.1+12Java SE 17JSR 39217.0.1version LTSSeptembre 2026Septembre 2029
1818.0.2.1Java SE 18JSR 39318.0.2.1ObsolèteSeptembre 2022
1919.0.2Java SE 19JSR 39419.0.2ObsolèteMars 2023
2020.0.2Java SE 20JSR 39520.0.2ObsolèteSeptembre 2023
2121.0.1Java SE 21JSR 39621.0.1version LTSSeptembre 2028Septembre 2031
2222.0.1Java SE 22JSR 39722.0.1ObsolèteSeptembre 2024
2323.0.1Java SE 23JSR 39823.0.1ObsolèteMars 2025
2424.0.1Java SE 24JSR 39924.0.1StableSeptembre 2025

Contenu et évolutions

[modifier |modifier le code]
Du JDK 1.0 au J2SE 1.4
[modifier |modifier le code]
  • JDK 1.0 ( - 211 classes et interfaces) — Version initiale[36].
  • JDK 1.1 ( - 477 classes et interfaces) — De nombreux ajouts[37] avec notamment :
    • une refonte complète du modèle événementielAWT ;
    • les classes internes sont ajoutées au langage ;
    • JavaBeans ;
    • JDBC ;
    • Java Remote Invocation (RMI).
  • J2SE 1.2 ( - 1 524 classes et interfaces) — Nom de codePlayground. Cette version et les suivantes jusque J2SE 7.0 sont rebaptiséesJava 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) ;
    • laréflexion ;
    • l’API graphiqueSwing 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é avecCORBA ;
    • leframework Collections.
  • J2SE 1.3 ( - 1 840 classes et interfaces) — Nom de codeKestrel. Changements principaux[39] :
    • HotSpot JVM inclus (La machine virtuelle HotSpot sortit en pour la machine virtuelle du J2SE 1.2) ;
    • changement pour les RMI pour être basé surCORBA ;
    • JavaSound ;
    • JNDI (Java Naming and Directory Interface) inclus de base (disponible auparavant commeextension) ;
    • JPDA (Java Platform Debugger Architecture).
  • J2SE 1.4 ( - 2 723 classes et interfaces) — Nom de codeMerlin. Ce fut la première révision de la plateforme sous JCP (Java Community Process)[40]. Les principaux changements[41] sont :
J2SE 5.0
[modifier |modifier le code]

Sortie le (3 270 classes et interfaces), son nom de code estTiger. 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 logicielJava 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 typeint) 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 lasûreté du typage. Auparavant, ceci pouvait seulement être réalisé par des entiers constants (Spécifié dans JSR 201) ;
  • varargs — la syntaxeObject… 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 dufor pour les boucles — la syntaxe dufor 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 :
voiddisplayWidgets(Iterable<Widget>widgets){for(Widgetw: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 dansC++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éesdeprecated (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 (3 777 classes et interfaces dans plus de 20 paquetages), son nom de code estMustang[46]. Une version bêta est sortie le, une autre bêta en, une version « release candidate » en, et la version finale le. 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 nombreusesfailles 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 (8 000[48] classes et interfaces), son nom de code estDolphin. Il s’agit de la première version sous la licenceGNU 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 parMac 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' 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- conformément à unefeuille de route présentée par Oracle dès[53].

Une des nouveautés majeures de cette version est l’ajout deslambdas[54], entraînant une refonte d'une partie de l'API, notamment les collections et la notion destream. 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 projetJigsaw, 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[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 formatread–eval–print loop (en) ;
  • le projet Valhalla visant une amélioration des types Java ;
  • un support natif deHTTP/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[61].

Cette nouvelle version intègre notamment :

  • JEP 286[62] : inférence des types desvariables 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[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 : unclient 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[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[67].

  • JEP 355 : Text Blocks
  • JEP 354 : (Switch - aperçu v2) Nouveau casecase...-> (case traditionnelcase...:)
    switch(nombre){//case traditionnelcase5:System.out.println("La variable est égale à 5");break;//nouveau casecase5->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 erreursNullPointerExceptions
  • JEP 361 : (Switch - version finale) Nouveau casecase...-> (case traditionnelcase...:)[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'architectureRISC-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 enC++.

Bien qu’il existe plusieurs interprétations de l’expressionorienté 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éesPropriétés) et le code les manipulant (appeléMéthodes) sont combinés dans une même entité appeléeClasse 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’uneClasse 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 lesgénériques, un mécanisme depolymorphisme similaire (mais différent) auxtemplates du langageC++ 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èmesmulti-processeurs et/oumulti-cœurs, celui-ci emploie même desthreads 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éthodeSystem.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érateurdelete). 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 auramasse-miettes. L'espace mémoire nécessaire à chaque objet créé est géré dans un tas de mémoire (enanglais :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 (enanglais :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'uneliste à 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 anglaisLibraries) n'ont pas à se soucier de la désallocation des objets (opérateurdelete en C++), sauf éventuellement pour des raisons de performance.

Indépendance vis-à-vis de la plateforme

[modifier |modifier le code]
Articles connexes :Bytecode Java etCompilation à 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érentesarchitectures 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 unbytecode (plus précisément lebytecode Java, un langage de typeassembleur, proche de la machine virtuelle et spécifique à la plateforme Java).
Ce bytecode a ensuite vocation à être interprété sur unemachine virtuelle Java (JVM en anglais), un programme écrit spécifiquement pour la machine cible qui interprète lebytecode Java et fait exécuter par la machine lesinstructions 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 uncompilateur à 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 queGNU Compiler for Java (GCJ) compilent ainsi directement le Java encode 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éecompilation « 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 unerecompilation 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 etJNI, 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 lesservices web, les servlets et lesJavaBeans aussi bien que les systèmes embarqués surOSGi, utilisant l’environnementEmbedded 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. Uneapplet peut fonctionner dans lenavigateur web d’un utilisateur, exécutant du code téléchargé d’un serveurHTTP. 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 classeSecurityManager) 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 unserveur 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 uncertificat pour leur permettre designer 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 programmeHello world typique écrit en Java :

publicclassHelloWorld{publicstaticvoidmain(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'attributpublic 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 (sousLinux) :

javac HelloWorld.javaexport CLASSPATH=.java HelloWorld

La ligne « export CLASSPATH=. » sert à indiquer à Java qu’il doit également chercherles 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 lesmots-clés du langage Java :

abstractelseinstanceofstatictrybooleanfalseassert(1.4)enum(5.0)interfacestrictfp(1.2)volatilebytetruebreakextendsnativesuperwhilecharcasefinalnewswitchdoublecatchfinallypackagesynchronizedfloatclassforprivatethisintconst(*)goto(*)protectedthrowlongcontinueifpublicthrowsshortdefaultimplementsreturntransientvoidnulldoimport

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]

Uneclasse 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 uneinstance d’une seule classe.

Visibilité :

  • Public : le motclass est alors précédé depublic, 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 motclass est alors précédé deprivate, seules des classes définies dans le même fichier peuvent utiliser cette classe.
  • Paquetage : le motclass 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]

Unattribut 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 depublic, et il peut être utilisé par tout utilisateur de la classe.
  • Privé : sa définition est précédée deprivate, et il ne peut être utilisé qu’à l’intérieur de la classe.
  • Protégé : sa définition est précédée deprotected, 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]

Unemé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 alorsvoid ;
  • 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 depublic, et elle peut être utilisée par tout utilisateur de la classe.
  • Privé : sa définition est précédée deprivate, et elle ne peut être utilisée qu’à l’intérieur de la classe.
  • Protégé : sa définition est précédée deprotected, 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]
NomTaille en octets lors des calculsValeur par défautValeurs possibles
booleanUn seul bit suffit, mais on réserve souvent un octet pour les stocker.falsetrue,false
byte10entiers compris entre -128 et +127 (-27 et 27-1)
short20entiers compris entre −32 768 et 32 767 (-215 et 215-1)
int40entiers compris entre −2 147 483 648 et +2 147 483 647 (-231 et 231-1)
long80entiers compris entre −9 223 372 036 854 775 808 et 9 223 372 036 854 775 807 (-263 et 263-1)
char2'\u0000'Ensemble des valeursUnicode (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'.
float40.0Ensemble 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]
double80.0Ensemble 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]
ObjectDépendant de la machine virtuellenull

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 vaudranull

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

NomDuTypemaVariable;

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 taillen 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 tableautab d’entiers de 10 cases, on peut écrire (entre autres) :
int[]tab=newint[10];
ou :
inttab[]=newint[10];
ou :
inttab[]={0,0,0,0,0,0,0,0,0,0};
Les indices detab vont de 0 à 9, et il ne pourra pas être redimensionné.
Chaque élément detab 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 estnull, celle d'un booléen estfalse.
Pour lire ou modifier l'élément detab d'indicei, pour 0 ≤ i ≤ 9, on utilisetab[i].
Exemple : Pour attribuer la valeur 2 à une case detab, 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 avectab [10] = 4;, une exceptionIndexOutOfBoundsException est déclenchée (notre tableautab ne contient que 10 cases, numérotées de 0 à 9 inclus).

Collections de taille variable

[modifier |modifier le code]

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

Pour initialiser une ArrayList il faut importer la classejava.util.ArrayList et écrireliste = new ArrayList<T>(); ouliste = 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 écritliste.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 :

  • Structuretant que (adaptée pour effectuer des opérations tant qu’une condition est remplie) :
while(<expressionbooléenne>){instruction(s)}
  • Structurefaire … tant que (comme la structuretant que mais la premièreitération est exécutée quelle que soit la condition, pour les autres itérations la condition doit être remplie) :
do{instruction(s)}while(<expressionbooléenne>);
  • Structurepour (adaptée lorsqu'une collection doit être parcourue en totalité pour traitement) :
for(<initialisation>;<conditiondepoursuite>;<expressiondincrémentation>){instruction(s)}
  • Structurepour chaque (simplification du for en for each, dans laquelle l'expression doit être un tableau ou une collection) :
for(typevariable:<expression>){instruction(s)}
  • Structurepour (Java 1.5) :
for(<Objetrécupérantloccurrencesuivantedelacollection>:<collectiondobjets>){instruction(s)}

Structures conditionnelles

[modifier |modifier le code]
  • Structuresi : condition simple
if(<expressionboolé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(<condition1>&&<condition2>){instruction(s)silesconditions1et2sontvraies}

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

if(<condition1>||<condition2>){instruction(s)siaumoinsunedesdeuxestvraie}

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.

  • Structuresi … sinon : condition avec alternative unique
if(<expressionbooléenne>){instruction(s)}else{instruction(s)}
  • Structuresi … ou si … ou si … : condition avec alternatives multiples
if(<expressionbooléenne>){instruction(s)}elseif(<expressionbooléenne>){instruction(s)}elseif(<expressionbooléenne>){instruction(s)}else{instruction(s)}
  • Structureatteindre … 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 suivantswitch dont le type peut être entier (int,char,byte oushort ou classes enveloppes correspondantes), énuméré (enum) ouString (chaîne de caractères, depuis Java 7 seulement).

Remarque :L'opérateur conditionnel ouopé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 :

<expressionbooléenne>?<valeursivrai>:<valeursifaux>

Branchements inconditionnels

[modifier |modifier le code]
  • L'instructionbreak fait sortir immédiatement de la boucle en cours (for,while,do), mais permet également de sortir d’une clause contenue dans unswitch. Si lebreak est omis, l'exécution duswitch se poursuit decase encase.
  • L'instructioncontinue termine l’itération en cours et continue à la prochaine. Son usage ainsi que celui debreak dans les boucles est controversé (de la même manière quegoto dans d'autres langages structurés). Elle tendrait à favoriser un type de programmation non structurée (programmation spaghetti).
  • L’instructionreturn termine une méthode. Avecreturn uneValeur, uneValeur sera renvoyée à la méthode appelante.

Traitement des exceptions

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

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

Voici un exemple de capture d’une exception :

FileOutputStreamfos=null;try{//Chacune de ces deux instructions peut générer une exception// création d'un flux pour écrire dans un fichierfos=newFileOutputStream(...);// écriture de données dans ce fluxfos.write(...);}catch(IOExceptione){//Gestion de l'erreur de création ou d'écriture dans le fluxe.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é ouvertif(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 bloctry, l’exécution reprend dans le bloccatch correspondant à cette situation (exception de typeIOException).

Dans ce bloccatch, la variablee référence l’exception qui s’est produite. Ici, nous invoquons la méthodeprintStackTrace() 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 blocfinally 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.

publicclassArrayList<E>{ArrayList<String>al=newArrayList<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 formatUTF-16, ce qui permet l’utilisation dans le code source de tous les caractères existant dans le monde :

publicclassHelloWorld{privateStringtext="hello world";}

Pour assurer la portabilité entre plateformes, les noms declasses devraient néanmoins être formés uniquement de caractèresASCII.

Opérateur de comparaison

[modifier |modifier le code]
OpérateurSignification
==É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 leslogiciels malveillants : les manipulations sur les bases de fichiers locaux, plusieurs commandes systèmes ou de bas niveau, ou l'accès auré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 pourMicrosoft Windows,OS X et Linux, qui permettait deprendre le contrôle à distance en chargeant unepage web factice[85],[86]. La même faille a été retrouvée dansJava 5 par la suite[87]. Ainsi, le 10 janvier 2013, trois spécialistes de l'informatique prirent position contre Java, affirmant à l'AgenceReuters 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'influenceurBrian 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 denavigateurs web, comme il n'est indispensable que pour un petit nombre d'applications en ligne, plusieurs experts ensé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 deTcl/Tk, diagnostique chez les concepteurs de Java une forme d'idée fixe qu'il appelle « classite » (classitis), à savoir que« comme lesclasses 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 laprogrammation 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 unecompatibilité 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 demé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 enlangage 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 lacryptographie, 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 normeIEEE 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 modificateurstrictfp. 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 lamachine virtuelle HotSpot dans Java 1.3 en 2000), la lenteur de Java était bien connue. La plate-forme comparativeBenchmarks 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]. Lacompilation à 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 lecode 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.

Lelowercamel case est utilisé pour les noms de méthodes et de variables.

Frameworks et API

[modifier |modifier le code]

Sun fournit un grand nombre deframeworks et d’API afin de permettre l’utilisation de Java pour des usages très diversifiés.

On distingue essentiellement quatre grandsframeworks :

  • Java SE (anciennement J2SE) : Ceframework est destiné aux applications pour poste de travail ;
  • Java EE (anciennement J2EE) : Ceframework est spécialisé dans les applications serveurs. Il contient pour ce faire un grand nombre d’API et d’extensions ;
  • Java ME (anciennement J2ME) : Ceframework 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 notammentJava 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 :

Outils de développement

[modifier |modifier le code]

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

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 langageGroovy) ;
  • SCons (génération portable, en utilisant le langagePython). 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]
  1. [1]
  2. « JDK 25 »
  3. In Java 5.0, several features (theenhanced for loop,autoboxing,varargs,annotations andenums) were introduced, after proving themselves useful in the similar (and competing) language[2][3][4]
  4. « PEP 318 -- Decorators for Functions and Methods », surPython.org(consulté le).
  5. (en)NationalSecurityAgency, « ghidra/Ghidra/Framework/Gui/src/test/java/generic/theme at master · NationalSecurityAgency/ghidra », surGitHub(consulté le)
  6. abcd eteSteven 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,(consulté le)
  7. « So why did they decide to call it Java? », surJavaWorld,
  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 », surHugeDomains(consulté le).
  13. MicroEJ
  14. Java sur STM32
  15. Apple Java 6 pour Mac OS X FAQhttp://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 theOpenJDK project.
  18. « Sun Open Sources Java Platform », Sun Microsystems,(consulté le)
  19. « Rich Sharples’ Blog  » Blog Archive  » Java is finally Free and Open », sursoftwhere.org viaWikiwix(consulté le).
  20. (en) « Oracle to charge for Java from Jan 2019 », suritassetmanagement.net
  21. (en) « Oracle Java Licensing Changes », surPalisadecompliance,
  22. (en) « Oracle changes its Java pricing as customers brace for higher costs », surtechzine.eu,
  23. (en) « Oracle makes significant change to its Java license », surSDTimes,
  24. (en)The Java Community Process(SM) Program - JSRs : Java Specification Requests - detail JSR# 901
  25. Java Naminghttp://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)
  32. Oracle Java SE Commercial Offering Releases oracle.com java commercial offerings
  33. abc etdOracle 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 surInternet Archive)
  35. (en) « Java SE 9 Platform Umbrella JSR (379) », suropenjdk.java.net,(consulté le)
  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 Starthttp://www.java.com
  46. (en)JSR 270
  47. (en)Java Naming
  48. (en) « Java Platform SE 7 », suroracle.com(consulté le).
  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 Machttp://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. MickaelBaron, « Java 9 est disponible, la plateforme se met aux modules : tour d'horizon des nouveautés »,Developpez.com,‎(lire en ligne, consulté le)
  57. JM Doudoux, « Java 9 – JShell »(consulté le)
  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)
  61. « JDK 10 », suropenjdk.java.net(consulté le)
  62. « JEP 286: Local-Variable Type Inference », suropenjdk.java.net(consulté le)
  63. « JEP 310: Application Class-Data Sharing », suropenjdk.java.net(consulté le)
  64. « JEP 317: Experimental Java-Based JIT Compiler », suropenjdk.java.net(consulté le)
  65. « JDK 11 », suropenjdk.java.net(consulté le)
  66. « JDK 12 », suropenjdk.java.net(consulté le)
  67. (en) « JDK 13 », suropenjdk.java.net(consulté le)
  68. « JDK 14 », suropenjdk.java.net(consulté le)
  69. Jean-MichelDoudoux, « Java 14 : Switch expression »,Blog OXiane,‎(lire en ligne)
  70. « The Arrival of Java 15! »,Oracle,(consulté le)
  71. « Oracle annonce Java 16 »,Oracle France,‎(lire en ligne, consulté le)
  72. « Oracle annonce Java 17 »,Oracle France,‎(lire en ligne, consulté le)
  73. (en) « Oracle Announces Java 18 »
  74. JDK 18
  75. (en) « JDK 19 »
  76. « JDK 20 », suropenjdk.org(consulté le)
  77. (en) Oracle, « The Arrival of Java 21 »Accès libre, surOracle,(consulté le)
  78. « JDK 22 », suropenjdk.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 etbVoir par exemple les détails du fonctionnement et la description des options-XX:+UseParallelGC et-XX:+UseConcMarkSweepGC de la JRE deSun(en)Java SE Virtual Machine Garbage Collection Tuning
  83. Microsoft poussé à parler Java Libération - 26/12/2002
  84. « Java Security Architecture: Contents », surDocs.oracle.com,(consulté le)
  85. Michael Horowitz,« Java security flaw: yada yada yada | Computerworld », surBlogs.computerworld.com,(version du surInternet Archive)
  86. Chris Brook,« The first stop for security news », surThreatpost(version du surInternet Archive)
  87. Chris Brook,« The first stop for security news », surThreatpost(version du surInternet Archive)
  88. « Why and How to Disable Java on Your Computer Now - Technology & science - Innovation », surNBC News,(consulté le)
  89. BrianKrebs, « Good Riddance to Oracle's Java Plugin », surKrebsOnSecurity,
  90. AntoneGonsalves, « Java Is No Longer Needed. Pull The Plug-In », surWearable World,
  91. « US Department of Homeland Security Calls On Computer Users To Disable Java », surForbes.com(consulté le)
  92. GrahamCluley, « "Unless it is absolutely necessary to run Java in web browsers, disable it", DHS-sponsored CERT team says – Naked Security », surNakedsecurity.sophos.com,(consulté le)
  93. « Pourquoi Java présente moins de risques pour la sécurité maintenant sur Windows, Mac et Linux », surmoyens.net,(consulté le).
  94. (en) « Application security: Survey finds JavaScript beats Java and .NET with fewer flaws, faster fixes », surdevclass.com,(consulté le).
  95. (en) John Ousterhout,A Philosophy of Software Design, Yaknyam Press,(ISBN 9781732102217), « Modules should be deep »
  96. « Generics in Java », surObject Computing, Inc.(version du surInternet Archive)
  97. « What's Wrong With Java: Type Erasure »,(consulté le)
  98. « Java and Scala's Type Systems are Unsound », surGithub User's Content
  99. « Java libraries should provide support for unsigned integer arithmetic », surOracle/Bug Database, Sun Developer Network(consulté le)
  100. Sean R.Owens, « Java and unsigned int, unsigned short, unsigned byte, unsigned long, etc. (Or rather, the lack thereof) », surdarksleep.com,(consulté le)
  101. (en) W.Kahan et Joseph D.Darcy, « How Java's Floating-Point Hurts Everyone Everywhere »,(consulté le)
  102. (en) « Types, Values, and Variables », surSun Microsystems(consulté le)
  103. « Which programming languages are fastest? », surComputer Language Benchmarks Game,(version du surInternet Archive)
  104. « speed ÷ C++ GNU g++ speed », surComputer Language Benchmarks Game,(version du surInternet Archive)
  105. « C++ vs Java performance; It's a tie! | Blog of Christian Felde », surBlog.cfelde.com, 27 juin 2010(consulté le)
  106. a etbJ. P.Lewis et UlrichNeumann, « Performance of Java versus C++ », surGraphics and Immersive Technology Lab,université du Sud de la Californie
  107. FreeTTS – A Performance Case Studyerreur modèle{{Lien archive}} : renseignez un paramètre « |url= ».

Voir aussi

[modifier |modifier le code]

Sur les autres projets Wikimedia :

  • Java, surWikimedia Commons
  • Java,surWikiversity
  • Java,surWikibooks

Bibliographie

[modifier |modifier le code]

Articles connexes

[modifier |modifier le code]

Liens externes

[modifier |modifier le code]
v ·m
Technologie
Général
Framework
Techniques
Langages de programmation
v ·m
Concurrents
Déclaratifs
Fonctionnels
Impératifs
Orientés objet
Ce document provient de « https://fr.wikipedia.org/w/index.php?title=Java_(langage)&oldid=233351759 ».
Catégories :
Catégories cachées :

[8]ページ先頭

©2009-2026 Movatter.jp