Création d'une classe en Java

Création d’une classe en Java #

Créer une classe en Java, c’est définir un nouveau type d’objet qui regroupe à la fois des données (appelées attributs ou champs) et des comportements (appelés méthodes). Cette approche permet de modéliser des entités du monde réel ou conceptuel de façon structurée et réutilisable. Une classe sert de « plan » pour fabriquer des objets : chaque objet créé à partir d’une classe possède ses propres valeurs pour les attributs, mais partage les mêmes méthodes. La programmation orientée objet favorise ainsi la modularité, la clarté et la maintenance du code, car chaque classe peut être développée, testée et améliorée indépendamment des autres.

Un premier programme #

En Java, toutes parties d'un programme informatique doit donc être encapsulée dans une classe. Pour ce faire, il est donc nécessaire de créer un premier fichier de code source qui décrira une première classe et contiendra la description de la méthode "main", la méthode de démarrage (appelé parfois "bootstrap") du programme. Il est possible tout simplement d'utiliser le Bloc-Note avec Windows ou un autre éditeur de texte brut (ce n'est pas le cas de Microsoft Word!), d'écrire les lignes de code nécessaire à la création de la classe et de ses fonctions et d'enregistrer ce texte sous l'extension .java (dans l'exemple ci-dessous dans un fichier Main.java). Voici un exemple d'une première classe qui imprimera dans l'invite de commande un texte de bienvenue.

Bienvenue.java

Vous devez choisir comment vous allez exécuter ce programme. Vous pouvez le faire sans IDE (avec Bloc-Note et un accès en ligne de commande), en ligne, avec IntelliJ IDEA, avec Netbeans. Vous pouvez même faire des expériences avec plus d'une approche et ne retenir que celle qui vous convient le mieux.

Nous reviendrons dans le cours sur les éléments de programmation nécessaires pour comprendre ce programme. Néanmoins, en voici l'essentiel:

  1. Les parties de code situées entre /* et */ sont des commentaires qui ne seront pas compilés.
  2. La première instruction public class Bienvenue indique que nous créons une classe publique (accessible à toutes autres parties du programme) qui se nomme Bienvenue. Cette classe doit être enregistrée dans un fichier portant le même nom et la même extension .java. Attention, Java différencie les majuscules et les minuscules. La classe Bienvenue est différente de la classe bienvenue, et le fichier bienvenue.java n'est pas l'équivalent du fichier Bienvenue.java. Important : La norme de programmation en Java est de toujours commencer un nom de classe par une majuscule. S'il y a plusieurs mots dans le nom de la classe, utiliser une majuscule au début de chaque mot. Par exemple, TexteBrute ou Encrypteur32Bits.
  3. La classe Bienvenue doit être définie dans un fichier appelé Bienvenue.java. Le nom et l'emplacement des fichiers est important en Java.
  4. Java étant un langage orienté objet, tout fichier source définit une classe, c'est-à-dire un objet possédant des champs et des méthodes. La définition de la classe se fait dans un bloc d'instructions contenu entre des accolades ouvrantes { et fermantes }. C'est ce que l'on appelle la portée.
  5. Notre classe Bienvenue contient une unique méthode annoncée par l'instruction public static void main (String args[]). Il s'agit de la méthode principale d'un programme, celle qui sera exécutée lors du lancement par la machine virtuelle Java (JVM). Le nom et la déclaration de cette méthode ne peuvent pas être modifiés. Par exemple, la fonction "public static void main (int x)" ne sera pas interprétée comme la méthode principale de démarrage.
  6. Pour définir une méthode, il faut donner une suite d'instructions situées entre deux nouvelles accolades. Dans le cas qui nous intéresse, la méthode "main" ne comporte qu'une seule instruction qui provoque l'affichage du message «Bienvenue au sein du cours INF 1220!», à savoir la méthode System.out.println. Les lignes contenant une instruction simple comme celle-ci doivent se terminer par un point-virgule.

Important: Le code en Java est généralement organisé en « classes ». En Java, une classe doit être déclarée et définie dans un fichier qui porte son nom. Ainsi, si votre classe s’appelle “MonChat”, vous devez l’enregistrer dans un fichier nommé MonChat.java.

Création d’une classe sans IDE #

Créez un fichier au format texte nommé Bienvenue.java et contenant le code suggéré. Le fichier source étant créé et enregistré, nous pouvons passer aux phases de compilation et d'exécution.

Si vous utilisez Windows, vous pouvez suivre cette vidéo :

Compilation #

Le compilateur Java est le programme javac.exe (ou simplement javac sous OSX et Linux) contenu dans le dossier bin du JDK. Pour compiler Bienvenue.java, il faut :

  1. ouvrir une invite de commande (sous windows) ou bien Terminal (macos et Linux);
  2. se déplacer dans le dossier de travail dans la console en utilisant la commande cd qui permet de changer de répertoire (ex. "cd /INF1220");
  3. exécuter la commande "javac Bienvenue.java";

Si tout s'est bien passé (c'est à dire qu'il n'y a pas eu d'erreur de compilation), vous obtiendrez dans le même dossier le nouveau fichier Bienvenue.class, qui est le résultat de la compilation. C'est le fichier intermédiaire qui contient le Bytecode et qui sera interprété par la JVM

Malheureusement, plusieurs erreurs peuvent survenir. Voici quelques causes d'erreurs possibles.

  • Votre environnement ne trouve pas le programme javac.exe. Il faut indiquer le chemin d'accès à ce programme. Pour éviter d'avoir à réécrire à chaque fois le chemin d'accès à javac et aux autres programmes du SDK, il est conseillé d'ajouter ce chemin dans le PATH en complétant le fichier autoexec.bat.
  • javac.exe s'exécute, mais ne trouve pas bienvenue.java. Le dossier actif de votre console/invite de commande n'est pas celui qui contient Bienvenue.java. Allez dans le bon dossier.
  • javac.exe s'exécute et trouve bienvenue.java, mais écrit un message d'erreur. Il s'agit en général d'une erreur dans le fichier source. Le message d'erreur vous donne une indication sur la nature de l'erreur et sur la ligne où elle s'est produite. Essayez de comprendre. Dans la plupart des cas, il s'agit : (i) d'un point-virgule oublié à la fin d'une instruction simple; (ii) d'une faute de syntaxe; (iii) d'une confusion majuscule/minuscule; (iv) d'une accolade fermante oubliée. Il vous faut alors corriger l'erreur dans le fichier Bienvenue.java et recommencer la compilation.

Prenez bien note des points suivants:

  1. Les programmes Java sont écrits dans des fichiers au format texte ayant l'extension «.java». Le nom du fichier (par exemple Bienvenue.java) doit correspondre au code: un fichier Java comporte généralement une déclaration « public class » qui détermine le nom du fichier. Ainsi donc si votre code Java contient la déclaration « public class Bienvenue » alors le fichier doit être nommé Bienvenue.java. La plupart des fichiers en Java ne contiennent qu'une seule « classe ».
  2. Un programme Java exécutable doit contenir une méthode nommée « main ». Tous les fichiers Java n'ont pas une méthode « main », mais ceux qui en contiennent une peuvent souvent être exécutés.
  3. Beaucoup des exemples dans le cours peuvent être recopiés et exécutés, mais vous devez choisir le bon nom de fichier (correspondant à la classe). Si vous modifiez du code, même très légèrement, et qu'il ne fonctionne plus, revenez en arrière. Il faut avoir beaucoup de rigueur pour programmer, vous ne pouvez pas juste modifier du code en suivant votre instinct et espérer que tout fonctionne. Vous devez apprendre et comprendre avant de pouvoir modifier du code.
  4. Vous ne devez en aucun cas copier du code au sein d'autre code en espérant que tout fonctionne. Le copier-coller sans comprendre ce que l'on fait ne fonctionnera pas. Pour commencer, ne changez absolument rien, rien, au code. Copiez le code à l'identique, caractère par caractère.Tout doit être identique. Le nom de fichier, le nom de la classe, le nom des méthodes, etc.

Exécution #

Après la réussite de la compilation et la création du fichier Bienvenue.class, il faut l'exécuter avec l'interpréteur (la JVM) java.exe (java sous OSX et Linux). À partir de la console/invite de commande, il suffit d'exécuter la commande "java Bienvenue". Si tout se passe bien, on voit apparaître le message prévu : Bienvenue au cours INF 1220! Sinon, il y a sans doute un problème de répertoire actif ou de chemin d'accès à java.exe

Vidéo suggérée #

Création d’une classe avec IntelliJ IDEA, sa compilation et son exécution #

Si vous avez installé l'IDE IntelliJ IDEA lors de l'activité précédente, vous pouvez maintenant l'utiliser pour écrire et exécuter du code Java.

Après avoir lancé IntelliJ IDEA, suivez les consignes suivantes:

  1. Choisissez "Create New Project".
  2. Choisissez "Java" et cliquez sur "Next".
  3. Choisissez "Create project from template", puis "Command Line App" et cliquez sur "Next".
  4. Choisissez un nom pour votre project ou utilisez le nom par défaut, puis cliquez sur "Next".
  5. Vous trouverez alors un bout de code. Tapez System.out.println("Allo"); en plein milieu du code, remplaçant la ligne qui débute par //, entre les deux accolades.
  6. Allez dans le menu "Run" et choisissez "Run Main".
  7. Une console devrait s'ouvrir et vous devriez y voir le texte "Allo".

L'IDE IntelliJ permet, comme les autres IDE, l'ajout de nouvelles classes à un projet.

Tout comme les autres IDE, IntelliJ est difficile d'utilisation pour les débutants. Il expose le débutant à un environnement inutilement complexe. Néanmoins, plusieurs étudiants insistent pour utiliser des IDE. Nous donnons ici la base, mais si vous souhaitez prendre cette approche, vous devrez apprendre à vous retrouver dans un environnement complexe qui n'est pas destiné aux débutants. Nous vous rappelons que nous n'offrons pas de soutien technique. Si vous avez du mal avec IntelliJ, c'est votre responsabilité de trouver l'information pertinente. L'utilisation IntelliJ est purement optionnelle.

Vidéo suggérée #

(YouTube offre des sous-titres en français.)

L'approche est essentiellement la même pour les autres IDE comme Eclipse et NetBeans. On créé un projet, on écrit son code, et on exécute. Tous les IDE peuvent vous aider à identifier vos erreurs de syntaxe.

Création d’une classe avec NetBeans, sa compilation et son exécution #

Si vous avez installé l'IDE Netbeans lors de l'activité précédente, il est maintenant le temps d'utiliser cet outil de développement très utile, permettant d'accélérer et de simplifier les étapes dans le développement d'une application. Voici les étapes pour réaliser l'équivalent de l'activité précédente.

  1. Pour créer un projet aller dans "File" (ou Fichier) et sélectionner "New Project" (Nouveau projet).
  2. Choisir dans la fenêtre de type "Wizard", un projet de type Java (liste de gauche) et Java Application (liste de droite). Appuyer sur "Next" (Suivant).
  3. Entre le nom du projet, par exemple "Exercice1" et assurer vous que la case "Create Main Class" soit cochée. Ceci va créer automatiquement une classe "Exercice1" avec une méthode "main". Appuyer sur "Finish" (Terminer).
  4. Une fois le projet crée, celui-ci apparaît dans la liste des projets à gauche. Vous pouvez avoir plusieurs projets à la fois et naviguez entre les classes de ces projets via l'arborescence. La classe "Exercice1", qui a été auto-générée, apparaît dans la partie droite de la fenêtre de l'IDE.
  5. Copier la ligne "System.out.println("Bienvenue au sein du cours INF1220 !");" et l'ajouter dans la portée de la fonction main. Enregistrer le fichier (via le menu) suite à la modification.
  6. Nous allons maintenant compiler et exécuter cette classe et cette fonction main. Pour ce faire, faite un clique droit sur le fichier "Exercice1.java" dans le fenêtre de gauche et choisir l'option "Run File". L'IDE Netbeans va alors vérifier si le fichier a été modifié. Si c'est le cas (nous avons ajouté une ligne ...), il va compiler la classe (via javac), puis exécuter celle-ci automatique (via java). Le résultat de l'affichage à la console de l'opération System.out.println("Bienvenue au sein du cours INF1220 !"), apparaît dans la fenêtre de console au bas de l'IDE.
  7. Vous pouvez également vous créer une seconde classe dans le projet en utilisant l'option du menu "File>New File". Choisir dans le fenêtre de type "Wizard", un fichier de catégorie Java et de type "Java Class". Appuyer sur "Next".
  8. Choisir un nom de classe (différent de Exercice1), par exemple "AutreClasse", puis appuyer sur terminer. Vous pouvez dans la nouvelle classe recopier la fonction main de "Exercice1", puis compiler et exécuter celle-ci.

Tout comme IntelliJ, l'utilisation de NetBeans est optionnelle. Ce n'est pas un environnement destiné aux débutants. Si vous choisissez d'utiliser NetBeans, c'est à vous de faire le travail d'assimilation nécessaire.

Vidéo suggérée #

Compiler et exécuter un petit jeu #

Pour vérifier votre maîtrise de votre environnement, suivez les étapes suivantes.

  • Crééez un nouveau fichier nommé Pong.java.
  • Copiez dans le fichier le code suivant (comprenant la ligne public class Pong ...).
  • Compilez le code.
  • Exécutez le code. Vous devriez voir apparaître un petit jeu de pong sur votre ordinateur.

Jeu Pong

Dans une console, vous pouvez obtenir le résultat souhaité avec ces commandes:

  • javac Pong.java
  • java Pong.

Puisque le programme ne comporte qu’une seule classe, vous pouvez aussi omettre la compilation et l’exécutez avec la commande.

  • java Pong.java

Dans un tel scénario, le programme est compilé et exécuté dans une seule opération.

Voici le code à utiliser. À ce point-ci dans le cours, il est normal de ne pas comprendre le contenu du programme. Le programme doit être exécuté sur un ordinateur avec un système d’exploitation comme Windows, macOS ou Linux. Vous ne pouvez pas exécuter le programme en ligne ou sur un serveur distant.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Pong extends JPanel implements ActionListener, KeyListener {
    private Timer timer;
    private int ballX = 200, ballY = 200;
    private int ballVelX = 3, ballVelY = 3;
    private int paddle1Y = 150, paddle2Y = 150;
    private int paddleSpeed = 5;
    private int player1Score = 0, player2Score = 0;
    private final int PADDLE_HEIGHT = 80;
    private final int PADDLE_WIDTH = 15;
    private final int BALL_SIZE = 15;
    private final int AI_PADDLE_HEIGHT = 60;
    private boolean upPressed = false, downPressed = false;

    public Pong() {
        setPreferredSize(new Dimension(600, 400));
        setBackground(Color.BLACK);
        setFocusable(true);
        addKeyListener(this);
        timer = new Timer(10, this);
        timer.start();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.WHITE);
        g.fillRect(20, paddle1Y, PADDLE_WIDTH, PADDLE_HEIGHT);
        g.fillRect(565, paddle2Y, PADDLE_WIDTH, AI_PADDLE_HEIGHT);
        g.fillOval(ballX, ballY, BALL_SIZE, BALL_SIZE);
        g.setColor(Color.GRAY);
        for (int i = 0; i < getHeight(); i += 20) {
            g.fillRect(300, i, 2, 10);
        }
        g.setColor(Color.WHITE);
        g.setFont(new Font("Arial", Font.BOLD, 40));
        g.drawString(String.valueOf(player1Score), 220, 50);
        g.drawString(String.valueOf(player2Score), 360, 50);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (upPressed && paddle1Y > 0) paddle1Y -= paddleSpeed;
        if (downPressed && paddle1Y < getHeight() - PADDLE_HEIGHT) paddle1Y += paddleSpeed;
        if (ballVelX > 0) {
            if (paddle2Y + AI_PADDLE_HEIGHT / 2 < ballY && paddle2Y < getHeight() - AI_PADDLE_HEIGHT) paddle2Y += 3;
            else if (paddle2Y + AI_PADDLE_HEIGHT / 2 > ballY && paddle2Y > 0) paddle2Y -= 3;
        }
        ballX += ballVelX;
        ballY += ballVelY;
        if (ballY <= 0 || ballY >= getHeight() - BALL_SIZE) {
            ballVelY = -ballVelY;
        }
        if (ballX <= 35 && ballX >= 20 && ballY >= paddle1Y - BALL_SIZE && ballY <= paddle1Y + PADDLE_HEIGHT) {
            if (ballVelX < 0) ballVelX = -ballVelX;
            ballVelX++;
        }
        if (ballX >= 550 && ballX <= 565 && ballY >= paddle2Y - BALL_SIZE && ballY <= paddle2Y + AI_PADDLE_HEIGHT) {
            if (ballVelX > 0) ballVelX = -ballVelX;
            ballVelX--;
        }
        if (ballX < 0) {
            player2Score++;
            resetBall();
        }
        if (ballX > getWidth()) {
            player1Score++;
            resetBall();
        }
        repaint();
    }

    private void resetBall() {
        ballX = getWidth() / 2 - BALL_SIZE / 2;
        ballY = getHeight() / 2 - BALL_SIZE / 2;
        ballVelX = (Math.random() > 0.5 ? 3 : -3);
        ballVelY = (Math.random() > 0.5 ? 3 : -3);
    }

    @Override
    public void keyPressed(KeyEvent e) {
        switch (e.getKeyCode()) {
            case KeyEvent.VK_UP -> upPressed = true;
            case KeyEvent.VK_DOWN -> downPressed = true;
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        switch (e.getKeyCode()) {
            case KeyEvent.VK_UP -> upPressed = false;
            case KeyEvent.VK_DOWN -> downPressed = false;
        }
    }

    @Override public void keyTyped(KeyEvent e) {}

    public static void main(String[] args) {
        JFrame frame = new JFrame("Pong");
        Pong game = new Pong();
        frame.add(game);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

Lecture optionnelle dans le livre de référence (Delannoy) (optionnel) #

Vous pouvez lire dans Programmer en Java de Claude Delannoy, le premier chapitre. Le manuel de Delannoy est à son mieux comme manuel de référence. On vous invite à faire les lectures à et garder le manuel avec vous lors que vous étudiez si vous en avez fait l'acquisition. Le manuel de Delannoy n'est pas obligatoire.

Vidéos suggérées #