Skip to content

TD / TP Java : De la procédure à l'Objet

Objectifs et Prérequis

Prérequis : Maîtrise des bases du langage C (variables, fonctions, struct, pointeurs).

Objectif : Découvrir la syntaxe Java, comprendre le fonctionnement de la Machine Virtuelle, et assimiler les concepts fondamentaux de la Programmation Orientée Objet (POO) à l'aide de l'environnement visuel BlueJ.


Étape 1 : Le rituel de passage - "Hello World" et la JVM

📖 Notion de cours : Compilation C vs Compilation Java

En C, vous utilisez un compilateur (comme gcc) qui traduit votre code directement en langage machine compréhensible par votre processeur. Ce fichier ne fonctionne que sur le système pour lequel il a été compilé.

En Java, le processus se fait en deux étapes :

  1. Le compilateur Java (javac) traduit votre code source (fichier .java) en Bytecode (fichier .class). Ce n'est pas du langage machine, c'est un code intermédiaire.
  2. La Machine Virtuelle Java (JVM) lit ce Bytecode et l'exécute sur votre machine.

L'avantage ? "Write Once, Run Anywhere". Le même fichier .class fonctionnera sur Windows, Mac ou Linux, tant qu'une JVM y est installée.

💻 Exercice 1 : À la main (sans IDE)

  1. Ouvrez un éditeur de texte simple (Notepad, Gedit, Nano...).
  2. Écrivez le code suivant, qui est l'équivalent de votre int main() en C :
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Bonjour depuis Java !");
    }
}
  1. Sauvegardez ce fichier exactement sous le nom HelloWorld.java (le nom du fichier doit correspondre au nom de la classe publique).
  2. Ouvrez un terminal / invite de commande et naviguez jusqu'au dossier contenant votre fichier.
  3. Compilez le code avec la commande :
    javac HelloWorld.java
    
  4. Vérifiez qu'un fichier HelloWorld.class a bien été créé.
  5. Exécutez le programme via la JVM avec la commande (attention, on ne met pas l'extension .class ici) :
    java HelloWorld
    

Interlude Théorique : Les Types et les Conventions en Java

📖 Notion de cours : Types Primitifs vs Types Objets

En Java, il existe deux grandes familles de types :

  1. Les Types Primitifs (commencent par une minuscule) : int, double, boolean, char...
    • Comme en C, la variable contient directement la valeur en mémoire.
    • Ils n'ont pas de méthodes associées.
  2. Les Types Objets ou Références (commencent par une Majuscule) : String, CompteBancaire, Scanner...
    • C'est l'équivalent d'un pointeur en C. La variable contient l'adresse mémoire où se trouve l'objet (créé avec new).
    • Ils donnent accès à des méthodes (ex: titulaire.length()).

📖 Notion de cours : Les Conventions de nommage (La règle d'or)

En Java, le respect de ces conventions est primordial pour la lisibilité :

  • Les Classes commencent toujours par une Majuscule (PascalCase) : CompteBancaire, String, System.
  • Les variables et attributs commencent par une minuscule (camelCase) : titulaire, solde.
  • Les méthodes commencent par une minuscule et contiennent un verbe (camelCase) : getSolde(), deposer().

Étape 2 : De la struct à la Classe (avec BlueJ)

📖 Notion de cours : Classes, Objets et Attributs

En C, vous utilisiez des struct pour regrouper des variables. En Java, on utilise des Classes. Une Classe est le "plan de construction" ou le "moule". À partir de ce plan, on crée des Objets (ou instances). L'action de créer un objet s'appelle l'instanciation (en C : malloc, en Java : mot-clé new).

💡 Zoom sur les Attributs : Un attribut est une variable définie directement à l'intérieur d'une classe (l'équivalent d'un champ dans votre struct). La syntaxe de déclaration s'écrit comme une variable globale en C : Type nomVariable [= valeur_initiale];

💻 Exercice 2 : Création et Manipulation

Partie A : Définir le plan et tester visuellement (Interface BlueJ)

  1. Dans un nouveau projet BlueJ nommé Banque, créez une Nouvelle Classe nommée CompteBancaire. Double-cliquez dessus et effacez le code par défaut.
  2. À l'intérieur, déclarez deux attributs :
    • titulaire de type String.
    • solde de type double.
  3. Cliquez sur Compiler.
  4. Test visuel : Sur l'écran principal, faites un clic droit sur la boîte orange CompteBancaire et sélectionnez new CompteBancaire(). Un rectangle rouge apparaît : c'est votre Objet ! Double-cliquez dessus pour "l'inspecter".

Partie B : La réalité du code (Le Code Pad)

Plutôt que d'écrire une méthode main complète, nous allons utiliser le Panneau d'évaluation (Code Pad) de BlueJ pour taper du code Java exécutable instantanément.

  1. Allez dans Affichage > Afficher le panneau d'évaluation.
  2. Supprimez l'objet rouge créé précédemment (clic droit -> supprimer).
  3. Dans le Code Pad, tapez cette ligne pour instancier votre objet :
    CompteBancaire monCompte = new CompteBancaire();
    
  4. Accédez aux attributs avec la notation "pointée" pour leur donner des valeurs :
    monCompte.titulaire = "Ada Lovelace";
    monCompte.solde = 500.0;
    
  5. Affichez le résultat :
    System.out.println(monCompte.titulaire + " a " + monCompte.solde + " euros.");
    

Étape 3 : Protéger ses données - L'Encapsulation

📖 Notion de cours : Encapsulation et Accesseurs

En C, n'importe quelle partie du programme peut faire mon_compte.solde = -5000;. La POO introduit l'Encapsulation : on interdit l'accès direct aux attributs en les déclarant privés (private).

Pour interagir avec eux de façon sécurisée, on utilise des fonctions appelées Accesseurs :

  • Les Getters pour lire la donnée (ex: getSolde).
  • Les Setters pour modifier la donnée.

💻 Exercice 3 : Verrouiller et contrôler

Partie A : Le verrouillage

  1. Dans CompteBancaire, ajoutez le mot-clé private devant titulaire et solde. Compilez.
  2. Essayez de taper monCompte.solde = 1000; dans le Code Pad. L'accès est désormais refusé !

Partie B : Création des Accesseurs

  1. Ajoutez ce code dans votre classe pour créer vos méthodes d'accès :
    public String getTitulaire() { return titulaire; }
    public double getSolde() { return solde; }
    public void setTitulaire(String nouveauNom) { titulaire = nouveauNom; }
    
    (Pourquoi ne pas créer de setSolde() ? Discutez-en avec votre voisin).

Partie C : Test visuel et code

  1. Interface BlueJ : Créez un objet. Faites un clic droit sur l'objet rouge : utilisez setTitulaire depuis le menu, puis inspectez l'objet pour vérifier.
  2. Code Pad : Modifiez le nom et affichez le solde en écrivant le code :
    monCompte.setTitulaire("Alan Turing");
    System.out.println(monCompte.getSolde());
    

Étape 4 : Donner un comportement - Les Méthodes

📖 Notion de cours : Les Méthodes

Une Méthode est une fonction définie à l'intérieur de la classe.

  • En C : Vous passiez un pointeur vers la structure : deposer(&mon_compte, 50);.
  • En Java : La méthode appartient à l'objet. On l'appelle avec un point : monCompte.deposer(50);.

💻 Exercice 4 : Agir sur le compte

  1. Dans CompteBancaire, créez une méthode public void deposer(double montant). Utilisez un if pour vérifier que le montant est strictement positif avant de l'ajouter au solde.
  2. Créez une méthode public void retirer(double montant). Vérifiez que le montant est positif ET que le solde est suffisant.
  3. Test Code Pad : Écrivez les lignes pour créer un compte, déposer 100€, tenter de retirer 200€ (ce qui doit échouer), et vérifier le solde.

Étape 5 : Le niveau "Classe" - Les Méthodes Statiques

📖 Notion de cours : Le mot-clé static

Une méthode statique (static) appartient à la Classe (le plan), pas aux objets.

  • Elle n'a pas besoin d'objet pour être appelée.
  • Elle ne peut pas utiliser les attributs de l'objet (elle ne connaît ni titulaire ni solde).
  • C'est l'équivalent d'une fonction classique et indépendante en C.

💻 Exercice 5 : Outil utilitaire

  1. Dans CompteBancaire, ajoutez la méthode :
    public static double convertirEnDollars(double montantEuros)
    
    (Considérez que 1 Euro = 1.10 Dollars. Retournez le résultat).
  2. Test Interface : Ne créez PAS d'objet. Faites directement un clic droit sur la boîte orange CompteBancaire. Appelez convertirEnDollars.
  3. Test Code Pad : Puisqu'il n'y a pas d'objet, on utilise le nom de la classe. Testez :
    double enDollars = CompteBancaire.convertirEnDollars(100.0);
    System.out.println(enDollars);
    

📝 Auto-évaluation (QCM)

Testez votre compréhension avant de terminer la séance ! Cliquez sur "Voir la réponse" pour vérifier.

1. Quel mot-clé permet de créer (instancier) un objet en mémoire en Java ?

  • [ ] malloc
  • [ ] class
  • [ ] new
  • [ ] create
Voir la réponse

Réponse : new. C'est l'équivalent du malloc que vous utilisiez en C.

2. Qu'est-ce que l'encapsulation ?

  • [ ] Le fait de regrouper plusieurs classes dans un même dossier.
  • [ ] Le fait de cacher les attributs avec private et de contrôler leur accès via des méthodes publiques.
  • [ ] Le fait de transformer du code Java en Bytecode.
Voir la réponse

Réponse : Le fait de cacher les attributs avec private et de contrôler leur accès via des méthodes publiques. Cela permet de protéger l'état de l'objet contre des modifications inattendues.

3. Parmi ces types, lequel est un type Primitif (et non une référence vers un Objet) ?

  • [ ] String
  • [ ] double
  • [ ] CompteBancaire
  • [ ] Scanner
Voir la réponse

Réponse : double. Les types primitifs commencent par une minuscule en Java (comme int, boolean, char). Ils stockent directement leur valeur, contrairement aux objets qui sont manipulés via des références (l'équivalent de vos pointeurs en C).

4. Comment appelle-t-on une méthode définie avec le mot-clé static ?

  • [ ] Avec le nom de l'objet (ex: monCompte.methode())
  • [ ] Avec le nom de la classe (ex: CompteBancaire.methode())
  • [ ] Sans rien (ex: methode())
Voir la réponse

Réponse : Avec le nom de la classe (CompteBancaire.methode()). Une méthode statique appartient à la classe et ne nécessite pas l'instanciation d'un objet pour être utilisée.


🛠️ ANNEXE : Aide-mémoire C vers Java

Concept En langage C En langage Java Remarques
Point d'entrée int main(int argc, char *argv[]) { ... } public static void main(String[] args) { ... } En Java, le main doit obligatoirement être dans une class.
Affichage printf("Solde : %f\n", solde); System.out.println("Solde : " + solde); On utilise le + pour concaténer.
Structures / Classes struct Compte { double solde; }; class Compte { double solde; } En Java, la classe contient aussi les méthodes.
Allocation Mémoire Compte* c = malloc(sizeof(Compte)); Compte c = new Compte(); Le mot-clé new alloue la mémoire.
Pointeurs c->solde = 50; c.solde = 50; Java utilise toujours un point ..
Pointeur nul NULL null Indique qu'une référence ne pointe vers rien.
Libération free(c); (Automatique) Le "Garbage Collector" libère la mémoire tout seul.
Tableaux int tab[5]; int[] tab = new int[5]; Un tableau est un Objet en Java.
Taille d'un tableau sizeof(tab) / sizeof(int) tab.length La taille est un attribut intégré.
Chaînes (String) strcmp(nom1, nom2) == 0 nom1.equals(nom2) On ne compare JAMAIS deux String avec == en Java.

Sujet rédigé à l'aide de Gemini (pas par Gemini)