0% ont trouvé ce document utile (0 vote)
9 vues47 pages

Introduction au langage Java

Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
9 vues47 pages

Introduction au langage Java

Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Java (langage)

langage de programmation informatique orienté objet

Pour les articles homonymes, voir Java.

Ne doit pas être confondu avec JavaScript.

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.
Java

Date de première
1995
version
Paradigme Orienté objet, structuré, impératif, fonctionnel, générique
Auteur Sun Microsystems
Développeurs Oracle Corporation
Dernière version 22 (19 mars 2024[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
Multiplateformes
d'exploitation
Licence GNU GPLV2+CPE
Site web [Link]/java/technologies ([Link]
Extension de fichier java, class, jar, jad et jmod
modifier ([Link]

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.
Aperçu

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 [Link].

Java donne naissance à un système d'exploitation (JavaOS), à des environnements de


développement (Eclipse/Java Development Kit), des machines virtuelles (MSJVM (en),
l'Environnement d'exécution Java) 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.

Historique

Origine du langage

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.

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.

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.

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.

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

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.

La même année le langage fut renommé Java après qu’on eut découvert que le nom Oak était déjà
utilisé par un fabricant de carte vidéo.

Origine du nom Java

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

Lancement public de Java

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[8].

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[9]. Deux
semaines plus tard la première version de Java était disponible.

Avènement de Java 2

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

Utilisation Web

Côté client

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[10]. 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

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

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

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[11] ou encore
STMicroelectronics qui propose du Java sur ses STM32[12] 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

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[13]. 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[14], et Java 7 exige un ordinateur Mac Intel exécutant la
version Mac OS X v10.7.3 (Lion).

Passage sous licence open-source

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[15].

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[16].

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)[17]. 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

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[18].

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[19], ce qui risque d'augmenter
significativement le coûts[20] et provoque des réactions négatives parmi les entreprises
concernées[21].
Historique des versions

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[22].

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

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)[23] ;

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 [Link], et le JRE [Link], sont tous deux conformes au langage Java 6,
mais ont fait l'objet notamment de correctifs de sécurité[24] ;

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[25](é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[26]; il n'est réellement passé à Java 7 que mi-juin 2013[27],

Java ME en est à sa version 3.3 (SDK v. 3.3)[28].


Versions successives

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 13/12/2023, les versions LTS (pour Long Time Support) actuelles sont Java 8, 11, 17 et
21[29].
Dernière Dénomination Nom de Statut Période de Support
Version Spécifications JDK
version JSE/JRE code octobre 2018 maintenance étendu[30]

N'est plus
1.0 1.0.2 Java 1.0 Oak JSR 52 JDK 1.0.2 soutenu de 1996-2000
façon active

N'est plus
1.1 8_16 Java 1.1 JSR 52 1.1.8_16 soutenu de 1997-2000
façon active

N'est plus
1.2 2_017 J2SE 1.2 Playground JSR 52 1.2.2_11 soutenu de 2000-2006
façon active

1.3 1_29 J2SE 1.3 Kestrel JSR 58 1.3.1_29 Obsolète 2000-2001

2000-
1.4 2_30 J2SE 1.4 Merlin JSR 59 1.4.2_30 Obsolète
2008[31]

Obsolète,
5u51 à 5u85
uniquement
0_22 à disponibles 2002-
1.5 J2SE 5.0 Tiger JSR 176 1.5.0_22 Mai 2015
0_85 avec un 2009[31]
support
Oracle
spécifique[32]

Obsolète,
6u51 à 6u111
uniquement
0_45 à disponibles 2005-
1.6 Java SE 6 Mustang JSR 270 6u113 Décembre 2018
0_111 avec un 2013[31]
support
Oracle
spécifique[32]

Stable,
0_79 à 2011-
1.7 Java SE 7 Dolphin JSR 336 1.7.0_79 version Juillet 2022
0_80 [33]
2015[31]
1.7.0_79

Stable,
version
Kenai[34]
1.8 0_391 Java SE 8 JSR 337 1.8.0_391 1.8.0_391[35] Mars 2022 Décembre 2030
puis Spider
proposée aux
utilisateurs[36]

9 9.0.4 Java SE 9 Umbrella JSR 379[37] 9.0.4 Stable 2018-?

supporté 6 2018, pas


mois avant une version
10 10.0.2 Java SE 10 JSR 383 10.0.2 prochaine LTS (long
sortie du JDK term
Java11-LTS support)
Septembre
11 11.0.13 Java SE 11 JSR 384 11.0.13+10 version LTS Janvier 2032
2023

12 12.0.2 Java SE 12 JSR 386 12.0.2

13 13.0.2 Java SE 13 JSR 388 13.0.2

14 14.0.2 Java SE 14 JSR 389 14.0.2

15 15.0.2 Java SE 15 JSR 390 15.0.2

16 16.0.2 Java SE 16 JSR 391 16.0.2

Septembre Septembre
17 17.0.1+12 Java SE 17 JSR 392 17.0.1 version LTS
2026 2029

Septembre
18 [Link] Java SE 18 JSR 393 [Link]
2022

19 19.0.2 Java SE 19 JSR 394 19.0.2 Mars 2023

Septembre
20 20.0.2 Java SE 20 JSR 395 20.0.2
2023

Septembre Septembre
21 21.0.1 Java SE 21 JSR 396 21.0.1 version LTS
2028 2031

22 22.0.1 Java SE 22 JSR 397 22.0.1

Seules les derniers numéros de versions de chaque release sont listées ici. Le détail des
modifications successives par version et par update figure sur [Link]/java_history.

Contenu et évolutions

Du JDK 1.0 au J2SE 1.4


JDK 1.0 (23 janvier 1996 - 211 classes et interfaces) — Version initiale[38].

JDK 1.1 (19 février 1997 - 477 classes et interfaces) — De nombreux ajouts[39] 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[40] 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[41] :
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)[42]. Les principaux
changements[43] sont :
le mot-clé assert (Spécifié dans JSR 41[44]) ;

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 ([Link] [archive]) ;

API de journalisation (Spécifiée dans (en) JSR 47 ([Link]


7) [archive]) ;

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 (htt
p://[Link]/en/jsr/detail?id=5) [archive] et (en) JSR 63 ([Link]

il?id=63) [archive]) ;

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 ([Link] [archive]).
J2SE 5.0

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[45]. Développé
par (en) JSR 176 ([Link] [archive], Tiger ajoute un nombre
[46]
significatif de nouveautés au langage :

intégration du composant logiciel Java Web Start dans l'environnement d'exécution Java
(JRE)[47] ;

programmation générique — (Spécifié par (en) JSR 14 ([Link]


4) [archive]) ;

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 ([Link]
5) [archive]) ;

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 (ht
tp://[Link]/en/jsr/detail?id=201) [archive]) ;

é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) {
[Link]();
}
}

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

