Introduction au langage Java

Université de Toulon

LIS UMR CNRS 7020

2024-12-05

Source
Branch
  • develop (e3d3004)
  • 2024/09/23 13:53:54
Java
  • OpenJDK Temurin-21.0.5+11
  • Apache Maven 3.9.9
Docker
  • Client: 27.3.1 - buildx v0.18.0 - compose v2.30.3
  • Server: 27.3.1

La modélisation objet

  • Origines : Issue des problèmes de simulation dans les années 1960.
  • Utilisation :
    • En modélisation (UML).
    • En programmation (Smalltalk, C++, Java, etc.).
    • En bases de données (SGBDOO : presque disparus et SGBDRO).
  • Concept majeur : L’encapsulation.
  • Communication entre objets : Un objet communique avec un autre via un ensemble de messages prédéfinis, sans connaître leur implantation interne.
  • Regroupement en classe : Les objets peuvent être regroupés en classe.
  • Autres concepts ajoutés : Composition, délégation, héritage, etc.
  • Deux points de vue sur un objet :
    • Structurel : Instance d’un type (une classe) masquant une structure derrière des opérations.
    • Conceptuel : Correspond à une entité du monde réel, généralisable ou spécialisée.

Les objets

Définition 1 (Objet) Représente une entité avec une identité, un état (attributs) et un comportement (méthodes).

  • Comportement (Méthodes) : Réagir aux messages selon son état interne, pouvant le modifier.

  • État Interne (Attributs) : Noms et valeurs décrivant l’état.

  • Encapsulation : Cache l’état interne et fournit des méthodes pour y accéder, améliorant la sécurité et l’évolutivité.

  • Avantages

    • Sécurité : Protéger les données internes.
    • Évolutivité : Modifier l’implémentation interne sans affecter le code externe.
  • Inconvénients

    • Performance : L’encapsulation peut entraîner une légère surcharge.

Les messages

  • Méthodes d’un Objet :
    • Un objet possède un ensemble de méthodes, qui peuvent être publiques ou privées.
  • Interface Publique :
    • L’ensemble des méthodes publiques constitue l’interface de l’objet, représentant les messages qu’il peut recevoir et traiter.
  • Exemples de Méthodes :
    •   unePersonne.saluer();          // Méthode pour saluer
        unePersonne.donnerPrénom("Pierre"); // Méthode pour attribuer un prénom
        unePersonne.afficherPrénom();  // Méthode pour afficher le prénom
        unePersonne.retournerPrénom(); // Méthode pour retourner le prénom

Les classes - Définition

  • Similarités entre Objets :
    • Certains objets possèdent des propriétés très proches, voire identiques.
    • Exemple : Les propriétés des voitures dans un programme ou, de manière plus générale, les propriétés communes entre différents véhicules.
  • Notion de Classe :
    • Une classe est un ensemble d’objets présentant des similitudes en termes d’identification, de comportement, ou de description de l’état dans une application.
    • On appelle instance d’une classe un objet qui appartient à cette classe.
  • Exemples :
    • Classe Voiture :
      • Attributs : marque, modèle, année, couleur.
      • Méthodes : démarrer(), arrêter(), accélérer().
    • Instances de la Classe Voiture :
      • voiture1 : marque=“Toyota”, modèle=“Corolla”, année=2020, couleur=“Rouge”.
      • voiture2 : marque=“Honda”, modèle=“Civic”, année=2018, couleur=“Bleue”.

Concept de Classe dans les langages de programmation

  • UML :
    • Langage unifié utilisé pour modéliser des entités du monde réel ou des concepts abstraits.
    • Définit les propriétés (attributs) et comportements (méthodes) des objets.
    • Permet de représenter la structure et les relations entre les classes à l’aide de diagrammes.
  • Java :
    • Langage orienté objet mettant l’accent sur l’encapsulation, l’héritage et le polymorphisme.
    • Structure fondamentale pour organiser le code en modules réutilisables.
    • Contrôle strictement l’accès aux données via les classes.
  • Python :
    • Utilise des classes pour créer des objets de manière flexible et dynamique.
    • Supporte l’héritage multiple, le polymorphisme et la surcharge d’opérateurs.
    • Méthodes spéciales permettant une personnalisation avancée du comportement des objets.
  • JavaScript et TypeScript :
    • Partagent le concept de classes introduit avec ECMAScript 6 (ES6).
    • JavaScript simplifie la syntaxe de création d’objets avec class, basée sur des prototypes.
    • TypeScript étend JavaScript avec un typage statique pour des fonctionnalités de vérification de types.

UML

Figure 1: Les Voiture en UML

Java

public class Voiture {
    private String marque;
    private String modele;
    private int annee;
    private String couleur;
    private static int nombreDeVoitures = 0;

