Java a rapidement gagné en popularité après sa sortie et est depuis lors un langage de programmation très répandu. GitHub . Bien que toujours très populaire, l'utilisation de Java a progressivement diminué ces dernières années, d'autres langages utilisant la JVM gagnant en popularité.
Java a été conçu par James Gosling chez Sun Microsystems . Il a été lancé en mai 1995 en tant que composant essentiel de la plateforme Java de Sun. Les compilateurs Java d'origine et de référence , les machines virtuelles (VM) et les bibliothèques de classes ont été distribués par Sun sous des licences propriétaires . En mai 2007, conformément aux spécifications du Java Community Process , Sun a placé la plupart de ses technologies Java sous la licence GPL-2.0 uniquement . Oracle , qui a racheté Sun en 2010, propose sa propre machine virtuelle Java, HotSpot . Cependant, l' implémentation de référence officielle reste la JVM OpenJDK , un logiciel libre utilisé par la plupart des développeurs et qui est la JVM par défaut de presque toutes les distributions Linux .
James Gosling , Mike Sheridan et Oak , en référence à un chêne qui se dressait devant le bureau de Gosling. Plus tard, le projet a porté le nom de Green , puis a finalement été renommé Java , d'après le café Java , un type de café indonésien . Gosling a conçu Java avec une syntaxe de type C / C++ , familière aux programmeurs système et d'applications. Sun Microsystems a publié la première implémentation publique sous le nom de Java 1.0 en 1996 Ce langage promettait une fonctionnalité WORA ( Write Once, Run Anywhere ), offrant un environnement d'exécution gratuit sur les plateformes les plus courantes . Relativement sécurisé et doté d'une sécurité configurable, il permettait de restreindre l'accès au réseau et aux fichiers. Les principaux navigateurs web ont rapidement intégré la possibilité d'exécuter des applets Java au sein des pages web, et Java a rapidement gagné en popularité. Le compilateur Java 1.0 a été réécrit en Java par Arthur van Hoff afin de se conformer strictement à la spécification du langage Java 1.0 . Avec l'arrivée de Java 2 (initialement publié sous le nom de J2SE 1.2 en décembre 1998-1999 ) , les nouvelles versions proposaient plusieurs configurations conçues pour différents types de plateformes. J2EE incluait des technologies et des API pour les applications d'entreprise généralement exécutées dans des environnements serveur, tandis que J2ME offrait des API optimisées pour les applications mobiles. La version pour ordinateurs de bureau a été renommée J2SE. En 2006, à des fins marketing, Sun a renommé les nouvelles versions de J2 respectivement Java EE , Java ME et Java SE . En 1997, Sun Microsystems a sollicité l' organisme de normalisation ISO/IEC JTC 1 , puis Ecma International, afin de formaliser Java, mais s'est rapidement retiré du processus. Java demeure une norme de facto , contrôlée par le biais du Java Community Process . À une époque, Sun proposait gratuitement la plupart de ses implémentations Java, malgré leur statut de logiciel propriétaire . Sun tirait des revenus de Java grâce à la vente de licences pour des produits spécialisés tels que Java Enterprise System. Le 13 novembre 2006, Sun a publié une grande partie de sa machine virtuelle Java (JVM) en tant que logiciel libre et open source (FOSS), sous les termes de la licence GPL-2.0 uniquement . Le 8 mai 2007, Sun a finalisé le processus, rendant disponible l'intégralité du code source de base de sa JVM sous les termes d'une distribution de logiciel libre /open source, à l'exception d'une petite portion de code dont Sun ne détenait pas les droits d'auteur. Le vice-président de Sun, Rich Green, a déclaré que le rôle idéal de Sun concernant Java était celui d' évangéliste . Suite à l'acquisition de Sun Microsystems par Oracle Corporation en 2009-2010, Oracle s'est présentée comme la gardienne de la technologie Java, avec un engagement sans faille à promouvoir une communauté de participation et de transparence. Cela n'a pas empêché Oracle de porter plainte contre Google peu après pour l'utilisation de Java dans le SDK Android (voir la section Android ). Le 2 avril 2010, James Gosling a démissionné d' Oracle . En janvier 2016, Oracle a annoncé que les environnements d'exécution Java basés sur JDK 9 abandonneraient le plugin navigateur. Le logiciel Java fonctionne sur la plupart des appareils, des ordinateurs portables aux centres de données , des consoles de jeux aux supercalculateurs scientifiques . Oracle (et d'autres) recommandent fortement de désinstaller les versions obsolètes et non prises en charge de Java, en raison de problèmes de sécurité non résolus dans les versions plus anciennes. La création du langage Java visait cinq objectifs principaux : 
Principes
Versions
Oracle a publié la dernière mise à jour publique gratuite pour l' ancienne version Java 8 LTS en janvier 2019 pour un usage commercial, tout en continuant à prendre en charge Java 8 avec des mises à jour publiques pour un usage personnel, et ce indéfiniment. D'autres fournisseurs, tels qu'Adoptium, continuent de proposer des versions gratuites des outils de support à long terme (LTS) d'OpenJDK. Ces versions peuvent inclure des correctifs de sécurité et des corrections de bogues supplémentaires.
Versions majeures de Java, ainsi que leurs dates de sortie :
| Version | Date |
|---|---|
| JDK Beta | 1995 |
| JDK 1.0 | 23 janvier 1996 |
| JDK 1.1 | 19 février 1997 |
| J2SE 1.2 | 8 décembre 1998 |
| J2SE 1.3 | 8 mai 2000 |
| J2SE 1.4 | 6 février 2002 |
| J2SE 5.0 | 30 septembre 2004 |
| Java SE 6 | 11 décembre 2006 |
| Java SE 7 | 28 juillet 2011 |
| Java SE 8 (LTS) | 18 mars 2014 |
| Java SE 9 | 21 septembre 2017 |
| Java SE 10 | 20 mars 2018 |
| Java SE 11 (LTS) | 25 septembre 2018 |
| Java SE 12 | 19 mars 2019 |
| Java SE 13 | 17 septembre 2019 |
| Java SE 14 | 17 mars 2020 |
| Java SE 15 | 15 septembre 2020 |
| Java SE 16 | 16 mars 2021 |
| Java SE 17 (LTS) | 14 septembre 2021 |
| Java SE 18 | 22 mars 2022 |
| Java SE 19 | 20 septembre 2022 |
| Java SE 20 | 21 mars 2023 |
| Java SE 21 (LTS) | 19 septembre 2023 |
| Java SE 22 | 19 mars 2024 |
| Java SE 23 | 17 septembre 2024 |
| Java SE 24 | 18 mars 2025 |
| Java SE 25 (LTS) | 16 septembre 2025 |
| Java SE 26 | 17 mars 2026 |
Éditions
- Java Card pour cartes à puce.
- Plateforme Java, Micro Edition (Java ME) – destinée aux environnements aux ressources limitées.
- Plateforme Java, édition standard (Java SE) – destinée aux environnements de postes de travail.
- Plateforme Java, édition entreprise (Java EE) – destinée aux environnements d'entreprise distribués de grande taille ou à Internet.
Les classes des API Java sont organisées en groupes distincts appelés packages . Chaque package contient un ensemble d' interfaces , de classes, de sous-packages et d'exceptions associés .
Sun proposait également une édition appelée Personal Java , qui a été remplacée par des paires de profils de configuration Java ME plus récentes et basées sur des normes.
Système d'exécution
JVM Java et bytecode
Les bibliothèques standard offrent un moyen générique d'accéder aux fonctionnalités spécifiques à l'hôte telles que les graphismes, le multithreading et la mise en réseau .
L'utilisation du bytecode universel simplifie le portage. Cependant, la surcharge liée à l'interprétation du bytecode en instructions machine rend les programmes interprétés presque toujours plus lents que les exécutables natifs . Les compilateurs Just-In-Time (JIT), qui compilent le bytecode en code machine à l'exécution, ont été introduits très tôt. Le compilateur Hotspot de Java est en réalité composé de deux compilateurs : GraalVM (inclus dans Java 11, par exemple, mais supprimé à partir de Java 16) permet machine virtuelle Java (JVM), qui traduit le bytecode JVM en langage machine de la plateforme.
Performance
sans verrou des ConcurrentMaps et d'autres collections multicœurs, et encore améliorées avec Java 1.6.Non-JVM
Certaines plateformes offrent une prise en charge matérielle directe pour Java ; il existe des microcontrôleurs qui peuvent exécuter du bytecode JVM en matériel au lieu d'une machine virtuelle Java logicielle, et certains processeurs basés sur ARM pourraient avoir une prise en charge matérielle pour l'exécution de bytecode JVM via leur option Jazelle , bien que la prise en charge ait été en grande partie abandonnée dans les implémentations actuelles d'ARM.
Gestion automatique de la mémoire
Java utilise un ramasse-miettes automatique pour gérer la mémoire durant le cycle de vie des objets . Le programmeur détermine la création des objets, et l'environnement d'exécution Java se charge de récupérer la mémoire une fois les objets inutilisés. Dès qu'il ne reste plus aucune référence à un objet, la mémoire inaccessible peut être libérée automatiquement par le ramasse-miettes. Un problème similaire à une fuite de mémoire peut néanmoins survenir si le code du programmeur conserve une référence à un objet devenu inutile, généralement lorsque des objets inutilisés sont stockés dans des conteneurs encore utilisés. Si des méthodes d'un objet inexistant sont appelées, une exception de pointeur nul est levée.
L'un des principes du modèle de gestion automatique de la mémoire de Java est de libérer les programmeurs de la gestion manuelle de la mémoire. Dans certains langages, la mémoire nécessaire à la création d'objets est allouée implicitement sur la pile ou explicitement allouée et libérée du tas . Dans ce dernier cas, la responsabilité de la gestion de la mémoire incombe au programmeur. Si le programme ne libère pas un objet, une fuite de mémoire se produit. Si le programme tente d'accéder à une mémoire déjà libérée ou de la libérer, le résultat est indéfini et difficile à prévoir, et le programme risque de devenir instable ou de planter. L'utilisation de pointeurs intelligents permet d'atténuer partiellement ce problème , mais cela engendre une surcharge et une complexité supplémentaires. Le ramasse-miettes ne prévient pas les fuites de mémoire logiques , c'est-à-dire celles où la mémoire est référencée mais jamais utilisée.
Le ramasse-miettes peut s'effectuer à tout moment. Idéalement, il a lieu lorsqu'un programme est inactif. Il est systématiquement déclenché si la mémoire libre sur le tas est insuffisante pour allouer un nouvel objet ; cela peut entraîner un blocage momentané du programme. La gestion explicite de la mémoire n'est pas possible en Java, mais il est possible de configurer manuellement la JVM pour qu'elle effectue le ramasse-miettes .
Java ne prend pas en charge l'arithmétique des pointeurs de type C/C++ , où les adresses d'objets peuvent être manipulées arithmétiquement (par exemple en ajoutant ou en soustrayant un décalage). Ceci permet au ramasse-miettes de relocaliser les objets référencés et garantit la sûreté des types et la sécurité.
Comme en C++ et dans certains autres langages orientés objet, les variables de types primitifs en Java sont stockées soit directement dans des champs (pour les objets), soit sur la pile (pour les méthodes), et non sur le tas comme c'est généralement le cas pour les types non primitifs (voir toutefois l'analyse d'échappement ). Ce choix a été délibérément fait par les concepteurs de Java pour des raisons de performance.
Java intègre plusieurs types de ramasse-miettes. Depuis Java 9, HotSpot utilise le ramasse-miettes Garbage First (G1GC) par défaut. Cependant, d'autres ramasse-miettes peuvent être utilisés pour gérer le tas, tels que le ramasse-miettes Z (ZGC), introduit dans Java 11, et Shenandoah GC, introduit dans Java 12 mais indisponible dans les distributions OpenJDK d'Oracle. Shenandoah est en revanche disponible dans les distributions OpenJDK tierces, comme Eclipse Temurin . Pour la plupart des applications Java, G1GC est suffisant. Dans les versions antérieures de Java, comme Java 8, le ramasse-miettes parallèle était utilisé par défaut.
La syntaxe de Java est fortement influencée par C++ et C. Contrairement à C++, qui combine les syntaxes de la programmation structurée, générique et orientée objet, Java a été conçu presque exclusivement comme un langage orienté objet. Tout le code est écrit à l'intérieur de classes, et chaque donnée est un objet, à l'exception des types primitifs (entiers, nombres à virgule flottante, booléens et caractères), qui ne sont pas des objets pour des raisons de performance.
Contrairement à C++, Java ne prend pas en charge la surcharge d'opérateurs ni l'héritage multiple pour les classes, bien que l'héritage multiple soit pris en charge pour les interfaces .
Java utilise des commentaires similaires à ceux de C++. Il existe trois styles de commentaires : un style sur une seule ligne, délimité par deux barres obliques ( //), un style sur plusieurs lignes, ouvert par /*et fermé par */, et le style Javadoc , ouvert par /**et fermé par */. Ce dernier permet à l’utilisateur d’exécuter le fichier Javadoc pour générer la documentation du programme. Cette documentation peut ensuite être lue par certains environnements de développement intégrés (IDE), tels qu’Eclipse , permettant ainsi aux développeurs d’accéder à la documentation directement depuis l’IDE.
Bonjour le monde
Voici un exemple de programme « Hello, World ! » en syntaxe Java traditionnelle :
Java 25 a introduit une syntaxe simplifiée pour la classe principale et la méthode principale, ce qui permet aux utilisateurs d'écrire de petits programmes Java de manière succincte :
classes spéciales
L'API Java Servlet a été en partie remplacée (mais est toujours utilisée en interne) par deux technologies Java standard pour les services web :
- l' API Java pour les services Web RESTful (JAX-RS 2.0) utile pour les services AJAX, JSON et REST, et
- l' API Java pour les services Web XML (JAX-WS) utile pour les services Web SOAP .
Les implémentations typiques de ces API sur les serveurs d'applications ou les conteneurs de servlets utilisent une servlet standard pour gérer toutes les interactions avec les requêtes et réponses HTTP qui délèguent aux méthodes du service Web la logique métier proprement dite.
Pages JavaServer
<% spéciaux `<script> ` et ` %></script>`. Lors de son premier accès, une JSP est compilée en une servlet Java , une application Java à part entière. Ensuite, la servlet générée crée la réponse. application Swing
Application JavaFX
Génériques
Object, soit une classe conteneur différente devait être créée pour chaque classe contenue. Les génériques permettent une vérification des types à la compilation sans avoir à créer de nombreuses classes conteneurs, chacune contenant un code quasi identique. Outre une écriture plus efficace, certaines exceptions d'exécution sont évitées grâce à la génération d'erreurs à la compilation. Si Java empêchait toutes les erreurs de type à l' ClassCastExceptionexécution, il serait totalement sûr en termes de types .En 2016, il a été démontré que le système de types de Java est défectueux, car il est possible d'utiliser les génériques pour construire des classes et des méthodes permettant d'affecter une instance d'une classe à une variable d'une autre classe sans lien avec celle-ci. Un tel code est accepté par le compilateur, mais échoue à l'exécution avec une exception de conversion de type.
Critique
bibliothèques de classes
- Les bibliothèques principales, qui comprennent :
- Entrée/sortie (E/S ou E/S) et E/S non bloquantes (E/ S non bloquantes), ou E/S/E/S non bloquantes
- Réseau (nouvel agent utilisateur (client HTTP) depuis Java 11 )
- Programmation réflexive (réflexion)
- Calcul simultané (concurrence)
- Génériques
- Scripting, Compilateur
- Programmation fonctionnelle ( Lambda , streaming)
- Bibliothèques de collections qui implémentent des structures de données telles que des listes , des dictionnaires , des arbres , des ensembles , des files d'attente et des files d'attente à double extrémité , ou des piles
- Bibliothèques de traitement XML (analyse syntaxique, transformation, validation)
- Sécurité
- Bibliothèques d'internationalisation et de localisation
- Les bibliothèques d'intégration permettent au développeur d'applications de communiquer avec des systèmes externes. Ces bibliothèques comprennent :
- L' API Java Database Connectivity (JDBC) pour l'accès aux bases de données
- Interface de nommage et d'annuaire Java (JNDI) pour la recherche et la découverte
- Invocation de méthode à distance Java (RMI) et architecture CORBA ( Common Object Request Broker Architecture ) pour le développement d'applications distribuées
- Extensions de gestion Java (JMX) pour la gestion et la surveillance des applications
- Les bibliothèques d'interface utilisateur comprennent :
- L' Abstract Window Toolkit (AWT ) , version lourde ou native , fournit les composants d'interface graphique , les moyens de les agencer et les moyens de gérer les événements provenant de ces composants.
- Les bibliothèques Swing (légères) , qui sont construites sur AWT mais fournissent des implémentations (non natives) des widgets AWT
- API pour la capture, le traitement et la lecture audio
- JavaFX
- Une implémentation de la machine virtuelle Java dépendante de la plateforme, qui constitue le moyen par lequel les bytecodes des bibliothèques Java et des applications tierces sont exécutés.
- Les plugins, qui permettent d'exécuter des applets dans les navigateurs Web
- Java Web Start permet de distribuer efficacement des applications Java aux utilisateurs finaux via Internet.
- Licences et documentation
Documentation
/**et */`<p>`, tandis que les commentaires multilignes classiques en Java sont délimités par `<br>` /*et ` */<p>`, et les commentaires sur une seule ligne commencent par `<br>` //. Mises en œuvre
L'implémentation Oracle est distribuée sous deux formes : l'environnement d'exécution Java (JRE), qui contient les composants de la plateforme Java SE nécessaires à l'exécution des programmes Java et est destiné aux utilisateurs finaux, et le kit de développement Java (JDK), destiné aux développeurs et incluant des outils de développement tels que le compilateur Java , Javadoc , Jar et un débogueur . Oracle a également publié GraalVM , un compilateur et interpréteur Java dynamique haute performance.
OpenJDK est une autre implémentation de Java SE distribuée sous licence GNU GPL. Son développement a débuté lorsque Sun a commencé à publier le code source de Java sous cette licence. Depuis Java SE 7, OpenJDK est l'implémentation de référence officielle de Java.
L'objectif de Java est de rendre toutes les implémentations de Java compatibles. Historiquement, la licence de marque de Sun pour l'utilisation de la marque Java exige que toutes les implémentations soient compatibles . Cela a engendré un litige avec Microsoft , Sun affirmant que l'implémentation de Microsoft ne prenait pas en charge l'invocation de méthodes à distance (RMI) ni l'interface native Java (JNI) et avait ajouté des fonctionnalités spécifiques à sa plateforme. Sun a porté plainte en 1997 et, en 2001, a obtenu un règlement à l'amiable de 20 millions de dollars américains, ainsi qu'une injonction judiciaire contraignant Sun à respecter les termes de la licence. En conséquence, Microsoft ne fournit plus Java avec Windows .
L'indépendance de la plateforme Java est essentielle à Java EE , et une validation encore plus rigoureuse est requise pour certifier une implémentation. Cet environnement permet le développement d'applications serveur portables.
Utilisation en dehors de la plateforme Java
Le langage de programmation Java nécessite la présence d'une plateforme logicielle pour que les programmes compilés puissent être exécutés.
Oracle fournit la plateforme Java pour son utilisation avec Java. Le kit de développement logiciel Android (SDK) est une plateforme logicielle alternative, principalement utilisée pour le développement d'applications Android dotées de leur propre interface graphique.
Androïde
Android ne fournit pas l'intégralité de la bibliothèque standard Java SE, bien que le kit de développement logiciel (SDK) Android inclue une implémentation indépendante d'une grande partie de celle-ci. Il prend en charge Java 6 et certaines fonctionnalités de Java 7, offrant une implémentation compatible avec la bibliothèque standard ( Apache Harmony ).