Sortie le 11 décembre 2006 (3 777 classes et interfaces dans plus de 20 paquetages), son nom de
code est Mustang ([Link] [archive][48]. 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[49].

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)

Sortie le 7 juillet 2011 (8 000[50] 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[51], 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[52]. La version 7u90
d'avril 2015 est la dernière mise à jour de Java 7 disponible publiquement[53].

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 | ;


[Link] (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)

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

Une des nouveautés majeures de cette version est l’ajout des lambdas[56], 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[57], 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

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

Java 9 intègre :

le projet Jigsaw permettant de modulariser les modules chargés au sein du JDK ;

JShell[59], 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[60]Cf Release Note Oracle[61]. Il faut utiliser des librairies pour
JSON[62].

Java SE 10

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

Cette nouvelle version intègre notamment :

JEP 286[64] : inférence des types des variables locales;

JEP 310[65] : partage de binaire pour permettre un lancement plus rapide


JEP 317[66] : activation de Graal un compilateur JIT en Java
Java SE 11 (LTS)

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

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

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

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

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

JEP 355 : Text Blocks

JEP 354 : (Switch - aperçu v2) Nouveau case case...-> (case traditionnel case...:)

1 switch(nombre){
2 //case traditionnel
3 case 5:
4 [Link]("La variable est égale à 5");
5 break;
6
7 //nouveau case
8 case 5 -> [Link]("La variable est égale à 5");
9 }
Java SE 14

Cette version est sortie le 17 mars 2020[70]

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
[71]
case...:)

