Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 9

Statique vs. Dynamique : Typage Java, PHP et JS

Recommended resources

Bonjour ! Dans la leçon précédente, nous avons mis en place votre environnement de développement Java professionnel. Vous disposez maintenant d'un projet fonctionnel dans IntelliJ IDEA, prêt à être utilisé.

Aujourd'hui, nous allons aborder une des différences les plus fondamentales et importantes entre Java et les langages que vous maîtrisez déjà, comme JavaScript et PHP. L'objectif de cette leçon est de comparer le typage statique de Java avec le typage dynamique de PHP/JS via des exemples pratiques. Comprendre cette distinction est essentiel pour écrire du code Java robuste et éviter une catégorie entière de bugs que vous avez peut-être déjà rencontrés dans le monde du développement web.

1. Le Typage Statique en Action avec Java

Commençons par une expérience pratique. Ouvrez le projet mon-premier-projet-java que vous avez créé lors de la dernière leçon. Allez dans le fichier src/main/java/fr/formation/Main.java et remplacez le contenu de la méthode main par le code suivant :

public static void main(String[] args) {
    int age = 30; // Déclaration d'une variable de type entier (int)
    System.out.println("L'âge initial est : " + age);

    // Essayons maintenant de lui assigner une chaîne de caractères.
    // La ligne ci-dessous ne compilera pas.
    // age = "trente ans"; 
}

Même sans essayer d'exécuter le code, si vous décommentez la dernière ligne, IntelliJ IDEA la soulignera immédiatement en rouge. En survolant l'erreur, vous verrez un message du type : Incompatible types. Required: 'int'. Provided: 'java.lang.String'.

Cette capture d'écran illustre une erreur de compilation typique en Java. L'IDE détecte qu'on essaie d'assigner une chaîne de caractères à une variable déclarée comme un entier, ce qui est interdit par le système de typage.

Ceci est le typage statique en action.

  • Statique : Le type de chaque variable est connu et vérifié au moment de la compilation, c'est-à-dire avant même que le programme ne soit exécuté.
  • Fort : Une fois qu'une variable est déclarée avec un type (ici, int), elle ne peut contenir que des valeurs de ce type. Toute tentative d'y assigner une valeur d'un autre type est une erreur.

C'est comme si vous aviez un garde du corps (le compilateur Java) qui vérifie l'identité de chaque donnée avant de la laisser entrer dans une variable.


2. Contraste avec le Typage Dynamique (JavaScript & PHP)

Votre expérience avec JavaScript et PHP vous montre une approche très différente. Le code équivalent en JavaScript serait :

let age = 30; // age est de type 'number'
console.log(`L'âge initial est : ${age}`);

age = "trente ans"; // Parfaitement valide. age est maintenant de type 'string'
console.log(`Le nouvel âge est : ${age}`);

En PHP, le comportement est similaire :

$age = 30; // $age est un entier
echo "L'âge initial est : " . $age;

$age = "trente ans"; // Valide, $age est maintenant une chaîne de caractères
echo "Le nouvel âge est : " . $age;

Ceci est le typage dynamique.

  • Dynamique : Le type d'une variable n'est pas figé. Il est déterminé et peut changer pendant l'exécution du programme, en fonction de la valeur qui lui est assignée.

3. Typage Fort vs. Faible : Une Distinction Cruciale

Au-delà de statique vs. dynamique, il y a une autre dimension : fort vs. faible. Cela décrit la rigueur du langage lorsqu'il s'agit de mélanger les types dans des opérations.

  • Un langage à typage fort (comme Java, ou même Python et les versions récentes de PHP) interdit les opérations entre des types incompatibles. Essayer d'additionner un nombre et une chaîne de caractères lèvera une erreur.
  • Un langage à typage faible (comme JavaScript) essaiera de "deviner" ce que vous voulez faire en convertissant les types à la volée (coercition), ce qui peut mener à des résultats inattendus.

La vidéo suivante explique brillamment ces nuances avec des exemples clairs en Java, Python (qui se comporte de manière similaire à PHP en termes de typage dynamique/fort) et JavaScript.

Java is "Strongly Typed"? - Here's What That ACTUALLY Means

Cette vidéo de 'Coding with John' explique très clairement ce que signifient les termes 'statiquement typé', 'dynamiquement typé', 'fortement typé' et 'faiblement typé'. Les exemples concrets vont vous permettre de bien fixer les idées.

Regardez la vidéo du début jusqu'à 08:44. Portez une attention particulière à : La démonstration du typage statique et fort en Java. Le contraste avec Python (dynamique mais fort). L'exemple du typage dynamique et faible de JavaScript, qui illustre la coercition de type (par exemple, 3 + '2' qui devient '32').


4. Consolidation en Français et Comparaison Directe

Pour solidifier votre compréhension et la replacer dans le contexte de votre parcours (passer de JS/PHP à Java), les ressources suivantes, en français, sont très pertinentes.

Java vs JavaScript : Quelle Différence ? - Partie 2

Cet article de Syslearn compare directement Java et JavaScript, en se concentrant sur la syntaxe et le système de typage. Il vous fournira un bon résumé écrit de ce que nous venons de voir.