    public Voiture(String marque, String modele, int annee, String couleur) {
        this.marque = marque;
        this.modele = modele;
        this.annee = annee;
        this.couleur = couleur;
        nombreDeVoitures++;
    }

    public void demarrer() {
        System.out.println(marque + " " + modele + " démarre.");
    }

    public void arreter() {
        System.out.println(marque + " " + modele + " s'arrête.");
    }

    public void accelerer(int vitesse) {
        System.out.println(marque + " " + modele + " accélère à " + vitesse + " km/h.");
    }

    public static int getNombreDeVoitures() {
        return nombreDeVoitures;
    }
}

Python

class Voiture:
    nombre_de_voitures = 0

    def __init__(self, marque, modele, annee, couleur):
        self.marque = marque
        self.modele = modele
        self.annee = annee
        self.couleur = couleur
        Voiture.nombre_de_voitures += 1

    def demarrer(self):
        print(f"{self.marque} {self.modele} démarre.")

    def arreter(self):
        print(f"{self.marque} {self.modele} s'arrête.")

    def accelerer(self, vitesse):
        print(f"{self.marque} {self.modele} accélère à {vitesse} km/h.")

    @classmethod
    def get_nombre_de_voitures(cls):
        return cls.nombre_de_voitures

Kotlin

class Voiture(
    private val marque: String,
    private val modele: String,
    private val annee: Int,
    private val couleur: String
) {
    companion object {
        var nombreDeVoitures: Int = 0
            private set
    }

    init {
        nombreDeVoitures++
    }

    fun demarrer() {
        println("$marque $modele démarre.")
    }

    fun arreter() {
        println("$marque $modele s'arrête.")
    }

    fun accelerer(vitesse: Int) {
        println("$marque $modele accélère à $vitesse km/h.")
    }
}

Typescript

class Voiture {
    private static nombreDeVoitures: number = 0;

    constructor(
        private marque: string,
        private modele: string,
        private annee: number,
        private couleur: string
    ) {
        Voiture.nombreDeVoitures++;
    }

    public demarrer(): void {
        console.log(`${this.marque} ${this.modele} démarre.`);
    }

    public arreter(): void {
        console.log(`${this.marque} ${this.modele} s'arrête.`);
    }

    public accelerer(vitesse: number): void {
        console.log(`${this.marque} ${this.modele} accélère à ${vitesse} km/h.`);
    }

    public static getNombreDeVoitures(): number {
        return Voiture.nombreDeVoitures;
    }
}

Javascript

// Constructeur Voiture
function Voiture(marque, modele, annee, couleur) {
    this.marque = marque;
    this.modele = modele;
    this.annee = annee;
    this.couleur = couleur;
    Voiture.nombreDeVoitures++;
}

// Propriété statique pour compter le nombre de voitures
Voiture.nombreDeVoitures = 0;

// Méthodes de la classe Voiture
Voiture.prototype.demarrer = function() {
    console.log(this.marque + " " + this.modele + " démarre.");
};

Voiture.prototype.arreter = function() {
    console.log(this.marque + " " + this.modele + " s'arrête.");
};

Voiture.prototype.accelerer = function(vitesse) {
    console.log(this.marque + " " + this.modele + " accélère à " + vitesse + " km/h.");
};

// Méthode statique pour obtenir le nombre de voitures
Voiture.getNombreDeVoitures = function() {
    return Voiture.nombreDeVoitures;
};

Les classes - Utilisation

  • Description des Propriétés des Instances :
    • Une classe décrit les propriétés de ses instances en définissant leurs variables d’état et leurs méthodes.
  • Instanciation de Nouveaux Objets :
    • Une classe permet de créer de nouveaux objets via des constructeurs.
  • Partage d’Informations :
    • Une classe facilite le partage d’informations entre objets et la gestion des instances.
      • Pour ce faire, des propriétés peuvent être associées aux classes elles-mêmes, plutôt qu’aux objets individuels.

Origines et Motivations de la Création du Langage Java

  • Origines :
    • Créé par James Gosling et son équipe chez Sun Microsystems dans les années 1990.
    • Projet “Green” pour les appareils électroménagers intelligents.
  • Motivations :
    • Portabilité maximale grâce à la machine virtuelle Java (JVM).
    • Sécurité renforcée et robustesse des applications.
    • Simplification du développement par rapport à C++.
  • Évolution :
    • Lancé officiellement en 1995.
    • Acquis par Oracle en 2010, continué sous leur direction.
    • Licence open source pour le code source, avec des binaires sous licence propriétaire.
  • Distributions de Binaires Libres :
    • Exemple : Temurin (AdoptOpenJDK), une alternative populaire open source.

