as
Architecture des Systèmes d’Information
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage
Programmation - Classes et H´ eritage -
Nicolas Malandain
March 1, 2005
Programmation - Classes et H´eritage - 1 / 38
as
Architecture des Systèmes d’Information
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage
1 Quelques sp´ecificateurs static
final
2 Types ´enum´er´es Pr´esentation Exemples
3 H´eritage R´eutilisation En Java Polymorphisme La classe Object
Programmation - Classes et H´eritage - 2 / 38
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage static final
Attributs et M´ ethodes de classe
Propri´et´es
Les membresstatic:
ne sont pas attach´es `a une instance ont une existence avant instanciation ne peuvent acc´eder aux membres non static sont partag´es par toutes les instances
Syntaxe
class NomClasse {
acc`es static type attribut;
acc`es static type methode(...);
}
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage static final
Attributs de classe
initialis´es dans la classe (au chargement) acc`es par la classe ou une instance
Utilisation : information commune `a des instances (constantes), compteur de r´ef´erences, . . .
M´ethodes de classe
ne peuvent acc´eder qu’aux membresstatic acc`es par la classe ou une instance
Utilisation : boite `a outils (Math), manipulation d’instances de la classe, . . .
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage static final
Initialisateur static
Permet l’initialisation complexe de membresstatic
Syntaxe
class NomClasse { static {
// instructions }
}
Programmation - Classes et H´eritage - 5 / 38
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage static final
Exemples
ClasseCompteur.java
packagefr.insarouen.asi.cours2;
public class ClasseCompteur { private static int compteur=0;
public ClasseCompteur() { compteur++;
}
public static int getNbObjetConstruits() { returncompteur;
}
public static voidmain(String[] args) {
System.out.println("Nb objets construits : "+ClasseCompteur.getNbObjetConstruits());
ClasseCompteur[] cc=newClasseCompteur[10];
for(inti=0;i<10;i++) cc[i]=newClasseCompteur();
System.out.println("Nb objets construits : "+ClasseCompteur.getNbObjetConstruits());
} }
Programmation - Classes et H´eritage - 6 / 38
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage static final
Hasard.java
packagefr.insarouen.asi.cours2;
importjava.util.Random;
public class Hasard {
private static final int NB_VAL = 20;
private static int[] sequenceAleatoire =new int[NB_VAL];
private Random aleatoire;
static {
Random alea=new Random();
for(inti=0; i<NB_VAL; i++)
sequenceAleatoire[i]=alea.nextInt()%100;
}
public Hasard() {
aleatoire =new Random(System.currentTimeMillis());
}
public int getNombre() {
returnsequenceAleatoire[aleatoire.nextInt()%NB_VAL];
} }
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage static final
Les significations de final
final= non modifiable
En fonction du contexte final type attribut type simple : valeur constante type objet : r´ef´erence constante
type nomMethode(final type param, ...) le param`etre est constant (cf. ci-dessus) final type nomMethode(...)
la m´ethode ne peut ˆetre red´efinie lors d’un h´eritage private→final
final class NomClasse ...
la classe ne peut ˆetre d´eriv´ee
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage static final
Constantes
Initialisation
Toute constante doit ˆetre initialis´ee : soit `a la d´eclaration
soit dans le constructeur (ou initialisateurstatic) l’initialisation peut ˆetre :
`
a la compilation : la valeur est disponible et elle est plac´ee en dur
`
a l’ex´ecution : la constante est initialis´ee `a l’ex´ecution
Deux “types” de constantes constante d’instance
initialis´ee `a l’instanciation, une constante par instance constante de classe
d´eclar´ee static(init au chargement), une constante unique
Programmation - Classes et H´eritage - 9 / 38
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage static final
Exemples
Constantes.java
packagefr.insarouen.asi.cours2;
public class Constantes {
public final intvaleurentiere=42;
public final intvaleurAleatoire=(int)(Math.random()*100);
public static final intVALEUR_PLANCHER=200;
public final int[] tableau={1,2,3};
public final intvaleurentiere2;
public Constantes(intvalent) { valeurentiere2=valent;
// valeurentiere=valent;
// VALEUR_PLANCHER=13;
}
public static voidmain(String[] args) { Constantes cnsts=newConstantes(4);
// cnsts.valeurentiere2=3;
// cnsts.tableau=new int[5];
cnsts.tableau[0]=5;
} }
Programmation - Classes et H´eritage - 10 / 38
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage Pr´esentation Exemples
D´ efinition et syntaxe
D´efinition
Un type ´enum´er´e permet de d´efinir explicitement un ensemble ordonn´e de valeurs.
Syntaxe
enum NomTypeEnum {VAL1,VAL2, ..., VALn};
D´efinition interne `a une classe (inline) ou externe (publicou non)
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage Pr´esentation Exemples
Syntaxe et fonctionnalit´es
unenum est une classe (d´erive dejava.lang.Enum) les valeurs sontpublic static final
comparaison via==ouequals()
impl´emente l’interfacejava.lang.Comparable dispose des m´ethodestoString()etvalueOf()a ordinal()⇒position, values()⇒it´eration
a`a la red´efinition de l’une, l’autre doit toujours avoir la fonctionnalit´e inverse
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage Pr´esentation Exemples
Genre.java
packagefr.insarouen.asi.cours2;
publicenum Genre {MASCULIN, FEMININ};
Informaticien.java
packagefr.insarouen.asi.cours2;
public classInformaticien {
// un enum dans une classe est static
publicenum Type {NOUVEAU, DEBUTANT, CONFIRME, GOUROU};
private Type type;
private Genre genre;
publicInformaticien(Type _type, Genre _genre) { type=_type;
genre=_genre;
}
publicInformaticien(String strType, String strGenre) { type=Type.valueOf(strType);
genre=Genre.valueOf(strGenre);
}
publicString toString() {
return"Informaticien "+genre.toString().toLowerCase()+" "+type.toString().toLowerCase();
} }
Programmation - Classes et H´eritage - 13 / 38
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage Pr´esentation Exemples
EnumTest.java
package fr.insarouen.asi.cours2;
public class EnumTest {
public static void main(String[] args) {
Informaticien inf1 = new Informaticien(Informaticien.Type.NOUVEAU, Genre.MASCULIN);
Informaticien inf2 = new Informaticien("GOUROU","FEMININ");
System.out.println(inf1);
System.out.println(inf2);
} }
Programmation - Classes et H´eritage - 14 / 38
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
La r´ eutilisation des classes
La r´eutilisation de classes
La relation “a un” : la composition une classe `a pour attribut une classe.
Par exemple : une personne `a une adresse
La relation “est un” : l’h´eritage
une classe (d´eriv´ee) est d´efinie `a partir d’une autre classe (base) Par exemple : un homme est un mammif`ere
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
Vocabulaire de l’h´eritage
h´eriter⇔´etendre⇔d´eriver
super-classe⇔classe de base⇔classe m`ere sous-classe⇔classe d´eriv´ee⇔classe fille
Caract´eristiques de l’h´eritage cr´eation d’un nouveau type
contenant les membres du type de base (m´ethodes + attributs) les objets acceptent les messages des objets de la classe de base la classe d´eriv´ee est du type de la classe de base
Comment diff´erencier la nouvelle classe ajouter des nouveaux comportements red´efinir (changer) des comportements
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
Utilisation en Java
H´eritage
class ClasseFille extends ClasseMere { // attributs
// constructeurs et m´ethodes }
superetsuper()
superacc`ede aux attributs (en cas de masquage) et m´ethodes de la classe m`ere
super()appelle un contructeur de la classe m`ere
Remarque
Java ne permet pas l’h´eritage multiple
Programmation - Classes et H´eritage - 17 / 38
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
Surcharge & Red´ efinition
Surcharge(technique non li´ee `a l’h´eritage)
Cr´eer une m´ethode de mˆeme nom qu’une autre mais avec une signature diff´erente (ordre, type et nombre de param`etres).
Lors de l’envoi de message, le choix de la m´ethode a appeller se fait `a la compilation (invocation statique).
Red´efinition
Cr´eer une m´ethode de mˆeme signature qu’une m´ethode de la classe m`ere, ce qui modifie le comportement pour un mˆeme envoi de message.
Dans ce cas, le choix de la m´ethode `a appeller se fait `a l’ex´ecution (invocation dynamique)
Masquage
Dans une classe fille un attribut de mˆeme nom que dans la classe m`ere masque ce dernier (acc`es viasuper)
Programmation - Classes et H´eritage - 18 / 38
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
Trois types de polymorphisme
ad-hoc(surcharge)
m´ethodes de mˆeme nom aux fonctionnalit´es similaires dans une mˆeme classe ou dans des classes diff´erentes
par h´eritage (sp´ecialisation)
red´efinition d’une m´ethode d’une classe m`ere dans une classe fille possibilit´e d’envoyer un message `a un objet sans se soucier de son type
exemple : classespiece,pion,fou,roi,... et une m´ethodedeplacer
param´etrique (g´en´ericit´e) cf. cours suivants
possibilit´e de d´efinir des m´ethodes g´en´eriques (abstraction des types) exemple : m´ethode de tri quelque soit le type des objets `a trier
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
Le Polymorphisme (par h´ eritage)
Utilit´e
D´efinir un comportement commun dans une classe de base D´ecliner un comportement diff´erent dans des sous-classes Ne pas se soucier du type manipul´e (via la classe de base)
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
Exemple
Heritage.java
packagefr.insarouen.asi.cours2;
public classHeritage {
public static voidmain(String[] args) { Personne p1=newPersonne(Genre.MASCULIN);
Personne p2=newInformaticien2(Informaticien2.Type.DEBUTANT);
Personne p3=newMathematicien(Mathematicien.Type.CONFIRME);
Personne p4=newGeek();
Entreprise entreprise=newEntreprise(5);
entreprise.recrute(p1);
entreprise.recrute(p2);
entreprise.recrute(p3);
entreprise.recrute(p4);
entreprise.execute();
} }
Programmation - Classes et H´eritage - 21 / 38
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
Entreprise.java
packagefr.insarouen.asi.cours2;
public classEntreprise { privatePersonne[] equipe;
private intplace=0;
public Entreprise(inttailleEquipe) { equipe =newPersonne[tailleEquipe];
}
public booleanrecrute(Personne p) { if (place < equipe.length) {
equipe[place++]=p;
return true;
} return false;
}
public voidexecute() { for(inti=0; i<place; i++) {
System.out.println("--- "+equipe[i]+" ---");
equipe[i].cycleVie();
} } }
Programmation - Classes et H´eritage - 22 / 38
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
Personne.java
packagefr.insarouen.asi.cours2;
public class Personne { private Genre genre;
publicPersonne(Genre _genre) { genre=_genre;
}
publicPersonne(String strGenre) { genre=Genre.valueOf(strGenre);
}
public voidcycleVie() { manger();
sortir();
dormir();
}
public voidcycleVie(intnbcycles) { for(inti=0; i<nbcycles; i++)
cycleVie();
}
public voidmanger() {
System.out.println("je mange");
}
public voidsortir() {
System.out.println("ouais super, on va en boite");
}
public voiddormir() {
System.out.println("Rrrrrrr zzzzzzz Rrrrrrr zzzzzzzz");
}
publicString toString() {
return"Personne "+genre.toString().toLowerCase();
} }
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
Mathematicien.java
packagefr.insarouen.asi.cours2;
public class MathematicienextendsPersonne {
publicenum Type {NOUVEAU, DEBUTANT, CONFIRME, GOUROU};
private Type type;
publicMathematicien(Type _type) { super(Genre.MASCULIN);
type=_type;
}
publicMathematicien(Type _type, Genre genre) { super(genre);
type=_type;
}
public voidsortir() {
System.out.println("On s’fait une r´eunion sur les SVM");
}
public voidresoudreEquations() {
System.out.println("P(A|B) = P(AnB)/P(B)");
}
publicString toString() {
return super.toString()+" : mathematicien ("+getType()+")";
}
publicType getType() { returntype;
}
public voidcycleVie() { manger();
resoudreEquations();
sortir();
dormir();
} }
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
Informaticien2.java
packagefr.insarouen.asi.cours2;
public class Informaticien2extendsPersonne { // un enum dans une classe est static
publicenum Type {NOUVEAU, DEBUTANT, CONFIRME, GOUROU};
private Type type;
publicInformaticien2(Type _type) { super(Genre.MASCULIN);
type=_type;
}
publicInformaticien2(Type _type, Genre genre) { super(genre);
type=_type;
}
public voiddevelopper() {
System.out.println("je d´eveloppe, tu d´eveloppes, il d´eveloppe, ...");
}
publicString toString() {
return super.toString()+" : informaticien ("+getType()+")";
}
public voidcycleVie() { manger();
developper();
sortir();
dormir();
}
public Type getType() { returntype;
} }
Programmation - Classes et H´eritage - 25 / 38
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
Geek.java
packagefr.insarouen.asi.cours2;
public classGeekextendsInformaticien2 { public Geek() {
super(Type.GOUROU,Genre.MASCULIN);
}
public Geek(Type type, Genre genre) { super(type,genre);
}
public voiddevelopper() {
System.out.println("je script `a mort un truc r´evolutionnaire");
}
public voiddormir() {
System.out.println("Rrrrrrr zzzz; make bzImage ; Rrrrrrr zzzzz");
}
public voidsortir() {
System.out.println("je participe `a une bug squash party");
}
public String toString() {
return super.toString()+" avec comportement de geek" ; }
}
Programmation - Classes et H´eritage - 26 / 38
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
Constructeur
H´eritage & Constructeurs
pas d’h´eritage des constructeurs
appel des constructeurs des classes de base en premier
Fonctionnement
Le contructeur appelle par d´efaut le constructeur par d´efaut de la classe m`ere.
Modification du comportement :
Appel explicite `a un constructeur de la classe m`ere via super()
Syntaxe
ConstructeurClassFille( [param`etres] ) {
super( [param`etres] ); // appel au constructeur de la classe m`ere // code du constructeur
}
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
Constructeurs & m´ ethodes polymorphes
Explication du probl`eme
Si un constructeur d’une classe m`ere appelle une m´ethode red´efinie dans une classe fille, c’est cette m´ethode red´efinie qui est appell´ee.
ConstructeurEtPolymorphisme.java
packagefr.insarouen.asi.cours2;
public class ConstructeurEtPolymorphisme { public static voidmain(String[] args) {
B b=newB();
System.out.println(b);
} } class A {
int vara;
publicA() { methode();
}
public voidmethode() { vara=3;
}
publicString toString() { return"A(vara:"+vara+")";
} }
classBextendsA { intvarb;
publicB() { varb=10;
}
public voidmethode() { varb++;
}
publicString toString() {
return super.toString()+"B(varb:"+varb+")";
} }
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
Finalize
Red´efinition definalize
En cas de red´efinition definalize, il est important de respecter la structure de code suivante :
void finalize() {
super.finalize() // appel obligatoire // code
}
Programmation - Classes et H´eritage - 29 / 38
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
Object
Description
Objectest la super classe de toutes les classes (java.lang.object)son h´eritage est implicite.
Quelques m´ethodes
public String toString() protected Object clone() public boolean equals(Object) public int hashCode()
protected void finalize() public final Class getClass() void notify(), void notifyAll()
void wait() , void wait(long), void wait(long, int)
Programmation - Classes et H´eritage - 30 / 38
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
La m´ ethode toString
Fonction
Retourne une chaˆıne de caract`ere d´ecrivant l’objet (par d´efaut la classe) ainsi que le r´esultat de la m´ethodehashCode.
Appel´ee automatiquement si il y a besoin d’une chaˆıne de caract`eres.
Utilisation
Red´efinir la m´ethode pour retourner les informations souhait´ees (´etat de l’objet, valeurs, . . . )
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
La m´ ethode equals
Red´efinition (squelette classique) public boolean equals(Object o) {
return o!=null && getClass()==o.getClass()
&& test des attributs ; --- ou ---
return (o instanceof Demo) && test des attributs ; // des tests plus ‘‘compliqu´es’’ peuvent ^etre faits }
Remarques
commutative, r´eflexive, transitive
x.equals(y)⇒x.hashCode()==y.hashCode()
la red´efinition deequals()n´ecessite la red´efinition dehashCode() Non red´efinition deequals= test de l’´egalit´e des r´ef´erences
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
La m´ ethode clone
Fonctionnement
m´ethode d’Object= copie bit `a bit copie de surface
m´ethodeprotecteddansObject n´ecessite une red´efinition public doit impl´ementer l’interfaceCloneable
Programmation - Classes et H´eritage - 33 / 38
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
Squelette declone
class Demo implements Cloneable { // attributs
public Object clone() { Object copie=null;
try {
copie=super.clone();
}
catch (CloneNotSupportedException e) { e.printStackTrace(System.err);
}
// code de copie sp´ecifique du contenu de l’objet return copie;
} }
Programmation - Classes et H´eritage - 34 / 38
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
Exemple
EqualsClone.java
package fr.insarouen.asi.cours2;
public class EqualsClone {
public static void main(String[] args) {
PersonneEC p1 = new PersonneEC("Hoposte Fid`ele",194092890,10,01,1938);
PersonneEC p2 = new PersonneEC("Dipachair Deborah",294092890,12,8,1980);
PersonneEC p3;
System.out.println("p1.equals(p2) : "+p1.equals(p2));
System.out.println("p1.equals(p1) : "+p1.equals(p1));
p3 = (PersonneEC)p1.clone();
System.out.println("p1.equals(p3) : "+p1.equals(p3));
p3.setDateNaissance(12, 01, 1944);
System.out.println("p1.equals(p3) : "+p1.equals(p3));
} }
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
EqualsClone.java
class PersonneECimplementsCloneable {// code de classe incomplet privateString nomComplet;
private intnumSecu;
privateDateNaissance dateNaissance;
public booleanequals(Object o) {// ne tient pas compte du numSecu if (!(oinstanceofPersonneEC))
return false;
PersonneEC p = (PersonneEC) o;
returnnomComplet.equals(p.nomComplet) && dateNaissance.equals(p.dateNaissance);
}
public inthashCode() {// ne doit pas tenir compte de numSecu (cf equals) returnnomComplet.hashCode()+dateNaissance.hashCode();
}
public Object clone() { Object copie=null;
try {
copie=super.clone();
}
catch(CloneNotSupportedException e) { e.printStackTrace(System.err);
}
// PersonneEC copiePersonneEC = (PersonneEC)copie;
// dateNaissance = (DateNaissance)copiePersonneEC.dateNaissance.clone(); // copie en profondeur returncopie;
}
public String toString() {
returnnomComplet+"("+dateNaissance+") : "+numSecu;
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
EqualsClone.java
class DateNaissanceimplementsCloneable {// code de classe incomplet intjour, mois, annee;
public voidset(int_jour,int_mois,int_annee) { jour = _jour; mois = _mois; annee = _annee;
}
publicString toString() { returnjour+"/"+mois+"/"+annee;
}
public booleanequals(Object o) { if (!(oinstanceofDateNaissance))
return false;
DateNaissance dn=(DateNaissance)o;
returnjour==dn.jour && mois==dn.mois && annee==dn.annee;
}
public inthashCode() {
return(""+jour+mois+annee).hashCode();
}
publicObject clone() { Object copie=null;
try {
copie=super.clone();
}
catch(CloneNotSupportedException e) { e.printStackTrace(System.err);
} returncopie;
} }
Programmation - Classes et H´eritage - 37 / 38
Plan Quelques sp´ecificateurs Types ´enum´er´es H´eritage R´eutilisation En Java Polymorphisme La classe Object
Ex´ecution
p1.equals(p2) : false p1.equals(p1) : true p1.equals(p3) : true p1.equals(p3) : true
Ex´ecution avec retrait des commentaires p1.equals(p2) : false
p1.equals(p1) : true p1.equals(p3) : true p1.equals(p3) : false
Programmation - Classes et H´eritage - 38 / 38