JEP 362 : Dépréciation des ports Solaris et SPARC

JEP 368 : Text Blocks

Java SE 15

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

? Pas de JEP ?

Java SE 16

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

? Pas de JEP ?

Java SE 17 (LTS)

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

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

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

Liste des JEP [76]:

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

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

JEP 415 : le JDK est porté pour Linux sur l'architecture RISC-V.
Java SE 20

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

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)

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


Philosophie

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

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


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
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[81].
En outre, le programmeur peut au besoin suggérer de lancer le ramasse-miettes à l’aide de la
méthode [Link]().

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[81]) 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


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

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

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[82], 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 le Java Beans aussi bien que les systèmes
embarqués sur OSGi, utilisant l’environnement Embedded Java.

Exécution sécurisée de code distant

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

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

public class HelloWorld {


public static void main(String[] args) {
[Link]("Hello world!");
}
}

Le fichier source porte presque toujours le nom de la classe avec l'extension « .java » (ici
« [Link] », 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 [Link]
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

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 ([Link] [archive])

Classe, attribut, méthode

Notion de classe

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

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

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

Taille en octets lors Valeur par


Nom Valeurs possibles
des calculs défaut

Un seul bit suffit,


mais on réserve
boolean false true , false
souvent un octet pour
les stocker.

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)

entiers compris entre −9 223 372 036 854 775 808 et


long 8 0
9 223 372 036 854 775 807 (-263 et 263-1)

Ensemble des valeurs Unicode (valeurs de U+0000 à U+FFFF, 4 chiffres


char 2 '\u0000' obligatoires après '\u' ) Les 128 premiers caractères sont les codes
ASCII et se notent entre apostrophes : 'a' , '1' , '\'' , '\n' .

Ensemble des nombres [−3,402 823 47 × 1038 .. −1,402 398 46 × 10−45],


float 4 0.0
0, [1,402 398 46 × 10−45 .. 3,402 823 47 × 1038]

Ensemble des nombres [−1,797 693 134 862 315 70 × 10308 ..


−4,940 656 458 412 465 44 × 10−324], 0,
double 8 0.0
[4,940 656 458 412 465 44 × 10−324 ..
1,797 693 134 862 315 70 × 10308]

Dépendant de la
Object null
machine virtuelle

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

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


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 : [Link] ) 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

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

Pour initialiser une ArrayList il faut importer la classe [Link] 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 [Link](Objet);

Pour accéder à un élément de l’ArrayList : [Link](index);

Pour connaître le nombre d’éléments que contient une liste : [Link]();

Pour supprimer un élément : [Link](index); les éléments qui suivent l’élément


supprimé seront décalés à gauche.

Structures de contrôle

Boucles

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
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
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

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
[Link](...);
}
catch (IOException e) {
//Gestion de l'erreur de création ou d'écriture dans le flux
[Link]();
}
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) [Link]();
}

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

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

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

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

Failles de sécurité

La plate-forme de développement Java propose un gestionnaire de sécurité[83] (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[84],[85]. La même faille a été retrouvée dans Java 5 par la suite[86]. 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[87]. »
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[88]. « 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[89]. »

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[90],[91].

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[92]. 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[93].

La « classite »

Dans son essai sur la conception des logiciels[94], 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

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[95],[96], et l'accumulation de
métacaractères dans le typage a rendu Java incohérent[97].

Types de données manquants

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[98]. 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[99].

Écarts aux normes de codage en virgule flottante

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[100],[101].

Faible performance

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[102],[103],[104].

Mais il est vrai que la vitesse d'exécution de Java s'est considérablement améliorée depuis[105]. 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[105],[106].

Environnements de développement

JavaStyle

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

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 applications mobiles ;

JavaFX (à ne pas confondre avec JavaFX) : Ce framework est spécialisé dans les applications
liées aux cartes à puces et autres SmartCards. Il recouvre notamment l'ancien Java Card.

La persistance est fondée sur les standards :

JDBC (Java DataBase Connectivity) ;

JDO (Java Data Objects) ;

EJB (Enterprise Java Beans).

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

Java Speech ;

JMI ;

JavaSpaces.

Outils de développement

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 ; JBuilder ;

CodeWarrior ; JCreator ;

Eclipse ; jDeveloper 2 ;

IntelliJ IDEA ; NetBeans.


Automatisation

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 = '[Link]', source = 'classes')

