Programmation Orientée Objet avec Java PDF

Summary

Ce document est un cours de programmation orientée objet (POO) avec Java. Il introduit les concepts de base de la POO, la syntaxe de base du langage Java, et la compilation et exécution d'un programme simple. Il couvre également les classes, les objets, les constructeurs et les méthodes. Le document aborde ensuite l'encapsulation, l'héritage et le polymorphisme. Le cours est structuré en chapitres et inclut des exemples et des exercices pratiques pour chaque concept.

Full Transcript

Programmation Orientée Objet avec Java Tapamo Kenfack Tapamo Kenfack POO avec Java Table des matières Chapitre 1 Introduction à la Programm...

Programmation Orientée Objet avec Java Tapamo Kenfack Tapamo Kenfack POO avec Java Table des matières Chapitre 1 Introduction à la Programmation Orientée Objet Page 4 1.1 Présentation du cours et des objectifs 4 Introduction de l’enseignant et des étudiants — 4 Aperçu des objectifs du cours — 4 Méthodologie et évaluations — 4 1.2 Concepts de base de la POO : objets, classes, attributs, méthodes 5 Définition de la POO — 5 Comparaison entre la POO et la programmation procédurale — 6 Exemples d’objets du monde réel et leur modélisation en classes — 6 1.3 Installation et configuration de l’environnement de développement Java (JDK, IDE) 8 Téléchargement et installation du JDK — 8 Choix et installation d’un IDE (Eclipse, IntelliJ IDEA, NetBeans) — 8 Configuration de l’environnement de développement — 8 Chapitre 2 Premiers Pas avec Java Page 9 2.1 Syntaxe de base de Java 9 Structure d’un programme Java — 9 Méthode main() : point d’entrée d’un programme Java — 9 Instructions de base : déclarations, affectations, instructions de contrôle (if, switch) — 10 2.2 Structure d’un programme Java 12 Types de données de base (int, float, double, char, boolean) — 12 Variables et constantes — 13 Saisie au clavier — 13 2.3 Compilation et exécution d’un programme Java simple 14 Utilisation du compilateur javac — 14 Exécution de programmes avec java — 14 Exercices pratiques : écrire, compiler et exécuter un programme simple — 14 Chapitre 3 Classes et Objets Page 15 3.1 Définition et instanciation de classes et d’objets 15 Définition d’une classe et création d’objets — 15 Mots-clé new — 16 3.2 Constructeurs 16 Définition et utilisation de constructeurs — 16 Surcharge de constructeurs — 17 3.3 Mots-clés this et static 17 Chapitre 4 Encapsulation Page 19 4.1 Modificateurs d’accès (private, public, protected) 19 Rôle des modificateurs d’accès — 19 Exemples et bonnes pratiques — 19 4.2 Accesseurs et mutateurs (getters et setters) 20 Définition et utilisation de getters et setters — 20 Bonnes pratiques — 21 4.3 Bonnes pratiques d’encapsulation 21 Principes de conception — 21 Cas pratiques et exercices — 21 UCB 2024 1 Tapamo Kenfack POO avec Java Chapitre 5 Héritage Page 22 5.1 Concepts d’héritage 22 Introduction à l’héritage — 22 Le mécanisme d’héritage — 22 Avantages de l’héritage en POO — 24 Héritage et constructeurs — 24 Rédéfinition des méthodes — 24 Le transtypage — 24 Le polymorphisme — 25 5.2 Exemple 25 Description — 25 Création de la classe fille — 26 Création de la classe parent — 26 Construction d’un objet enseignant — 27 Surcharge d’une méthode — 27 Chapitre 6 Polymorphisme Page 29 6.1 Polymorphisme à travers l’héritage 29 Définition du polymorphisme — 29 Utilisation du polymorphisme dans des classes dérivées — 29 6.2 Redéfinition des méthodes (override) 29 Surcharge et redéfinition de méthodes — 29 Utilisation de l’annotation @Override — 29 6.3 Utilisation des classes abstraites et des interfaces 29 Introduction aux classes abstraites et interfaces — 29 Différences entre les deux — 29 Chapitre 7 Interfaces et Classes Abstraites Page 30 7.1 Différences entre interfaces et classes abstraites 30 7.2 Implémentation d’interfaces 30 7.3 Création et utilisation de classes abstraites 30 Chapitre 8 Gestion des Exceptions Page 31 8.1 Concepts de base des exceptions 31 8.2 Try, catch, finally 31 La classe Throwable — 33 Utilisation de finally — 33 8.3 Création de vos propres exceptions 33 Définition de classes d’exception personnalisées — 33 Utilisation des exceptions personnalisées dans les programmes — 33 Chapitre 9 Collections et Génériques Page 34 9.1 Introduction aux collections (List, Set, Map) 34 Présentation des principales interfaces de la collection framework — 34 Exemples d’utilisation — 34 9.2 Utilisation des collections Java 34 Manipulation des listes, ensembles et maps — 34 Méthodes courantes des collections — 34 9.3 Concepts de base des génériques 34 Introduction aux génériques — 34 Utilisation des génériques dans les collections — 34 Chapitre 10 Fichiers et Flux Page 35 10.1 Lecture et écriture de fichiers 35 Classes File, FileReader, FileWriter — 35 Exemples pratiques de lecture et d’écriture — 35 10.2 Utilisation des classes de flux (InputStream, OutputStream) 35 Introduction aux flux d’entrée et de sortie — 35 Exemples d’utilisation des flux — 35 10.3 Sérialisation des objets 35 Concepts de base de la sérialisation — 35 Sérialisation et désérialisation d’objets — 35 UCB 2024 2 Tapamo Kenfack POO avec Java Chapitre 11 Bibliothèques et API Java Page 36 11.1 Introduction aux bibliothèques standard Java (java.util, java.lang) 36 Aperçu des bibliothèques standard — 36 Utilisation des classes utilitaires — 36 11.2 Utilisation des classes et méthodes utiles 36 Méthodes communes des classes utilitaires — 36 Exemples pratiques — 36 11.3 Introduction aux API externes 36 Aperçu des API populaires — 36 Comment intégrer et utiliser des API externes — 36 Chapitre 12 Concurrence et Multithreading Page 37 12.1 Concepts de base du multithreading 37 Introduction au multithreading — 37 Avantages et inconvénients — 37 12.2 Création et gestion de threads 37 Création de threads avec Runnable et Thread — 37 Gestion des threads et synchronisation — 37 12.3 Synchronisation et gestion des ressources partagées 37 Problèmes de concurrence — 37 Utilisation des mots-clés synchronized, wait, notify — 37 Chapitre 13 Conception Orientée Objet Page 38 13.1 Principes SOLID 38 Introduction aux principes SOLID — 38 Importance des principes SOLID dans la conception orientée objet — 38 13.2 Design patterns classiques (Singleton, Factory, Observer) 38 Présentation des design patterns — 38 Exemples de mise en œuvre — 38 13.3 Bonnes pratiques de conception 38 Principes de conception robuste — 38 Études de cas — 38 Chapitre 14 Projets Pratiques Page 39 14.1 Introduction aux projets pratiques 39 Présentation des projets — 39 Formation de groupes de travail — 39 14.2 Développement d’un projet en petits groupes 39 Travaux pratiques en groupe — 39 Suivi et assistance par l’enseignant — 39 14.3 Revue de code et feedback 39 Présentation des projets — 39 Feedback et amélioration — 39 Chapitre 15 Révision et Évaluation Page 40 15.1 Révision des concepts clés 40 Récapitulatif des concepts appris — 40 Questions-réponses — 40 15.2 Session de questions-réponses 40 Clarification des doutes — 40 Préparation pour l’évaluation finale — 40 15.3 Évaluation finale (examen pratique et théorique) 40 Examen pratique : implémentation d’un projet ou d’un problème donné — 40 Examen théorique : questionnaire sur les concepts étudiés — 40 15.4 Random Examples 40 15.5 Random 43 15.6 Algorithms 44 UCB 2024 3 Tapamo Kenfack POO avec Java Chapitre 1 Introduction à la Programmation Orientée Objet 1.1 Présentation du cours et des objectifs 1.1.1 Introduction de l’enseignant et des étudiants Je suis Tapamo Kenfack, Enseignant-Cherheur en Informatique dans la spécialité Vision Par Ordinateurs et Traitements d’images. Je travaille plus particulièrement sur images satellites pour l’étude l’environnement et aussi sur les images médicales pour l’aide aux dignostics. Du point de vue enseignements, j’enseigne les sciences des données (Bases de données, Entrépots de données, Big Data) et aussi la programmtion. 1.1.2 Aperçu des objectifs du cours Les objects de ce cours sont – Comprendre les concepts fondamentaux de la POO, y compris les classes, objets, héritage, poly- morphisme, encapsulation et abstraction. – Apprendre la syntaxe et les structures de base du langage Java. – Être capable de concevoir, coder, compiler et exécuter des programmes Java. – 1.1.3 Méthodologie et évaluations Le cours se déroulera selon les articulations suivantes – Cours magistraux pour l’introduction des concepts. – Travaux pratiques et exercices en classe. – Développement de projets en petits groupes. – Évaluations régulières pour mesurer la compréhension et les progrès des étudiants. Quant à l’évaluation, elle sera structurée comme suit – Exercices et Travaux Pratiques : 40% – Projets de Groupe : 30% – Examen Final Théorique : 20% – Participation et Engagement : 10% UCB 2024 4 Tapamo Kenfack POO avec Java 1.2 Concepts de base de la POO : objets, classes, attributs, mé- thodes 1.2.1 Définition de la POO La programmation orientée objet : une approche pour modéliser le monde réel Définition 1.2.1: La programmation orientée objet (POO) C’est un paradigme de programmation qui vise à organiser le code de manière à mieux refléter le monde réel. Au lieu de penser en termes de fonctions et de procédures, la POO se concentre sur la création d’objets. Ces objets sont des entités qui possèdent à la fois des données (attributs) et des comportements (méthodes). Les concepts clés de la POO – Objet: Une instance d’une classe. Il représente une entité concrète (par exemple, une voiture, un utilisateur) avec ses propres propriétés et actions. – Classe: Un modèle ou un plan qui définit les caractéristiques (attributs) et les comportements (méthodes) d’un ensemble d’objets. – Attribut: Une propriété d’un objet. Par exemple, pour une voiture, les attributs pourraient être la couleur, la marque, le modèle. – Méthode: Une fonction associée à une classe qui définit le comportement d’un objet. Par exemple, pour une voiture, les méthodes pourraient être démarrer(), accélérer(), freiner(). – Encapsulation: Le principe de cacher les détails internes d’un objet et d’exposer uniquement les interfaces nécessaires pour interagir avec lui. Cela améliore la maintenabilité et la sécurité du code. – Héritage: Le mécanisme qui permet de créer de nouvelles classes (classes filles) en héritant des propriétés et des méthodes d’une classe existante (classe mère). Cela favorise la réutilisation de code et la hiérarchisation des concepts. – Polymorphisme: La capacité d’une même méthode d’avoir des comportements différents selon le contexte dans lequel elle est appelée. Cela permet de créer du code plus flexible et adaptable. Pourquoi utiliser la POO ? – Modélisation du monde réel: La POO permet de représenter des concepts complexes de manière plus intuitive et naturelle. – Réutilisabilité: Le mécanisme d’héritage favorise la réutilisation de code. – Maintenabilité: L’encapsulation facilite la maintenance du code en isolant les changements. – Extensibilité: La POO permet d’ajouter de nouvelles fonctionnalités de manière plus facile. Exemple simple public class Voiture { String marque; String modele; int annee; public void demarrer() { System.out.println("La voiture démarre."); } public void accelerer() { System.out.println("La voiture accélère."); } } UCB 2024 5 Tapamo Kenfack POO avec Java 1.2.2 Comparaison entre la POO et la programmation procédurale – Programmation impérative : Ce mode consiste à donner une série d’instructions à l’ordinateur pour qu’il les exécute dans un ordre spécifique. Les langages courants incluent C, Python, et JavaScript1. – Programmation orientée objets (POO) : Ce paradigme organise le code en objets, qui sont des instances de classes. Chaque objet peut contenir des données et des méthodes. Les langages populaires incluent Java, C++, et Python1. – Programmation fonctionnelle : Ce mode se concentre sur l’utilisation de fonctions pures et évite les états mutables et les effets de bord. Les langages courants incluent Haskell, Lisp, et Scala1. – Programmation logique : Ce paradigme est basé sur la logique formelle et utilise des déclarations logiques pour exprimer les relations entre les données. Prolog est un exemple de langage de programmation logique1. 1.2.3 Exemples d’objets du monde réel et leur modélisation en classes Une voiture public class Voiture { private String marque; private String modele; private int annee; private String couleur; public Voiture(String marque, String modele, int annee, String couleur) { this.marque = marque; this.modele = modele; this.annee = annee; this.couleur = couleur; } public void demarrer() { System.out.println("La " + marque + " " + modele + " démarre."); } public void arreter() { System.out.println("La " + marque + " " + modele + s'arrête."); } } Etudiant public class Etudiant { private String nom; private String prenom; private int age; private String matricule; public Etudiant(String nom, String prenom, int age, String matricule) { this.nom = nom; this.prenom = prenom; this.age = age; this.matricule = matricule; } public void etudier() { System.out.println(prenom + " " + nom + " étudie."); UCB 2024 6 Tapamo Kenfack POO avec Java } public void passerExamen() { System.out.println(prenom + " " + nom + " passe un examen."); } } Livre public class Livre { private String titre; private String auteur; private int anneePublication; private String genre; public Livre(String titre, String auteur, int anneePublication, String genre) { this.titre = titre; this.auteur = auteur; this.anneePublication = anneePublication; this.genre = genre; } public void lire() { System.out.println("Vous lisez '" + titre + "' de " + auteur + "."); } public void referencer() { System.out.println("Référence : " + auteur + ", '" + titre + "', " + anneePublicat } } Carte bancaire public class CompteBancaire { private String numeroCompte; private String titulaire; private double solde; public CompteBancaire(String numeroCompte, String titulaire, double solde) { this.numeroCompte = numeroCompte; this.titulaire = titulaire; this.solde = solde; } public void deposer(double montant) { solde += montant; System.out.println(montant + " a été déposé. Nouveau solde : " + solde + "."); } public void retirer(double montant) { if (montant = 0) { this.age = age; } else { throw new IllegalArgumentException("L'âge doit être positif"); } } } 4.2.2 Bonnes pratiques – Nommage standard: Utiliser les préfixes get et set pour les accesseurs et mutateurs. – Retourne des copies: Pour les objets immuables, retourner une copie de l’objet plutôt que la référence originale. – Validation: Implémenter des validations dans les mutateurs pour garantir l’intégrité des données. – Éviter les accesseurs et mutateurs pour toutes les propriétés: Utiliser des accesseurs et mutateurs principalement pour les propriétés qui nécessitent une validation ou une logique supplémentaire. 4.3 Bonnes pratiques d’encapsulation 4.3.1 Principes de conception 4.3.2 Cas pratiques et exercices UCB 2024 21 Tapamo Kenfack POO avec Java Chapitre 5 Héritage 5.1 Concepts d’héritage 5.1.1 Introduction à l’héritage Dans certaines applications, les classes utilisées ont en commun certaines variables, méthodes de traitement ou même des signatures de méthode. Avec un langage de programmation orient objet, on peut définir une classe à diffèrent niveaux d’abstraction permettant ainsi de factoriser certains attributs communs a plusieurs classes. Une classe générale définit alors un ensemble d’attributs qui sont partages par d’autres classes, dont on dira qu’elles héritent de cette classe générale. Comme tous les langages orientés objet, JAVA supporte la généralisation spécialisation, le plus communément appelée héritage dans les langages de programmation. Pour simplifier la mise en œuvre, JAVA ne permet que l’héritage simple, c’est-à-dire qu’une classe dérive d’une classe et d’une seule. En outre, JAVA introduit le concept d’interface ; une classe peut implémenter plusieurs inter- faces. Nous présentons avec plus de détail le concept d’héritage dans ce chapitre. Il faut retenir que toutes les classes dérivent d’une classe racine appelée "java.lang.Object". Cette classe de nit des comportements stéréotypes dont nous reparlerons dans le cours Par exemple, les classes Carre et Rectangle peuvent partager une méthode surface() renvoyant le résultat du calcul de la surface de la figure. Plutôt que d’écrire deux fois cette méthode, on peut définir une relation d’héritage entre les classes Carre et Rectangle. Dans ce cas, seule la classe Rectangle contient le code de la méthode surface() mais celle-ci est également utilisable sur les objets de la classe Carre si elle hérite de Rectangle. 5.1.2 Le mécanisme d’héritage L’idée principale de l’héritage est d’organiser les classes de manière hiérarchique. La relation d’héritage est unidirectionnelle et, si une classe B hérite d’une classe A, on dira que B est une sous- classe de A. Cette notion de sous-classe signifie que la classe B est un cas particulier de la classe A et donc que les objets instanciant la classe B instancient également la classe A. L’héritage est la transmission de caractéristiques à ses descendants ? L’héritage correspond à la relation est-un ? Un Etudiant est une Personne ? Un Etudiant est une spécialisation de Personne ? Une PERSONNE est une généralisation d’un Etudiant – vision descendante =>la possibilité de reprendre intégralement tout ce qui a déjà et fait et de pouvoir l’enrichir. – vision ascendante =>la possibilité de regrouper en un seul endroit ce qui est commun a plusieurs. Prenons comme exemple des classes Carre, Rectangle et Cercle. La figure suivante propose une organisation hiérarchique de ces classes telle que chien hérite de Mammifère qui hérite de Animal qui hérite, ainsi de Etre vivant. – vers le haut (en analyse O.O.) =>on regroupe dans une classe ce qui est commun a plusieurs classes. Dans la classe Etre vivant, on regroupe les caractéristiques communes aux autres classes. UCB 2024 22 Tapamo Kenfack POO avec Java Fig. 5.1 – Héritage – vers le bas (lors de la réutilisabilité) =>la classe de base étant définie, on peut la reprendre intégra- lement pour construire la classe dérivée. La classe Etre vivant étant définie, on peut la reprendre intégralement, pour construire la classe Animal. Une classe dérivée modélise un cas particulier de la classe de base, et est enrichie d’informations supplémentaires. La classe dérivée possède les propriétés suivantes : – contient les données membres de la classe de base, – peut en posséder de nouvelles, – possède (a priori) les méthodes de sa classe de base, – peut redéfinir (masquer) certaines méthodes, – peut posséder de nouvelles méthodes. Pour signifier qu’une classe fille hérite d’une classe mère, on utilise le mot clé extends : class Fille extends mère. Notons que l’héritage en java est simple (une seule mère). Définition 5.1.1: Héritage L’héritage est un mécanisme fondamental de la programmation orientée objet qui permet de créer de nouvelles classes en réutilisant les propriétés et les comportements d’une classe exis- tante. Cette classe existante est appelée classe parente ou superclasse, tandis que la nouvelle classe est appelée classe enfant ou sous-classe. Comment ça marche ? Une classe enfant hérite de toutes les méthodes et attributs (non privés) de sa classe parente. La classe enfant peut redéfinir (surcharger) les méthodes héritées pour adapter leur comportement. La classe enfant peut ajouter de nouveaux attributs et méthodes spécifiques à elle. Représentation graphique Exemple class Animal { String nom; public void crier() { System.out.println("Je crie !"); } } UCB 2024 23 Tapamo Kenfack POO avec Java class Chien extends Animal { public void aboyer() { System.out.println("Ouaf !"); } } Dans cet exemple : Animal est la classe parente. Chien est la classe enfant qui hérite de Animal. Un objet de type Chien peut utiliser les méthodes crier() et aboyer(). 5.1.3 Avantages de l’héritage en POO – Réutilisation de code: Évitez de réécrire du code en héritant de classes existantes. Hiérarchie de classes: Organisez votre code en une structure hiérarchique, reflétant les relations entre les objets. – Polymorphisme: Permet de traiter des objets de différentes classes de manière uniforme grâce à un mécanisme appelé polymorphisme. 5.1.4 Héritage et constructeurs Un objet d’une classe dérivée est un objet de la classe parente plus une partie qui correspond à la classe dérivée. Il est donc nécessaire d’initialiser la partie provenant de la classe parente lorsque l’objet est créé. Le constructeur de la classe dérivée doit donc faire appel au constructeur de la classe parente pour réaliser cette initialisation. Le plus souvent un constructeur de classe dérivée reçoit un ensemble de paramètres pour initialiser les attributs de la classe parente. Il utilise ces paramètres pour faire appel au constructeur de la classe parente. Remarques – L’appel au constructeur d’une classe supérieure doit toujours se situer dans un constructeur et toujours en tant que première instruction ; – Si aucun appel à un constructeur d’une classe supérieure n’est fait, le constructeur fait appel implicitement à un constructeur vide de la classe supérieure (comme si la ligne super() était présente). Si aucun constructeur vide n’est accessible dans la classe supérieure, une erreur se produit lors de la compilation. 5.1.5 Rédéfinition des méthodes La redéfinition d’une méthode héritée doit impérativement conserver la déclaration de la méthode parent (type et nombre de paramètres, la valeur de retour et les exceptions propagées doivent être identiques). Si la signature de la méthode change, ce n’est plus une redéfinition mais une surcharge. Cette nouvelle méthode n’est pas héritée : la classe mère ne possède pas de méthode possédant cette signa- ture. Lors de la redéfinition d’une méthode, on ne doit pas restreindre sa visibilité. 5.1.6 Le transtypage Il existe deux types de transtypage : – Le transtypage ascendant qui sert a un objet à être vu comme du type de sa mère. Ce transty- page est fait de façon implicite et n’est nécessaire que dans le cas où la classe courante possède une propriété ayant le même nom que sa classe mère et que l’on cherche a accéder à la propriété mère. – Le transtypage descendant- le plus courant - qui sert a forcer une classe de type mère à être vue comme un type fille. Ce transtypage n’est valide que si l’objet de type mère était de type fille à son instanciation. UCB 2024 24 Tapamo Kenfack POO avec Java Voilà quelques règles à retenir : – Une classe ne peut hériter que d’une autre classe (héritage simple, l’héritage multiple n’est pas autorisé en Java). – Une classe hérite d’une autre par l’utilisation du mot réservé extends. – Une classe pour laquelle aucune spécialisation n’est explicitée spécialise implicitement la classe java.lang.Object (qui est la classe mère par défaut). – Le mot réservé final utilise devant le mot clé class interdit toute spécialisation (héritage) de la classe sur laquelle il est utilise 5.1.7 Le polymorphisme Dans le paragraphe précédent, nous avons parlé de superclasses et de sous-classes. Si une classe hérite d’une méthode de sa superclasse, alors il y a une chance de reformuler la méthode à condition qu’il ne soit pas marqué final. L’avantage de la substitution est la capacité de définir un comportement spécifique au type de sous-classe, ce qui signifie qu’une sous-classe peut implémenter une méthode de classe parent en fonction de son besoin et ses exigences. public class Animal { public void seDeplacer() { System.out.println("Un animal peut se déplacer"); } } class Chien extends Animal { public void seDeplacer() { System.out.println("Un chien peut courir"); } } class Oiseau extends Animal { public void seDeplacer() { System.out.println("Un oiseau peut voler"); } } Et pour exécuter le code de cette classe nous aurons besoin d’une autre classe doté d’une méthode static void main(). public class ExecutionAnimal { public static void main(String args[]) { Animal a = new Animal(); Animal b = new Chien(); Animal c= new Oiseau(); a.seDeplacer(); b.seDeplacer(); c.seDeplacer(); Ce qui affiche après exécution : Un animal peut se déplacer Un chien peut courir Un oiseau peut voler 5.2 Exemple 5.2.1 Description Supposons qu’on veuille créer une classe enseignant : un enseignant est une personne particu- lière. Il a des attributs qu’une autre personne n’aura pas : la matière qu’il enseigne par exemple. Mais UCB 2024 25 Tapamo Kenfack POO avec Java il a aussi les attributs de toute personne : prénom, nom et âge. Un enseignant fait donc pleinement partie de la classe personne mais a des attributs supplémentaires. Plutôt que d’écrire une classe en- seignant en partant de rien, on préfèrerait reprendre l’acquis de la classe personne qu’on adapterait au caractère particulier des enseignants. C’est le concept d’héritage qui nous permet cela. Pour exprimer que la classe enseignant hérite des propriétés de la classe personne, on écrira : public class enseignant extends personne personne est appelée la classe parent (ou mère) et enseignant la classe dérivée (ou fille). Un objet enseignant a toutes les qualités d’un objet personne : il a les mêmes attributs et les mêmes méthodes. Ces attributs et méthodes de la classe parent ne sont pas répétées dans la définition de la classe fille : on se contente d’indiquer les attributs et méthodes rajoutés par la classe fille : 5.2.2 Création de la classe fille class enseignant extends personne{ // attributs private int section; // constructeur public enseignant(String P, String N, int age,int section){ super(P,N,age); this.section=section; } } 5.2.3 Création de la classe parent public class personne{ private String prenom; private String nom; private int age; public personne(String P, String N, int age){ this.prenom=P; this.nom=N; this.age=age; } public personne(personne P){ this.prenom=P.prenom; this.nom=P.nom; this.age=P.age; } public String identite(){ return "personne("+prenom+","+nom+","+age+")"; } // accesseurs public String getPrenom(){ return prenom; } public String getNom(){ return nom; } public int getAge(){ return age; } //modifieurs public void setPrenom(String P){ this.prenom=P; UCB 2024 26 Tapamo Kenfack POO avec Java } public void setNom(String N){ this.nom=N; } public void setAge(int age){ this.age=age; } } 5.2.4 Construction d’un objet enseignant Le constructeur de la classe enseignant est le suivant : // constructeur public enseignant(String P, String N, int age, int section){ super(P,N,age); this.section=section; } L’instruction super(P,N,age) est un appel au constructeur de la classe parent, ici la classe personne. On sait que ce constructeur initialise les champs prenom, nom et age de l’objet personne contenu à l’intérieur de l’objet étudiant. Cela paraît bien compliqué et on pourrait préférer écrire : // constructeur public enseignant(String P, String N, int age, int section){ this.prenom=P; this.nom=N; this.age=age; this.section=section; } C’est impossible. La classe personne a déclaré privés (private) ses trois champs prenom, nom et age. Seuls des objets de la même classe ont un accès direct à ces champs. Tous les autres objets, y compris des objets fils comme ici, doivent passer par des méthodes publiques pour y avoir accès. Cela aurait été différent si la classe personne avait déclaré protégés (protected) les trois champs : elle autorisait alors des classes dérivées à avoir un accès direct aux trois champs. Dans notre exemple, utiliser le constructeur de la classe parent était donc la bonne solution et c’est la méthode habituelle : lors de la construction d’un objet fils, on appelle d’abord le constructeur de l’objet parent puis on complète les initialisations propres cette fois à l’objet fils (section dans notre exemple). Tentons un premier programme : public class test1{ public static void main(String arg[]){ System.out.println(new enseignant("Jean","Dupont",30,27).identite()); } } 5.2.5 Surcharge d’une méthode Dans l’exemple précédent, nous avons eu l’identité de la partie personne de l’enseignant mais il manque certaines informations propres à la classe enseignant (la section). On est donc amené à écrire une méthode permettant d’identifier l’enseignant : class enseignant extends personne{ int section; public enseignant(String P, String N, int age, int section){ super(P,N,age); this.section=section; UCB 2024 27 Tapamo Kenfack POO avec Java } public String identite(){ return "enseignant("+super.identite()+","+section+")"; } } La méthode identite de la classe enseignant s’appuie sur la méthode identite de sa classe mère (su- per.identite) pour afficher sa partie personne puis complète avec le champ section qui est propre à la classe enseignant. La classe enseignant dispose maintenant deux méthodes identite : celle héritée de la classe parent personne et la sienne propre Si E est un ojet enseignant, E.identite désigne la méthode identite de la classe enseignant. On dit que la méthode identite de la classe mère est surchargée par la méthode identite de la classe fille. De façon générale, si O est un objet et M une méthode, pour exécuter la méthode O.M, le système cherche une méthode M dans l’ordre suivant : – dans la classe de l’objet O – dans sa classe mère s’il en a une – dans la classe mère de sa classe mère si elle existe – etc... L’héritage permet donc de surcharger dans la classe fille des méthodes de même nom dans la classe mère. C’est ce qui permet d’adapter la classe fille à ses propres besoins. Associée au polymor- phisme que nous allons voir un peu plus loin, la surcharge de méthodes est le principal intérêt de l’héritage. UCB 2024 28 Tapamo Kenfack POO avec Java Chapitre 6 Polymorphisme 6.1 Polymorphisme à travers l’héritage 6.1.1 Définition du polymorphisme 𝑥2 [0,1] [1,1] 𝑥 = [𝑥1 ,𝑥 2 ] 𝑥2 [0,0] 𝑥1 𝑥1 6.1.2 Utilisation du polymorphisme dans des classes dérivées 6.2 Redéfinition des méthodes (override) 6.2.1 Surcharge et redéfinition de méthodes 6.2.2 Utilisation de l’annotation @Override 6.3 Utilisation des classes abstraites et des interfaces 6.3.1 Introduction aux classes abstraites et interfaces 6.3.2 Différences entre les deux UCB 2024 29 Tapamo Kenfack POO avec Java Chapitre 7 Interfaces et Classes Abstraites 7.1 Différences entre interfaces et classes abstraites Comparaison détaillée Cas d’utilisation pour chacun 7.2 Implémentation d’interfaces Définition et implémentation d’interfaces Exemples et exercices pratiques 7.3 Création et utilisation de classes abstraites Définition de classes abstraites Implémentation de méthodes abstraites et concrètes UCB 2024 30 Tapamo Kenfack POO avec Java Chapitre 8 Gestion des Exceptions 8.1 Concepts de base des exceptions Les exceptions représentent le mécanisme de gestion des erreurs intégré au langage Java. Il se compose d’objets représentant les erreurs et d’un ensemble de trois mots clés qui permettent de détecter et de traiter ces erreurs (try, catch et finally ) mais aussi de les lever ou les propager (throw et throws). Lors de la détection d’une erreur, un objet qui hérite de la classe Exception est créé (on dit qu’une exception est levée) et propagé à travers la pile d’exécution jusqu’à ce qu’il soit traité. Ces mécanismes permettent de renforcer la sécurité du code Java. Exemple d’exception levée non capturée public class TestException { public static void main(java.lang.String[] args) { int i = 3; int j = 0; System.out.println("résultat = " + (i / j)); } } Si dans un bloc de code on fait appel à une méthode qui peut potentiellement générer une exception, on doit soit essayer de la récupérer avec try/catch, soit ajouter le mot clé throws dans la déclaration du bloc. Si on ne le fait pas, il y a une erreur à la compilation. Les erreurs et exceptions du paquetage java.lang échappent à cette contrainte. Throws permet de déléguer la responsabilité des erreurs à la méthode appelante Ce procédé présente un inconvénient : de nombreuses méthodes des packages java indiquent dans leur déclaration qu’elles peuvent lever une exception. Cependant ceci garantit que certaines exceptions critiques seront prises explicitement en compte par le programmeur. 8.2 Try, catch, finally Le bloc try rassemble les appels de méthodes susceptibles de produire des erreurs ou des ex- ceptions. L’instruction try est suivie d’instructions entre des accolades. try { operation_risquée1; opération_risquée2; } catch (ExceptionInteressante e) { traitements } catch (ExceptionParticulière e) { traitements } catch (Exception e) { UCB 2024 31 Tapamo Kenfack POO avec Java traitements } finally { traitement_pour_terminer_proprement; } Si un événement indésirable survient dans le bloc try, la partie éventuellement non exécutée de ce bloc est abandonnée et le premier bloc catch est traité. Si un bloc catch est défini pour capturer l’exception issue du bloc try alors elle est traitée en exécutant le code associé au bloc. Si le bloc catch est vide (aucune instruction entre les accolades) alors l’exception capturée est ignorée. Une telle utilisation de l’instruction try/catch n’est pas une bonne pratique : il est préférable de toujours apporter un traitement adapté lors de la capture d’une exception. S’il y a plusieurs types d’erreurs et d’exceptions à intercepter, il faut définir autant de blocs catch que de types d’événements. Par type d’exception, il faut comprendre « qui est du type de la classe de l’exception ou d’une de ses sous-classes ». Ainsi dans l’ordre séquentiel des clauses catch, un type d’exception ne doit pas venir après un type d’une exception d’une super-classe. Il faut faire attention à l’ordre des clauses catch pour traiter en premier les exceptions les plus précises (sous-classes) avant les exceptions plus générales. Un message d’erreur est émis par le compilateur dans le cas contraire. erreur à la compil car Exception est traité en premier alors que ArithmeticException est une sous-classe de Exception public class TestException { public static void main(java.lang.String[] args) { // Insert code to start the application here. int i = 3; int j = 0; try { System.out.println("résultat = " + (i / j)); } catch (Exception e) { } catch (ArithmeticException e) { } } } Résultat de la compilation tapamo@tapamo-ThinkPad-P50:/test01$ javac TestException.java TestException.java:9: error: exception ArithmeticException has already been caught } catch (ArithmeticException e) { ^ 1 error Si l’exception générée est une instance de la classe déclarée dans la clause catch ou d’une classe dérivée, alors on exécute le bloc associé. Si l’exception n’est pas traitée par un bloc catch, elle sera transmise au bloc de niveau supérieur. Si l’on ne se trouve pas dans un autre bloc try, on quitte la méthode en cours, qui regénère à son tour une exception dans la méthode appelante. L’exécution totale du bloc try et d’un bloc d’une clause catch sont mutuellement exclusives : si une exception est levée, l’exécution du bloc try est arrêtée et si elle existe, la clause catch adéquate est exécutée. Remarque 1: Clause finilly La clause finally définit un bloc qui sera toujours exécuté, qu’une exception soit levée ou non. Ce bloc est facultatif. Il est aussi exécuté si dans le bloc try il y a une instruction break ou continue. 8.2.1 La classe Throwable Cette classe descend directement de la classe Object : c’est la classe de base pour le traitement des erreurs. UCB 2024 32 Tapamo Kenfack POO avec Java Cette classe possède deux constructeurs : Throwable() et Throwable(String). La chaîne en para- mètre permet de définir un message qui décrit l’exception et qui pourra être consulté dans un bloc catch. Les principales méthodes de la classe Throwable sont : – String getMessage( ) : lecture de message – void printStackTrace( ) : affiche l’exception et l’état de la pile d’exécution au moment de son appel – void printStackTrace(PrintStream s) : Idem mais envoie le résultat dans un flux 8.2.2 Utilisation de finally 8.3 Création de vos propres exceptions 8.3.1 Définition de classes d’exception personnalisées 8.3.2 Utilisation des exceptions personnalisées dans les programmes UCB 2024 33 Tapamo Kenfack POO avec Java Chapitre 9 Collections et Génériques 9.1 Introduction aux collections (List, Set, Map) 9.1.1 Présentation des principales interfaces de la collection framework 9.1.2 Exemples d’utilisation 9.2 Utilisation des collections Java 9.2.1 Manipulation des listes, ensembles et maps 9.2.2 Méthodes courantes des collections 9.3 Concepts de base des génériques 9.3.1 Introduction aux génériques 9.3.2 Utilisation des génériques dans les collections UCB 2024 34 Tapamo Kenfack POO avec Java Chapitre 10 Fichiers et Flux 10.1 Lecture et écriture de fichiers 10.1.1 Classes File, FileReader, FileWriter 10.1.2 Exemples pratiques de lecture et d’écriture 10.2 Utilisation des classes de flux (InputStream, OutputStream) 10.2.1 Introduction aux flux d’entrée et de sortie 10.2.2 Exemples d’utilisation des flux 10.3 Sérialisation des objets 10.3.1 Concepts de base de la sérialisation 10.3.2 Sérialisation et désérialisation d’objets UCB 2024 35 Tapamo Kenfack POO avec Java Chapitre 11 Bibliothèques et API Java 11.1 Introduction aux bibliothèques standard Java (java.util, java.lang) 11.1.1 Aperçu des bibliothèques standard 11.1.2 Utilisation des classes utilitaires 11.2 Utilisation des classes et méthodes utiles 11.2.1 Méthodes communes des classes utilitaires 11.2.2 Exemples pratiques 11.3 Introduction aux API externes 11.3.1 Aperçu des API populaires 11.3.2 Comment intégrer et utiliser des API externes UCB 2024 36 Tapamo Kenfack POO avec Java Chapitre 12 Concurrence et Multithreading 12.1 Concepts de base du multithreading 12.1.1 Introduction au multithreading 12.1.2 Avantages et inconvénients 12.2 Création et gestion de threads 12.2.1 Création de threads avec Runnable et Thread 12.2.2 Gestion des threads et synchronisation 12.3 Synchronisation et gestion des ressources partagées 12.3.1 Problèmes de concurrence 12.3.2 Utilisation des mots-clés synchronized, wait, notify UCB 2024 37 Tapamo Kenfack POO avec Java Chapitre 13 Conception Orientée Objet 13.1 Principes SOLID 13.1.1 Introduction aux principes SOLID 13.1.2 Importance des principes SOLID dans la conception orientée objet 13.2 Design patterns classiques (Singleton, Factory, Observer) 13.2.1 Présentation des design patterns 13.2.2 Exemples de mise en œuvre 13.3 Bonnes pratiques de conception 13.3.1 Principes de conception robuste 13.3.2 Études de cas UCB 2024 38 Tapamo Kenfack POO avec Java Chapitre 14 Projets Pratiques 14.1 Introduction aux projets pratiques 14.1.1 Présentation des projets 14.1.2 Formation de groupes de travail 14.2 Développement d’un projet en petits groupes 14.2.1 Travaux pratiques en groupe 14.2.2 Suivi et assistance par l’enseignant 14.3 Revue de code et feedback 14.3.1 Présentation des projets 14.3.2 Feedback et amélioration UCB 2024 39 Tapamo Kenfack POO avec Java Chapitre 15 Révision et Évaluation 15.1 Révision des concepts clés 15.1.1 Récapitulatif des concepts appris 15.1.2 Questions-réponses 15.2 Session de questions-réponses 15.2.1 Clarification des doutes 15.2.2 Préparation pour l’évaluation finale 15.3 Évaluation finale (examen pratique et théorique) 15.3.1 Examen pratique : implémentation d’un projet ou d’un problème donné 15.3.2 Examen théorique : questionnaire sur les concepts étudiés 15.4 Random Examples Définition 15.4.1: Limit of Sequence in ℝ Let {𝑠 𝑛 } be a sequence in ℝ. We say lim 𝑠 𝑛 = 𝑠 𝑛→∞ where 𝑠 ∈ ℝ if ∀ real numbers 𝜖 > 0 ∃ natural number 𝑁 such that for 𝑛 > 𝑁 𝑠 − 𝜖 < 𝑠 𝑛 < 𝑠 + 𝜖 i.e. |𝑠 − 𝑠 𝑛 | < 𝜖 Question 1 Is the set 𝑥−axis\{Origin} a closed set Solution: We have to take its complement and check whether that set is a open set i.e. if it is a union of open balls Note:- We will do topology in Normed Linear Space (Mainly ℝ𝑛 and occasionally ℂ𝑛 )using the language of Metric Space UCB 2024 40 Tapamo Kenfack POO avec Java Fig. 15.1 – Constituants Android UCB 2024 41 Tapamo Kenfack POO avec Java Claim 15.4.1 Topology Topology is cool Exemple 15.4.1 (Open Set and Close Set) Open Set: 𝜙Ð 𝐵𝑟 (𝑥) (Any 𝑟 > 0 will do) 𝑥∈𝑋 𝐵𝑟 (𝑥) is open Closed Set: 𝑋, 𝜙 𝐵𝑟 (𝑥) 𝑥−axis ∪ 𝑦−axis Théorème 15.4.1 If 𝑥 ∈ open set 𝑉 then ∃ 𝛿 > 0 such that 𝐵 𝛿 (𝑥) ⊂ 𝑉 Démonstration: By openness of 𝑉, 𝑥 ∈ 𝐵𝑟 (𝑢) ⊂ 𝑉 𝑉 𝐵 𝛿 (𝑥) 𝐵𝑟 (𝑢) 𝑥 𝑢 Given 𝑥 ∈ 𝐵𝑟 (𝑢) ⊂ 𝑉, we want 𝛿 > 0 such that 𝑥 ∈ 𝐵 𝛿 (𝑥) ⊂ 𝐵𝑟 (𝑢) ⊂ 𝑉. Let 𝑑 = 𝑑(𝑢,𝑥). Choose 𝛿 such that 𝑑 + 𝛿 < 𝑟 (e.g. 𝛿 < 𝑟−𝑑 2 ) If 𝑦 ∈ 𝐵 𝛿 (𝑥) we will be done by showing that 𝑑(𝑢,𝑦) < 𝑟 but 𝑑(𝑢,𝑦) ⩽ 𝑑(𝑢,𝑥) + 𝑑(𝑥,𝑦) < 𝑑 + 𝛿 < 𝑟 Corollaire 15.4.1 By the result of the proof, we can then show... Lemme 15.4.1 Suppose 𝑣®1 ,... ,𝑣®𝑛 ∈ ℝ𝑛 is subspace of ℝ𝑛. Proposition 15.4.1 1 + 1 = 2. UCB 2024 42 Tapamo Kenfack POO avec Java 15.5 Random Définition 15.5.1: Normed Linear Space and Norm ∥ · ∥ Let 𝑉 be a vector space over ℝ (or ℂ). A norm on 𝑉 is function ∥ · ∥ 𝑉 → ℝ⩾0 satisfying 1 ∥𝑥∥ = 0 ⇐⇒ 𝑥 = 0 ∀ 𝑥 ∈ 𝑉 2 ∥𝜆𝑥∥ = |𝜆|∥𝑥∥ ∀ 𝜆 ∈ ℝ(or ℂ), 𝑥 ∈ 𝑉 3 ∥𝑥 + 𝑦∥ ⩽ ∥𝑥∥ + ∥𝑦∥ ∀ 𝑥,𝑦 ∈ 𝑉 (Triangle Inequality/Subadditivity) And 𝑉 is called a normed linear space. Same definition works with 𝑉 a vector space over ℂ √ (again ∥ · ∥ → ℝ⩾0 ) where 2 becomes ∥𝜆𝑥∥ = |𝜆|∥𝑥∥ ∀ 𝜆 ∈ ℂ, 𝑥 ∈ 𝑉, where for 𝜆 = 𝑎 + 𝑖𝑏, |𝜆| = 𝑎 2 + 𝑏 2 Exemple 15.5.1 (𝒑−Norm) 𝑉 = ℝ𝑚 , 𝑝 ∈ ℝ⩾0. Define for 𝑥 = (𝑥1 ,𝑥 2 , · · · ,𝑥 𝑚 ) ∈ ℝ𝑚   1𝑝 𝑝 𝑝 𝑝 ∥𝑥∥𝑝 = |𝑥1 | + |𝑥2 | + · · · + |𝑥 𝑚 | (In school 𝑝 = 2) Special Case 𝒑 = 1: ∥𝑥∥1 = |𝑥 1 | + |𝑥2 | + · · · + |𝑥 𝑚 | is clearly a norm by usual triangle inequality. Special Case 𝒑 → ∞ (ℝ𝒎 with ∥ · ∥∞ ): ∥𝑥∥∞ = max{|𝑥1 |,|𝑥 2 |, · · · ,|𝑥 𝑚 |} For 𝑚 = 1 these 𝑝−norms are nothing but |𝑥|. Now exercise Question 2 Prove that triangle inequality is true if 𝑝 ⩾ 1 for 𝑝−norms. (What goes wrong for 𝑝 < 1 ?) Solution: For Property 3 for norm-2 When field is ℝ : We have to show s sÕ 2 Õ © Õ 2 (𝑥 𝑖 + 𝑦 𝑖 ) ⩽ ­ 𝑥𝑖 + 2 𝑦 𝑖2 ® ª 𝑖 « 𝑖 𝑖 ¬ v u t" #" # Õ Õ Õ Õ Õ =⇒ (𝑥 𝑖 + 2𝑥 𝑖 𝑦 𝑖 + 𝑦 𝑖 ) ⩽ 2 2 𝑥𝑖 + 2 2 𝑥𝑖 2 𝑦𝑖 + 2 𝑦 𝑖2 𝑖 𝑖 𝑖 𝑖 𝑖 " #2 " #" # Õ Õ Õ =⇒ 𝑥 𝑖 𝑦𝑖 ⩽ 𝑥 2𝑖 𝑦 𝑖2 𝑖 𝑖 𝑖 So in other words prove ⟨𝑥,𝑦⟩ 2 ⩽ ⟨𝑥,𝑥⟩⟨𝑦,𝑦⟩ where Õ ⟨𝑥,𝑦⟩ = 𝑥 𝑖 𝑦𝑖 𝑖 Note:- – ∥𝑥∥2 = ⟨𝑥,𝑥⟩ – ⟨𝑥,𝑦⟩ = ⟨𝑦,𝑥⟩ – ⟨·,·⟩ is ℝ−linear in each slot i.e. ⟨𝑟𝑥 + 𝑥 ′ ,𝑦⟩ = 𝑟⟨𝑥,𝑦⟩ + ⟨𝑥 ′ ,𝑦⟩ and similarly for second slot UCB 2024 43 Tapamo Kenfack POO avec Java Here in ⟨𝑥,𝑦⟩ 𝑥 is in first slot and 𝑦 is in second slot. Now the statement is just the Cauchy-Schwartz Inequality. For proof ⟨𝑥,𝑦⟩ 2 ⩽ ⟨𝑥,𝑥⟩⟨𝑦,𝑦⟩ expand everything of ⟨𝑥 − 𝜆𝑦,𝑥 − 𝜆𝑦⟩ which is going to give a quadratic equation in variable 𝜆 ⟨𝑥 − 𝜆𝑦,𝑥 − 𝜆𝑦⟩ = ⟨𝑥,𝑥 − 𝜆𝑦⟩ − 𝜆⟨𝑦,𝑥 − 𝜆𝑦⟩ = ⟨𝑥,𝑥⟩ − 𝜆⟨𝑥,𝑦⟩ − 𝜆⟨𝑦,𝑥⟩ + 𝜆2 ⟨𝑦,𝑦⟩ = ⟨𝑥,𝑥⟩ − 2𝜆⟨𝑥,𝑦⟩ + 𝜆2 ⟨𝑦,𝑦⟩ Now unless 𝑥 = 𝜆𝑦 we have ⟨𝑥 − 𝜆𝑦,𝑥 − 𝜆𝑦⟩ > 0 Hence the quadratic equation has no root therefore the discriminant is greater than zero. When field is ℂ : Modify the definition by Õ ⟨𝑥,𝑦⟩ = 𝑥 𝑖 𝑦𝑖 𝑖 Then we still have ⟨𝑥,𝑥⟩ ⩾ 0 15.6 Algorithms Algorithm 1: what Input: This is some input Output: This is some output 1 some code here; 2 𝑥 ← 0; 3 𝑦 ← 0; 4 if 𝑥 > 5 then 5 x is greater than 5 ; // This is also a comment 6 else 7 x is less than or equal to 5; 8 end 9 foreach y in 0..5 do 10 𝑦 ← 𝑦 + 1; 11 end 12 for 𝑦 in 0..5 do 13 𝑦 ← 𝑦 − 1; 14 end 15 while 𝑥 > 5 do 16 𝑥 ← 𝑥 − 1; 17 end 18 return Return something here; UCB 2024 44

Use Quizgecko on...
Browser
Browser