Lisez la 'Partie 2 : Syntaxe et Structure'. Concentrez-vous sur les sections 'Java : Strictement Typé et Fortement Structuré' et 'JavaScript : Flexible, Dynamique et Évolutif', ainsi que sur les exemples de code qui les accompagnent.

Maintenant, faisons un focus spécifique sur PHP, que vous connaissez via Laravel.

PHP VS JAVA: les différences

Cet article d'Ibraci Links met en perspective Java et PHP. Il est particulièrement utile car il compare les deux langages sur plusieurs aspects, dont le typage.

Lisez la section 'Java et PHP: les différences' et examinez attentivement le tableau comparatif. Repérez la ligne 'Typage' qui résume de manière concise la différence fondamentale.


5. L'Intérêt du Typage Statique dans les Projets Professionnels

À ce stade, vous pourriez penser que le typage dynamique offre plus de flexibilité. Alors pourquoi les langages d'entreprise comme Java, C# ou Go insistent-ils sur le typage statique ?

Les avantages principaux sont la fiabilité et la maintenabilité à grande échelle :

  1. Détection précoce des bugs : Comme vous l'avez vu, une erreur de type est détectée par votre IDE avant même que vous n'exécutiez le code. Dans un langage dynamique, cette erreur ne serait apparue qu'à l'exécution, potentiellement en production.
  2. Lisibilité et auto-documentation : Le type d'une variable est explicite. Quand vous lisez String userName;, vous savez immédiatement ce que la variable est censée contenir.
  3. Refactoring sécurisé : Les IDE comme IntelliJ peuvent analyser le code de manière très fiable. Renommer une méthode ou changer un type de retour se propage dans tout le projet sans risque de casser quelque chose silencieusement.
  4. Meilleure auto-complétion : L'IDE connaît le type de chaque variable, il peut donc vous proposer uniquement les méthodes applicables à ce type, accélérant le développement.

La vidéo suivante résume bien ce débat et introduit le concept d'inférence de type, une fonctionnalité des langages modernes pour allier sécurité et concision.

Static vs Dynamic Typing

Cette courte vidéo de Boot.dev aborde les compromis entre typage statique et dynamique, expliquant pourquoi le typage statique est généralement préféré pour les grands systèmes.

Regardez la vidéo de 00:24 à 03:19. Elle explique bien le compromis historique entre la rapidité de développement (dynamique) et la robustesse (statique).

Une petite note : Java, depuis sa version 10, supporte l'inférence de type pour les variables locales avec le mot-clé var, un peu comme le let de JavaScript.
var message = "Hello, Java!";
Le compilateur déduit que message est une String. Cependant, contrairement à JavaScript, le type de message est toujours fixé à String une fois pour toutes au moment de la compilation. C'est une commodité syntaxique, pas un passage au typage dynamique.


6. Exercice Pratique

Mettons en pratique ces connaissances. Dans votre fichier Main.java, remplacez à nouveau le contenu de la méthode main par le code suivant et suivez les instructions dans les commentaires.

public class Main {
    public static void main(String[] args) {
        // 1. Déclarez des variables pour représenter un produit.
        // Utilisez les types appropriés : String pour le nom, double pour le prix,
        // int pour la quantité en stock, et boolean pour la disponibilité.
        String productName = "Ordinateur Portable";
        double price = 1299.99;
        int stockQuantity = 50;
        boolean isAvailable = true;

        // 2. Affichez ces informations dans la console.
        System.out.println("Produit : " + productName);
        System.out.println("Prix : " + price + " €");
        System.out.println("Stock : " + stockQuantity);
        System.out.println("Disponible : " + isAvailable);

        // 3. Calculez la valeur totale du stock et affichez-la.
        // Notez que Java gère automatiquement la promotion du type int vers double dans le calcul.
        double totalStockValue = price * stockQuantity;
        System.out.println("Valeur totale du stock : " + totalStockValue + " €");

        // 4. Provoquez une erreur de type !
        // Décommentez la ligne ci-dessous et observez l'erreur rapportée par IntelliJ.
        // stockQuantity = "épuisé";
    }
}

Prenez quelques minutes pour exécuter ce code (avec la dernière ligne commentée), puis décommentez-la pour bien visualiser l'intervention du compilateur.


Conclusion

Félicitations ! Vous avez exploré une différence fondamentale qui influence toute la philosophie de programmation en Java.

Points clés à retenir :

  • Java est à typage statique et fort : les types sont vérifiés à la compilation et ne peuvent pas changer. Cela garantit une grande sécurité et détecte les erreurs très tôt.
  • JavaScript et PHP sont à typage dynamique : le type d'une variable est flexible et vérifié à l'exécution. Cela offre de la souplesse pour le prototypage mais peut cacher des bugs.
  • Le typage statique, bien que plus verbeux au premier abord, est un atout majeur pour la construction d'applications complexes, fiables et maintenables, ce qui est notre objectif dans ce cours.

Dans la prochaine leçon, nous mettrons à profit notre connaissance des variables typées pour construire la logique de nos programmes. Nous aborderons les structures de contrôle (if-else, switch) et la définition de méthodes, des concepts que vous connaissez bien mais que nous revisiterons avec la syntaxe et les particularités de Java.