Résultats :

% scons -Q
javac -d classes -sourcepath src src/[Link]
src/[Link] src/[Link]
jar cf [Link] classes

Notes et références

(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 ([Link]
action=history) ).

1. Oracle Releases Java 22 ([Link]


22-2024-03-19/) [archive]

2. « JDK 21 ([Link] [archive] »

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 [1] ([Link] [archive][2] ([Link]

m/lang/) [archive][3] ([Link] [archive]

4. « PEP 318 -- Decorators for Functions and Methods ([Link]


318/) [archive] », sur [Link] (consulté le 1er août 2020).

5. « So why did they decide to call it Java? ([Link]


a/[Link]) [archive] », sur JavaWorld, 4 octobre 1996
6. Core Web Programming ([Link]
a+language+coffee&hl=fr&sa=X&ved=0ahUKEwiK3Pq6qLfPAhWGSRoKHWnGDUoQ6AEIRzAE
#v=onepage&q=java%20language%20coffee&f=false) [archive], Marty Hall, Larry Brown

7. Object-oriented Programming with Java ([Link]


g=PA2&dq=java+language+coffee&hl=fr&sa=X&ved=0ahUKEwiK3Pq6qLfPAhWGSRoKHWnGD
UoQ6AEIKjAA#v=onepage&q=coffee&f=false) [archive], Barry J. Holmes, Daniel T. Joyce

8. (en) Java Technology: The Early Years ([Link]


[Link]/features/1998/05/[Link]) .

9. (en) Sun Microsystems Announces Formation Of Javasoft ([Link]


nflash/1996-01/[Link]) [archive].

10. (en) « HugeDomains ([Link] [archive] », sur HugeDomains (consulté le


12 avril 2023).

11. MicroEJ ([Link] [archive]

12. Java sur STM32 ([Link] [archive]

13. Apple Java 6 pour Mac OS X ([Link] [archive]

FAQ [Link] [archive]

14. Technical Notes TN2110 ([Link]


[Link]#TABLES) [archive] [Link]

15. (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 ([Link]
[Link]#b2) [archive]; the source is being released via the OpenJDK ([Link]

t/) [archive] project.

16. « Sun Open Sources Java Platform ([Link]


[Link]) [archive] », Sun Microsystems, 13 novembre 2006 (consulté le

13 novembre 2006)

17. « Rich Sharples’ Blog » Blog Archive » Java is finally Free and Open ([Link]
om/cache/20110223125200/[Link] », sur [Link]
via Wikiwix (consulté le 8 octobre 2023).

18. (en) « Oracle to charge for Java from Jan 2019 ([Link]
5/01/oracle-to-charge-for-java-from-jan-2019/) [archive] », sur [Link]

19. (en) « Oracle Java Licensing Changes ([Link]


ng-change-january-2023/) [archive] », sur Palisadecompliance, janvier 2023
20. (en) « Oracle changes its Java pricing as customers brace for higher costs ([Link]
[Link]/news/applications/101214/oracle-changes-its-java-pricing-as-customers-brace-for-hig
her-costs/) [archive] », sur [Link], 31 janvier 2023

21. (en) « Oracle makes significant change to its Java license ([Link]
akes-significant-change-to-its-java-license/) [archive] », sur SDTimes, 8 février 2023

22. (en) The Java Community Process(SM) Program - JSRs : Java Specification Requests - detail
JSR# 901 ([Link] [archive]

23. Java Naming ([Link] [archive]


[Link] [archive].

24. Versions de Java et correctifs de sécurité ([Link]


[Link]) [archive].

25. (en) « JavaFX GA downloads » ([Link]


[Link]) [archive].

26. [Link] [archive]

27. Oracle Announces Availability of Java Platform Enterprise Edition 7 ([Link]


s/corporate/press/1957557) [archive] Oracle Press Release June 12, 2013.

28. (en) « Java ME SDK Downloads » ([Link]


le/download/sdk/[Link]) [archive].

29. (en) « Oracle Java SE Support Roadmap ([Link]


[Link]) [archive] » (consulté le 7 septembre 2022)

30. Oracle Java SE Commercial Offering Releases ([Link]


se/[Link]#java-commercial-offerings) [archive] [Link] java commercial

offerings

31. Oracle Java SE Support Roadmap, 13 mai 2013,


[Link] [archive]

32. Oracle releases Java 7u25, no 6u51 ([Link]


5) [archive]

33. [Link] [archive]

34. [Link] [archive] « Copie archivée ([Link]


1/[Link] » (version du 29 août 2014 sur Internet Archive)

35. (en) « JDK 8u391 Release Notes ([Link]


[Link]) [archive] », sur [Link], 6 novembre 2023 (consulté le 18 novembre 2023)

36. 18/03/2014 ([Link] [archive]


37. (en) « Java SE 9 Platform Umbrella JSR (379) ([Link]
c/) [archive] », sur [Link], 25 septembre 2017 (consulté le 25 mai 2018)

38. (en) communiqué de presse ([Link]


[Link]) [archive]

39. (en) communiqué de presse ([Link]


[Link]) [archive]

40. (en) communiqué de presse ([Link]


[Link]) [archive]

41. (en) communiqué de presse ([Link]


[Link]) [archive] - (en) liste complète des changements ([Link]
docs/relnotes/[Link]) [archive]

42. (en) JSR 59 ([Link] [archive]

43. (en) communiqué de presse ([Link]


[Link]) [archive] - (en) liste complète des changements ([Link]
2/docs/relnotes/[Link]) [archive]

44. (en) JSR 41 ([Link] [archive]

45. (en) Version 1.5.0 or 5.0? ([Link]


l) [archive]

46. (en) communiqué de presse ([Link]


[Link]) [archive]

47. Qu'est-ce que le logiciel Java Web Start ([Link]


[Link]) [archive] [Link] [archive]

48. (en) JSR 270 ([Link] [archive]

49. (en) Java Naming ([Link] [archive]

50. (en) « Java Platform SE 7 ([Link] [archive] », sur

[Link] (consulté le 12 avril 2023).

51. Oracle met à jour Java SE et JavaFX pour OS X, ARM et Linux ([Link]
[Link]/actualites/[Link]
l) [archive] Le Monde Informatique

52. Informations et configuration minimale requise pour l'installation et l'utilisation de Java 7 pour
Mac ([Link] [archive]
[Link] [archive]

53. Auto-update Notice and End of Public Updates for Oracle JDK 7 ([Link]
network/java/[Link]) [archive] [Link], May 14, 2015
54. JDK™ 8 Early Access Releases ([Link] [archive] [Link].

55. JDK8 Schedule and status ([Link] [archive] OpenJDK.

56. Everything about Java 8 ([Link]


8) [archive]

57. [4] ([Link]


-[Link]) [archive]

58. Mickael Baron, « Java 9 est disponible, la plateforme se met aux modules : tour d'horizon des
nouveautés », [Link],‎21 septembre 2017 (lire en ligne ([Link]
0955/Java-9-est-disponible-la-plateforme-se-met-aux-modules-tour-d-horizon-des-nouveautes/) [archive],

consulté le 3 janvier 2018)

59. JM Doudoux, « Java 9 – JShell ([Link]


l/) [archive] » (consulté le 20 septembre 2022)

60. Java 9 : ce que l'on sait ([Link]


ml) [archive] Journal du net - 16 juin 2015.

61. (en) « Consolidated JDK 9 Release Notes ([Link]


[Link]) [archive] »

62. (en) Mkyong, « Java JSON Tutorials ([Link]


s/) [archive] » (consulté le 20 septembre 2022)

63. « JDK 10 ([Link] [archive] », sur [Link] (consulté le


1er avril 2018)

64. « JEP 286: Local-Variable Type Inference ([Link] [archive] », sur


[Link] (consulté le 1er avril 2018)

65. « JEP 310: Application Class-Data Sharing ([Link] [archive] », sur


[Link] (consulté le 1er avril 2018)

66. « JEP 317: Experimental Java-Based JIT Compiler ([Link]


7) [archive] », sur [Link] (consulté le 1er avril 2018)

67. « JDK 11 ([Link] [archive] », sur [Link] (consulté le

7 novembre 2018)

68. « JDK 12 ([Link] [archive] », sur [Link] (consulté le


7 novembre 2018)

69. (en) « JDK 13 ([Link] [archive] », sur [Link]


(consulté le 25 avril 2019)

70. « JDK 14 ([Link] [archive] », sur [Link] (consulté le


26 avril 2020)
71. Jean-Michel Doudoux, « Java 14 : Switch expression », Blog OXiane,‎5 juin 2020 (lire en ligne (http
s://[Link]/2020/06/05/java-14-switch-expression/) [archive])

72. « The Arrival of Java 15! ([Link]


5) [archive] », Oracle, 15 septembre 2020 (consulté le 15 septembre 2020)

73. « Oracle annonce Java 16 », Oracle France,‎16 avril 2021 (lire en ligne ([Link]
s/announcement/[Link]) [archive], consulté le 22 avril 2021)

74. « Oracle annonce Java 17 », Oracle France,‎14 septembre 2021 (lire en ligne ([Link]
m/fr/news/announcement/oracle-releases-java-17-2021-09-14/) [archive], consulté le 6 octobre 2021)

75. (en) « Oracle Announces Java 18 ([Link]


ses-java-18-2022-03-22/) [archive] »

76. JDK 18 ([Link] [archive]

77. (en) « JDK 19 ([Link] [archive] »

78. « JDK 20 ([Link] [archive] », sur [Link] (consulté le


13 avril 2023)

79. (en) Oracle, « The Arrival of Java 21 ([Link]


1) [archive] » , sur Oracle, 19 septembre 2023 (consulté le 13 décembre 2023)

80. (en) Design Goals of the Java Programming Language ([Link]


nv/[Link]) [archive].

81. 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 ([Link]
_tuning_6.html) [archive]

82. Microsoft poussé à parler Java ([Link]


usse-a-parler-java) [archive] Libération - 26/12/2002

83. « Java Security Architecture: Contents ([Link]


es/security/spec/[Link]) [archive] », sur [Link], 2 octobre 1998
(consulté le 9 février 2016)

84. Michael Horowitz, « Java security flaw: yada yada yada | Computerworld ([Link]
org/web/20140724212538/[Link]
java-security-flaw-yada-yada-yada) », sur [Link], 1er août 2012 (version du
24 juillet 2014 sur Internet Archive)

85. Chris Brook, « The first stop for security news ([Link]
7/[Link]
it-011013) », sur Threatpost (version du 9 avril 2013 sur Internet Archive)
86. Chris Brook, « The first stop for security news ([Link]
1/[Link]
n-desktops-affected-092612) », sur Threatpost (version du 8 mars 2013 sur Internet Archive)

87. « Why and How to Disable Java on Your Computer Now - Technology & science - Innovation (ht
tp://[Link]/id/50438206/ns/technology_and_science-innovation/t/why-how-dis
able-java-your-computer-now#.UhJ652RrMdg) [archive] », sur NBC News, 12 janvier 2013
(consulté le 9 février 2016)

88. Brian Krebs, « Good Riddance to Oracle's Java Plugin ([Link]


ood-riddance-to-oracles-java-plugin/) [archive] », sur KrebsOnSecurity, 16 février 2016

89. Antone Gonsalves, « Java Is No Longer Needed. Pull The Plug-In ([Link]
09/05/java-is-no-longer-needed-pull-the-plug-in) [archive] », sur Wearable World,
5 septembre 2012

90. « US Department of Homeland Security Calls On Computer Users To Disable Java ([Link]
[Link]/sites/eliseackerman/2013/01/11/us-department-of-homeland-security-calls-on
-computer-users-to-disable-java/) [archive] », sur [Link] (consulté le 9 février 2016)

91. Graham Cluley, « "Unless it is absolutely necessary to run Java in web browsers, disable it",
DHS-sponsored CERT team says – Naked Security ([Link]
1/15/disable-java-browsers-homeland-security/) [archive] », sur [Link],
15 janvier 2013 (consulté le 9 février 2016)

92. « Pourquoi Java présente moins de risques pour la sécurité maintenant sur Windows, Mac et
Linux ([Link]
urite-maintenant-sur-windows-mac-et-linux/) [archive] », sur [Link], 2019 (consulté le

4 décembre 2023).

93. (en) « Application security: Survey finds JavaScript beats Java and .NET with fewer flaws,
faster fixes ([Link]
ats-java-and-net-with-fewer-flaws-faster-fixes/) [archive] », sur [Link], 17 janvier 2023
(consulté le 4 décembre 2023).

94. (en) John Ousterhout, A Philosophy of Software Design, Yaknyam Press, 2018
(ISBN 9781732102217), « Modules should be deep »

95. « Generics in Java ([Link]


nb/[Link]) », sur Object Computing, Inc. (version du 2 janvier 2007 sur Internet Archive)

96. « What's Wrong With Java: Type Erasure ([Link]


pe-erasure/) [archive] », 6 décembre 2006 (consulté le 9 décembre 2006)

97. « Java and Scala's Type Systems are Unsound ([Link]


ound/master/doc/[Link]) [archive] », sur Github User's Content
98. « Java libraries should provide support for unsigned integer arithmetic ([Link]
ugdatabase/view_bug.do?bug_id=4504839) [archive] », sur Oracle/Bug Database, Sun

Developer Network (consulté le 18 janvier 2011)

99. Sean R. Owens, « Java and unsigned int, unsigned short, unsigned byte, unsigned long, etc. (Or
rather, the lack thereof) ([Link]
l) [archive] », sur [Link], 5 novembre 2009 (consulté le 9 octobre 2010)

100. (en) W. Kahan et Joseph D. Darcy, « How Java's Floating-Point Hurts Everyone Everywhere (htt
p://[Link]/~wkahan/[Link]) [archive] », 1er mars 1998 (consulté le
9 décembre 2006)

101. (en) « Types, Values, and Variables ([Link]


[Link]#4.2.3) [archive] », sur Sun Microsystems (consulté le 9 décembre 2006)

102. « Which programming languages are fastest? ([Link]


7/[Link] »,
sur Computer Language Benchmarks Game, 14 août 2011 (version du 14 août 2011 sur Internet
Archive)

103. « speed ÷ C++ GNU g++ speed ([Link]


[Link]/u64q/[Link]?test=all&lang=javasteady&lang2=gpp) », sur
Computer Language Benchmarks Game, 26 septembre 2011 (version du 26 septembre 2011 sur
Internet Archive)

104. « C++ vs Java performance; It's a tie! | Blog of Christian Felde ([Link]
6/c-vs-java-performance/) [archive] », sur [Link], 27 juin 2010 (consulté le 9 février 2016)

105. J. P. Lewis et Ulrich Neumann, « Performance of Java versus C++ ([Link]


mputer/[Link]) [archive] », sur Graphics and Immersive Technology Lab,
université du Sud de la Californie

106. FreeTTS – A Performance Case Study ([Link]


[Link]) [archive] erreur modèle {{Lien archive}} : renseignez un paramètre « |url= ».

Voir aussi

Bibliographie
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 ([Link] [archive]
version électronique en ligne ([Link] [archive] traduction
francophone : penser en java ([Link] [archive]

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 ([Link] [archive]]

Articles connexes
Plateforme Java GNU Compiler Collection (inclut un
compilateur de code Java vers code natif,
Machine virtuelle Java
GCJ)
Bytecode Java
.properties, manière de stocker les variables
Servlet de configuration
Navigateur HotJava Processing

Java version history (en)

Liens externes
Site officiel ([Link] [archive]

(en) [Link] [archive] : Schéma de l'architecture logicielle de


Java

Portail de la programmation informatique

Vous aimerez peut-être aussi