Les caractéristiques de Java

  • Orienté objet : Encourage la modélisation des problèmes sous forme d’objets.

  • Portable : Grâce à la JVM, permet de “Compiler une fois, exécuter partout”.

  • Sécurité : Typage fort et mécanismes de vérification préventifs.

  • Multi-Tâche : Supporte la programmation multi-thread pour l’exécution concurrente.

  • Dynamique : Permet le chargement des classes pendant l’exécution.

  • Complet : Bibliothèque riche d’API pour le développement d’applications (IHM, réseau, bases de données, etc.).

  • Interprété mais compilé : Compilation en bytecode portable et interprétation par la JVM avec optimisations JIT. Intégration de l’AOT et optimisation JIT pour améliorer les performances.

Du code source à l’exécution

  • Compilation :
    • À partir du code source (fichiers .java) avec le compilateur (commande javac).
    • Création de bytecode Java (fichiers .class), un pseudo-code compréhensible par la JVM.
  • Bytecode Java :
    • Code assembleur Java, composé d’une suite d’instructions pour la machine virtuelle Java.
  • Machine Virtuelle :
    • JVM : Java Virtual Machine.
    • Implémentation de la JVM pour différents systèmes (Windows, Unix, MacOS, etc.).
  • Interprétation et Optimisation du Code :
    • La JVM interprète le bytecode Java pour l’exécuter.
    • Oracle fournit une implantation de référence et des optimisations JIT (Just-In-Time) pour améliorer les performances.

documentation Java SE.

Code source et bytecode

/**
* Cette application Java affiche simplement 
* Bonjour à tous !”
* sur la sortie standard.
*/
class BonjourATous {
  public static void main ( String [ ] args ) {
    System.out.println("Bonjour a tous !");
  }
}

La classe peut être compilée: javac BonjourATous.java

puis exécutée:java BonjourATous

Bonjour a tous !

il est aussi possible de consulter le bytecode: javap -c BonjourATous.class

Compiled from "BonjourATous.java"
class BonjourATous {
  BonjourATous();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #13                 // String Bonjour a tous !
       5: invokevirtual #15                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}

Implantation et Versions

  • Implantation de Référence : Fournie par Oracle, consultez la documentation Java SE.

  • Java Development Kit (JDK) : Utilisé pour le développement et l’exécution des programmes Java.

  • Java Runtime Environment (JRE) : Utilisé uniquement pour l’exécution des programmes Java.

  • Gestion des Versions :

    • Java évolue avec l’apparition de nouvelles fonctionnalités et la disparition de certaines marquées comme obsolètes (deprecated).
    • https://www.java.com/releases/
    • Consultez le roadmap de support Oracle pour les détails sur les versions à long terme (LTS) :
      • Java 8 (mars 2014, support illimité)
      • Java 11 (septembre 2018, support jusqu’en 2024)
      • Java 17 (septembre 2021, support jusqu’en 2027)
      • Java 21 (septembre 2023, support jusqu’en 2028)
      • Java 25 (septembre 2025, support jusqu’en 2030)
    • Non LTS: Java 22 (mars 2024) puis Java 23 (septembre 2024)

Environnement de Développement Java

  • Prérequis :
    • Au minimum, nécessitez un JDK (Java Development Kit) et un éditeur de texte.
  • Outils de Gestion de Projet :
    • Utilisez des outils comme Maven ou Gradle pour la gestion des dépendances et la construction de projets.
  • Environnement de Développement Intégré (IDE) :
    • Les IDE offrent une assistance complète au développement avec des fonctionnalités telles que la navigation dans les sources, la saisie assistée, et le débogage.
    • Choisissez parmi plusieurs solutions :
      • Eclipse, un projet open source supporté par IBM, offre une suite complète d’outils (http://www.eclipse.org).
      • IntelliJ IDEA de JetBrains, disponible en versions communautaire et commerciale, est réputé pour son éditeur performant (https://www.jetbrains.com/idea).
      • Pour une expérience légère mais puissante, Visual Studio Code propose des extensions pour le développement Java (https://code.visualstudio.com/docs/languages/java).

Java en résumé

  • Avantages
    • Portabilité : Le bytecode Java est exécutable sur n’importe quelle JVM, assurant une grande portabilité des applications.
    • Sécurité : Java est conçu avec des mécanismes de sécurité intégrés, renforcés par les vérifications effectuées par la JVM lors de l’exécution.
    • Richesse des Bibliothèques : Java offre une vaste collection de bibliothèques standard, facilitant le développement d’applications variées et complexes.
  • Inconvénients
    • Performance : L’interprétation du bytecode et les vérifications effectuées par la JVM peuvent entraîner des ralentissements lors de l’exécution des programmes Java.
      • Les JVM, comme HotSpot, intègrent des techniques d’optimisation à la volée pour améliorer les performances, mais elles peuvent ne pas suffire dans les cas où la vitesse est critique.
      • Pour des performances maximales, les développeurs peuvent choisir des langages comme C ou C++.
      • L’intégration de code natif en Java est possible mais au prix de la portabilité de l’application.