Initiation au langage Java
22/09/23 06:47 PM 1
Le langage Java
Langage de programmation
Développé par SUN microsystems en 1995
Initialement orienté web
Syntaxe proche du langage C
C’est un langage interprété et compilé
C’est un langage orienté-objet
22/09/23 06:47 PM 2
Rappel sur Programmation
Orientée Objet (POO)
22/09/23 06:47 PM 3
Programmation orientée-objet
C’est avant tout une démarche de
conception de programme qui se focalise
sur les objets à développer plutôt que
sur les traitements.
1. Identifier les objets du programme
2. Identifier les données nécessaires à chaque objet (Attributs)
3. Identifier des méthodes de traitement de chaque objet
4. Développer des classes d’objets
22/09/23 06:47 PM 4
Exemple: gestion d’une bibliothèque
Avec une programmation procédurale (ex:
C), on cherchera à écrire des fonctions pour :
• Rechercher un livre d’après son titre, son auteur, …
• Enregistrer le prêt d’un livre
• Enregistrer le retour d’un livre
• Identifier les lecteurs en retard
• Créer un nouveau lecteur
• Enregistrer un nouveau livre
• Afficher la liste des livres empruntés par un lecteur
22/09/23 06:47 PM 5
Exemple: gestion d’une bibliothèque
Avec un langage de programmation orienté-objet,
on définit le contenu des classes d’objets manipulés
:
• La classe Livre qui a un titre, un auteur, un emprunteur et des
méthodes empruntéPar(Lecteur l), rendu(), estEnRetard(),
…
• La classe Lecteur qui a un nom, une adresse, une liste de livres
empruntés et des méthodes emprunte(Livre l), retourne(Livre
l), …
• D’autres classes telles que DVD, StatutLecteur, Bibliothèque,
CatégorieLivre, Employé, …
22/09/23 06:47 PM 6
Classe
Une classe est un type complexe de données.
On déclare des variables dont le type est une
classe comme pour les types primitifs:
int monEntier;
Livre monLivre;
C’est au concepteur de la classe d’écrire toutes
les opérations qui lui sont applicables
En Java, un programme est uniquement
constituée de classes.
22/09/23 06:47 PM 7
Exemple: la classe Livre
class Livre {
String titre;
Données int numero;
Lecteur emprunteur;
String getTitre() {
return titre;
}
Méthodes boolean estEmprunte() {
if (emprunteur == null) return false;
else return true;
}
}
22/09/23 06:47 PM 8
Droits d'accès
Une variable ou une méthode a un type d'accès qui la rend
accessible ou non en fonction de la classe où elle est appelée.
• public, ex: public String getTitre() {…}
La méthode est accessible par toutes les classes.
• private, ex: private String titre;
La variable n'est accessible que dans sa classe.
• protected, ex: protected String nomCategorie;
22/09/23 06:47 PM 9
Exemple: droits d'accès
public class Livre {
private String titre; public class BonExemple {{
public class MauvaisExemple
private int numero;
Lecteur emprunteur; public String getDescription(Livre
public String getDescription(Livre l) { l)
{
String str = [Link];
public String getTitre() { String str = [Link]();
if ([Link]())
return titre; if ([Link]())
str = str + "
} emprunte"; str = str + "
emprunte";
else
public boolean estEmprunte() { else
str = str + "libre;
if (emprunteur == null) str = str + "
libre"; return str;
return false; }
else return true; return str;
} }
}
} }
22/09/23 06:47 PM 10
Objet
Un objet est une instance d’une classe:
Livre monLivre = new Livre();
L’objet monLivre a toutes les propriétés
de sa classe. Par exemple :
[Link]
[Link]()
22/09/23 06:47 PM 11
Constructeur
L’instanciation d’une classe en un objet fait appel
à une méthode constructeur qui effectue des
opérations d’initialisation.
• Un constructeur a le même nom que sa classe;
• Un constructeur n’a pas de valeur de retour;
• Il peut exister plusieurs constructeurs (avec des paramètres
d’entrée différents);
• Il faut au moins un constructeur dans une classe pour pouvoir
instancier des objets.
22/09/23 06:47 PM 12
Constructeur Livre
class Livre {
…
Livre() { …
titre = null; Livre monLivre;
emprunteur = null; monLivre = new Livre();
numero = 0; …
} Livre unLivre;
unLivre = new Livre("Java",123);
Livre(String t, int n) {
titre = t; …
numero = n;
emprunteur = null;
}
…
}
22/09/23 06:47 PM 13
Méthode main
Une classe exécutable dispose d'une méthode:
public static void main(String[ ] args)
La méthode main est la première exécutée au début du programme
public class Enregistrement {
public static void main(String[ ] args) {
Lecteur l = new Lecteur("Youssef");
[Link]();
}
}
22/09/23 06:47 PM 14
Syntaxe du langage
22/09/23 06:47 PM 15
Types primitifs
Même types
Plus deux nouveaux types :
qu'en C: • boolean
• int • byte
• float
Plus la classe :
• double • String
• short
• long
Déclaration :
• int monEntier;
• char • String chaine;
• void • boolean test;
22/09/23 06:47 PM 16
Structures de contrôle
Instruction conditionnelle
if <condition> {bloc_si_vrai} else {bloc_si_faux}
Exemple :
if ( [Link]() = = "employe") {
[Link](30);
} else {
[Link](15);
}
22/09/23 06:47 PM 17
Structures de contrôle
Instruction itérative
while <condition> {bloc}
Exemple :
while ( i < [Link]() ) {
Livre l = [Link](i);
[Link](true);
i++;
}
22/09/23 06:47 PM 18
Structures de contrôle
Instruction itérative
for (<init>; <condition>; <increment>) {bloc}
Exemple :
for (int i = 0; i < [Link](); i++ ) {
Livre l = [Link](i);
[Link](true);
}
22/09/23 06:47 PM 19
Structures de contrôle
Instruction de choix multiple
switch (<variable>) { Exemple :
case <val1>: <bloc1>
case <val2>: <bloc2> switch ([Link]()) {
… case 1: [Link](15);
default: <bloc> break;
} case 2: [Link](20);
break;
default: [Link](30);
}
22/09/23 06:47 PM 20
Environnement Java
22/09/23 06:47 PM 21
Packages
Un package regroupe des classes et des sous-
packages sous un thème précis. Exemple :
Le package java contient des classes de base du
langage.
Le package [Link] contient des classe pour la
programmation réseau.
Pour créer un package, vous devez préciser son nom au début
d'une classe.
package bibliotheque;
public class Livre {…
}
22/09/23 06:47 PM 22
Recommandations de développement
Le code source d'une classe doit être enregistré
dans un fichier de même nom que la classe. Ex:
[Link]
Toutes les classes d'un package doivent être dans
un répertoire de même nom que le package. Ex:
C:\MesProgs\src\exemples\bibliotheque\[Link]
En général, chaque nom de classe commence par
une majuscule.
22/09/23 06:47 PM 23
Import
Pour utiliser une classe d'un autre
package, il faut l'importer.
package [Link];
import [Link].*;
/* import [Link]; marche aussi */
public class Livre {
Vector liste;
…
}
22/09/23 06:47 PM 24
Langage interprété ?
Code source
Compilateur
Bytecode
Interpréteur
Code machine
Système d'exploitation
22/09/23 06:47 PM 25
Compilation
Le code source est compilé par l'instruction javac
javac [Link]
Deux options sont nécessaires pour
• Enregistrer le bytecode dans autre un répertoire
javac –d <répertoire> <code source>
• Compiler si des classes d'autres packages sont utilisées
javac –classpath <répertoires> <code source>
Exemple :
javac –d C:\MesProgs\classes -classpath C:\MesProgs\src [Link]
22/09/23 06:47 PM 26
Exécution
Une classe exécutable se lance avec l'instruction java suivie de
son nom complet (avec son package).
java [Link]
Une options est nécessaire si des classes d'autres packages sont
utilisées:
java –classpath <répertoires> <classe exécutable>
Exemple :
java -classpath C:\MesProgs\classes [Link]
22/09/23 06:47 PM 27
Documentation
Une documentation HTML peut être générée pour décrire des
packages par l'instruction javadoc
• l'option –d existe aussi pour spécifier un répertoire de
destination
javadoc –d C:\MesProgs\doc exemples
Les fichiers sources doivent être correctement commentés pour
créer une véritable documentation.
22/09/23 06:47 PM 28
Tags de documentation
@author pour afficher les noms des
auteurs de la classe
@param pour décrire les paramètres
d'entrée d'une méthode
@return pour décrire la valeur de retour
d'une méthode
@see pour créer un lien vers d'autres
classes
22/09/23 06:47 PM 29
Application Programming Interface
(API)
22/09/23 06:47 PM 30
Application Programming Interface
L'API (Application Programming Interface) désigne un
ensemble de classes génériques utilisables par un développeur
Java.
L'API du SDK 1.4 a été étendue de manière incrémentale
depuis la version 1.02 du JDK.
Le code source des classes est disponible.
22/09/23 06:47 PM 31
Packages java, javax et org
L'API du SDK 1.4 est découpée en packages qui regroupent
les classes par thème.
Au plus haut niveau :
le package java contient des classes couramment utilisées
le package javax contient des extensions plus spécialisées
le package org contient des extensions proposées par
d'autres organisations (comme l'Object Management Group)
22/09/23 06:47 PM 32
Quelques packages
[Link] : classes de base du langage
[Link] : classes utilitaires
[Link] : classes de gestion des entrées/sorties
[Link] : classes pour la programmation
réseau
[Link] : classes graphiques
[Link] : autres classes graphiques
22/09/23 06:47 PM 33
Classe [Link]
Représente une chaîne de caractères
Constructeurs:
String s = new String();
String s = new String("hello");
Quelques méthodes:
int length();
char charAt(int pos);
boolean equals(Object o);
int indexOf(char c);
String substring(int debut, int fin);
22/09/23 06:47 PM 34
Classe [Link]
Représente un ensemble ordonné d'éléments
Constructeur :
Vector v = new Vector();
Quelques méthodes:
int size();
boolean isEmpty();
boolean contains(Object o);
Object elementAt(int pos);
void setElementAt(Object o, int pos);
void addElement(Object o);
22/09/23 06:47 PM 35
Classe [Link]
Pas de constructeur
Uniquement des méthodes et variables static:
[Link], Math.E
double cos(double a);
double sqrt(double a);
double pow(double a, double b);
int round(float a);
int max(int a, int b);
22/09/23 06:47 PM 36
Attributs d'instance ou de classe
Une variable ou méthode appartient à une
instance sauf si elle est static auquel cas elle
appartient à la classe.
Attribut d'instance Attribut de classe
public String getTitre() … Class Integer {…
s'appelle sur un objet static int MAX_VALUE…}
s'appelle sur une classe
Livre monLivre = newLivre();
[Link]();
int val = Integer.MAX_VALUE;
[Link]();
22/09/23 06:47 PM 37
La relation d'héritage
22/09/23 06:47 PM 38
Introduction
Premier niveau d'abstraction :
Distinction entre instance et classe
•La propriété d'héritage permet de généraliser plusieurs classes
pour manipuler des entités à un plus haut niveau d'abstraction.
•Par exemple, des classes Voiture, Camion, Moto peuvent
être généralisées en une classe Véhicule.
Avantages :
Effectuer un même traitement sur des objets de classes
différentes;
Éviter la redondance de structure.
22/09/23 06:47 PM 39
Introduction
Concrètement, l'héritage consiste à factoriser des attributs
communs à plusieurs classes.
Lecteur Employé
String nom; String nom;
String prenom; String prenom;
String adresse; String adresse;
Statut statut;
Livre[] emprunts;
22/09/23 06:47 PM 40
Introduction
Personne
String nom;
String prenom;
String adresse;
Lecteur Employé
Statut statut;
Livre[] emprunts;
Les classes Lecteur et Employé héritent de la classe Personne
22/09/23 06:47 PM 41
Héritage des données
Si la classe CompteEpargne hérite de la
Compte classe Compte, les données de Compte
double solde; seront encapsulées dans CompteEpargne.
Client proprietaire;
Les instances de Compte ont les données :
solde
propriétaire
Les instances de CompteEpargne ont les
CompteEpargne données :
solde
double txInteret; propriétaire
txInteret
22/09/23 06:47 PM 42
Héritage des méthodes
Les méthodes de la classe Compte sont
Compte
encapsulées dans la classe CompteEpargne.
double solde;
Client proprietaire; Les instances de Compte peuvent invoquer
void passer(Ordre) les méthodes :
double consulter()
void passer(Ordre)
double consulter()
Les instances de CompteEpargne peuvent
CompteEpargne invoquer les méthodes :
double txInteret; void passer(Ordre)
double ajoutInteret() double consulter()
double ajoutInteret()
22/09/23 06:47 PM 43
Héritage des méthodes
public class Compte {
…
public void passer(Ordre o) {
if ([Link] = = this) {
solde = solde – [Link];
} else {
solde = solde + [Link];
}
}
Problème: si…la classe CompteEpargne doit calculer des intérêts
}
temporaires après chaque Ordre, la méthode passer(Ordre) de
Compte n'est pas valide.
Heritage impossible ? Modification de Compte ?
22/09/23 06:47 PM 44
Surcharge de méthodes
La surcharge est la pratique consistant à écrire
Compte
dans une classe B, héritant d'une classe A, une
double solde; méthode qui existe dans la classe A.
Client proprietaire;
void passer(Ordre) Pour qu'une méthode de B surcharge une méthode de
double consulter() A, il faut que leurs signatures soient exactement
identiques (nom, type des paramètres d'entrée, type
de retour).
Les instances de CompteEpargne peuvent invoquer les
CompteEpargne méthodes :
double txInteret; consulter() de la classe Compte
double ajoutInteret() ajoutInteret() et passer(Ordre) de la classe
void passer(Ordre) CompteEpargne
22/09/23 06:47 PM 45
Exemple de surcharge
public class CompteEpargne extends Compte {
…
public void passer(Ordre o) {
int periode = calculerPeriode();
float interets = (solde * txInteret) * (periode/365);
interetsTemporaires = interetsTemporaires + interets;
[Link](o);
}
public CompteEpargne(float sol, Client prop) {
super(sol,prop);
}
}
22/09/23 06:47 PM 46
Polymorphisme
Le polymorphisme est la faculté d'effectuer un traitement
différent pour l'appel d'un même symbole.
Le traitement dépend du receveur
Exemple :
Tous les objets instances de la classe Compte ou d'une sous-
classe de Compte ont une méthode passer(Ordre).
L'appel à la méthode passer(Ordre) effectue un traitement
dépendant de la classe de l'objet par lequel elle est invoquée.
Il n'est parfois pas important de connaître la nature précise du
traitement.
22/09/23 06:47 PM 47
Polymorphisme
Les comptes débiteur et créditeur d'un objet Ordre peuvent être
des objets de la classe Compte ou d'une sous-classe de Compte
(CompteEpargne, CompteCheque, …)
public void passerListe(Ordre[ ] o) {
for (int i = 0; i < [Link]; i++) {
Compte deb = [Link];
Compte cre = [Link];
[Link](o);
[Link](o);
}
}
22/09/23 06:47 PM 48
L'héritage est transitif
Compte La classe CompteEpargne
classe Compte encapsule
CompteEpargneBloque
CompteChèque encapsule ::
La encapsule :
double solde; solde,
solde,
encapsule
propriétaire, txInteret
: propriétaire
Client proprietaire; passer(Ordre)
passer(Ordre)
solde, proprietaire,
[de
[de txInteret,
[deCompte]
CompteEpargne]
Compte]
void passer(Ordre) retirer(double)
double ajoutInteret()
duree
void passer(Ordre) [de
CompteEpargneBloque]
CompteCheque CompteEpargne double ajoutInteret()
retirer(double) double txInteret;
double ajoutInteret()
void passer(Ordre) CompteEpargneBloque
Date duree;
void passer(Ordre)
22/09/23 06:47 PM 49
Interfaces & classes abstraites
22/09/23 06:47 PM 50
Héritage multiple
Certains langages de programmation orienté-objet autorisent une
classe à hériter de plusieurs classes.
Rectangle Losange
String description() { String description() {
return "4 angles droit"; return "4 côtés égaux";
} }
Carre
Si description() n'est pas surchargée quelle méthode doit être appelée pour les
objets de la classe Carré ?
22/09/23 06:47 PM 51
Héritage multiple
Les langages OO proposent des solutions diverses à ce problème :
Tout conflit provoque une erreur de compilation (AGL,
certains compilateurs C++);
Une priorité d'héritage est définie
La résolution des conflits est aléatoire (certains compilateurs
C++).
Le problème de l'héritage multiple concerne les traitements et
non les signatures de méthode. Le langage Java :
interdit l'héritage multiple;
propose d'utiliser des interfaces pour simuler l'héritage
multiple.
22/09/23 06:47 PM 52
Interfaces
Une interface déclare les méthodes que certaines classes
doivent obligatoirement implémenter.
Une interface :
ne contient aucune donnée;
contient des signatures de méthodes;
n'associe aucune implémentation à ses méthodes.
Si une classe implémente une interface, elle doit contenir les
méthodes décrites dans l'interface en y associant un traitement.
une classe peut implémenter plusieurs interfaces;
une interface ne peut pas être instanciée;
une interface peut hériter d'une autre interface.
22/09/23 06:47 PM 53
Exemple d'interface
Personne
String nom;
String adresse;
Employé Client
double salaire; Compte compte;
double getSalaire() {…} Compte getCompte() {…}
Si un employé peut ou non être aussi un client, comment faire ?
22/09/23 06:47 PM 54
Exemple d'interface
Client Personne
String nom;
Compte renvoieCompte();
String adresse;
ClientExterne Employé
Compte compte; double salaire;
Compte getCompte() {…} double getSalaire() {…}
ClientInterne
Compte compte;
Compte getCompte() {…}
22/09/23 06:47 PM 55
Exemple d'interface
public interface Client {
public Compte renvoieCompte();
}
public class ClientExterne extends Personne implements Client {
private Compte compte;
public Compte renvoieCompte() {
return compte;
}
}
22/09/23 06:47 PM 56
Niveaux d'abstraction des objets
Pas de données Données
Classe Interface Classe
Pas de méthodes
Classe abstraite Classe abstraite
Classe Classe
Traitements des méthodes
Classe abstraite Classe abstraite
Interface
Signatures des méthodes Classe abstraite Classe ?
abstraite
22/09/23 06:47 PM 57
Classes abstraites
Une classe abstraite est une classe dont certaines méthodes ne
sont pas implémentées.
Une classe abstraite ne peut pas être instanciée;
Une classe abstraite peut hériter d'une classe (abstraite ou
non)
Une classe abstraite peut implémenter plusieurs interfaces
(sans être obligée d'implémenter leurs méthodes)
Une classe peut hériter d'une seule classe (abstraite ou non)
Si une classe hérite d'une classe abstraite, elle doit
implémenter toutes ses méthodes abstraites (sans traitement)
ou être elle aussi abstraite.
22/09/23 06:47 PM 58
Exemple de classe abstraite
Salarie
double salaire;
double getSalaire() {
return salaire;
}
verserSalaire();
ClientInterne Employe
Compte compte; verserSalaire() {
Compte getCompte() {…} envoyerCheque(salaire);
verserSalaire() { }
[Link](salaire);
}
22/09/23 06:47 PM 59
Exemple de classe abstraite
public abstract class Salarie {
protected float salaire;
public float renvoieSalaire {
return salaire;
}
public abstract void verserSalaire();
}
public class ClientInterne extends Salarie {
Compte compte;
public void verserSalaire() {
[Link](salaire);
}
}
22/09/23 06:47 PM 60
Gestion des exceptions
22/09/23 06:47 PM 61
Notion d'exception
En Java, les erreurs se produisent lors d'une
exécution sous la forme d'exceptions.
Une exception :
est un objet, instance d'une classe d'exception
provoque la sortie d'une méthode
correspond à un type d'erreur
contient des informations sur cette erreur
22/09/23 06:47 PM 62
Classes d'exceptions
Une classe d'exception hérite de [Link].
Elle correspond à un type d'erreur et encapsule des informations
relatives à l'erreur qui s'est produite.
La méthode public String getMessage() renvoie une chaîne de
caractères décrivant l'exception.
IndexOutOfBoundsException
NullPointerException
NumberFormatException
ClassCastException
22/09/23 06:47 PM 63
Déclaration des exceptions possibles
Chaque méthode doit déclarer dans sa signature les
exceptions qu'elle peut émettre.
La liste des exceptions possible est indiquée à la fin de
la signature par throws suivi des classes d'exceptions
concernées.
public static int parseInt(String s) throws NumberFormatException
{
…
}
22/09/23 06:47 PM 64
Émission et création d'exceptions
Lorsqu'une erreur est détectée dans une méthode, il faut :
1. Créer un objet d'une classe d'exception
2. Émettre l'exception
int getValue(int pos) throws IndexOutOfBoundsException {
if (pos > [Link])
throw new IndexOutOfBoundsException("trop grand");
else return tab[pos];
}
22/09/23 06:47 PM 65
Traitement des exceptions
Si une méthode peut émettre une exception (ou appelle
une autre méthode qui peut en émettre une) il faut :
soit propager l'exception (la méthode doit l'avoir
déclarée);
soit intercepter et traiter l'exception.
22/09/23 06:47 PM 66
Propagation d'exceptions
public int ajouter(int a, String str) throws NumberFormatException
int b = [Link](str);
a = a + b;
return a;
}
22/09/23 06:47 PM 67
Interception d'exceptions
public int ajouter(int a, String str) {
try {
int b = [Link](str);
a = a + b;
} catch (NumberFormatException e) {
[Link]([Link]());
}
return a;
}
22/09/23 06:47 PM 68