SlideShare ist ein Scribd-Unternehmen logo
1 von 97
Downloaden Sie, um offline zu lesen
Concepts OO HĂ©ritage




                       1
Plan

1.   HĂ©ritage
2.   Polymorphisme
3.   Surcharge
4.   this & super
5.   Final
6.   Variables & méthodes statiques
7.   cast


                                      2
2.HĂ©ritage et polymorphisme


ïź   L’hĂ©ritage permet de crĂ©er des classes
    par combinaison de classes déjà
    existantes




                                             3
4
HĂ©ritage et polymorphisme
DĂ©finition de l’hĂ©ritage
ïź   Lorsqu’une classe hĂ©rite d’une autre classe,
    elle bénéficie automatiquement de ses
    dĂ©finitions d’attributs et de mĂ©thodes.
ïź   Elle peut y ajouter ses propres dĂ©finitions, ce
    qui permet facilement de constituer un
    ensemble fonctionnellement plus riche.
ïź   Les liens d’hĂ©ritage spĂ©cifient une hiĂ©rarchie
    de classe qui peut ĂȘtre constituĂ©e par une
    démarche de spécialisation, ou au contraire
    de généralisation.
                                                  5
ïź   Il est courant en programmation de crĂ©er un modĂšle
    de quelque chose, par exemple, un employé
    (Employee), puis de s’apercevoir qu’on a besoin
    d’un modùle de quelque chose qui est une version
    spĂ©cialisĂ©e de ce modĂšle d’origine.
ïź   Dans ce cas prĂ©cis, nous pourrions vouloir un
    modùle de manager (Manager). Il est clair qu’un
    manager est un employé, mais un employé
    présentant des caractéristiques supplémentaires.
    Considérez les exemples de déclarations de classes
    suivants :


                                                     6
public class Employee {   public class Manager {
String name;              String name;
Date hireDate;            Date hireDate;
Date dateOfBirth;         Date dateOfBirth;
String jobTitle;          String jobTitle;
int grade;                int grade;
}                         String department;
                          Employee [] subordinates;
                          }




                                                  7
ïź   On s’aperçoit qu’il y a des partie
    redondantes.
ïź   En rĂ©alitĂ©, plusieurs champs sont applicables
    Ă  Employee et sont aussi requis par la classe
    Manager .




                                                8
ïź   Note – L’utilisation du copier-coller dans un
    éditeur ne résoud pas le problÚme car les
    soucis de mise Ă  jour subsistent.
ïź   Si la classe Employee est modifiĂ©e, vous
    devrez probablement aussi mettre Ă  jour
    Manager.




                                                    9
ïź   Dans les langages orientĂ©s-objet, des
    mécanismes spéciaux sont fournis pour
    permettre au programmeur de définir une
    classe en fonction d’une classe dĂ©jĂ  dĂ©finie :
    c’est l’hĂ©ritage.
ïź   Dans Java, cette opĂ©ration s’effectue Ă  l’aide
    du mot-clé extends de la façon suivante :



                                                 10
public class Manager
public class Employee     extends Employee {
  {                     String department;
String name;            Employee []
Date hireDate;            subordinates;
Date dateOfBirth;       }
String jobTitle;
int grade;
}

                                               11
12
ïź   La classe Manager est dĂ©finie maintenant
    pour comporter toutes les variables et
    mĂ©thodes qu’un employĂ© possĂšde.
ïź   Toutes ces variables et mĂ©thodes sont
    héritées de la définition de la classe parent.
ïź   Le programmeur n’a plus qu’à dĂ©finir des
    fonctions supplémentaires, ou, comme nous
    le verrons bientĂŽt, indiquer les modifications
    Ă  appliquer.
                                                     13
ïź   Note – Cette approche marque un grand
    progrĂšs en matiĂšre de mise Ă  jour et donc de
    fiabilité.
ïź   Lors d’une correction dans la classe
    Employee, la classe Manager est corrigée
    sans intervention du programmeurt.




                                               14
ïź   HĂ©ritage simple
ïź   Java permet Ă  une classe de s’élargir
    (extend) relativement Ă  une seule autre
    classe.
ïź   Cette restriction est appelĂ©e hĂ©ritage simple.
ïź   Certains langages permettent de dĂ©finir une
    classe à partir de plusieurs autres, c’est
    l’hĂ©ritage multiple qui n’existe pas dans Java.

                                                  15
ïź La classe Object est la classe mĂšre de toutes
  les classes
ïź Par dĂ©faut

class Personne extends Object {



}




                                              16
17
Spécialisation des méthodes

ïź On considĂšre deux classes liĂ©es par
  l'héritage. Par exemple :
class Employee {


}
class Manager extends Employee {


}

                                        18
ïź Souvent une mĂ©thode est dĂ©finie dans la
  classe de base, mais a besoin d'ĂȘtre "affinĂ©e"
  dans la classe dérivée. On a par exemple :
class Employee {
void calculPrime() {
// une prime pour un employe


}
}

                                               19
ïź   Les deux mĂ©thodes de ces deux classes ont
    mĂȘme signature.
ïź   On dit que la mĂ©thode calculPrime() de la
    classe Manager spécialise la méthode
    calculPrime() de la classe Employee.




                                                20
Polymorphisme

ïź   Le nom de la mĂ©thode calculPrime()
    dénote alors 2 codes distincts.
ïź   Autrement dit l'identificateur calculPrime
    représente "plusieurs formes" de code
    distinct.
ïź   On parle de polymorphisme.




                                                 21
ïź On utilise le polymorphisme Ă  l'aide d'une
  référence d'objet de classe de base. Par
  exemple on Ă©crit en Java :
Employee e = new Employee();
e.calculPrime(); // lance la methode
  calculPrime() de la classe Employee




                                               22
ïź mais aussi
Employee e = new Manager();
e.calculPrime(); // lance la methode
  calculPrime() de la classe Manager




                                       23
ïź   Un des avantages de ceci est de pouvoir
    utiliser une seule référence e de la classe
    Employee pour référencer un Employee ou
    un Manager.
ïź   C'est possible car un Manager (classe
    dérivée de la classe Employee) est un
    Employee : sémantique de l'héritage. Mais 




                                              24
ïź   
 le gros avantage du polymorphisme est de
    pouvoir référencer des objets sans connaßtre
    à la compilation véritablement leur classe, et
    de pouvoir par la suite, Ă  l’exĂ©cution lancer le
    code approprié à cet objet.
ïź   Tout ceci au moment de l'exĂ©cution du
    programme (et non pas Ă  la compilation).



                                                   25
ïź   Polymorphisme = liaison dynamique
ïź   Au moment de la compilation, le compilateur ne sait
    pas si c'est la méthode calculPrime() de la classe
    Employee ou celui de la classe Manager qui sera
    lancé.
ïź   Autrement dit, la liaison entre l'identificateur
    calculPrime() et le code à lancer est déterminé à
    l'exécution du programme (suivant le choix de
    l'utilisateur du programme).
ïź   On dit alors que la liaison est dynamique.

                                                      26
ïź   Remarquer que si e rĂ©fĂšre un Manager,
    l'appel de la méthode calculPrime() de la
    classe Employee n'est pas fait (sauf si
    mentionner explicitement par le programmeur
    dans le code de la méthode calculPrime() de
    la classe Manager).
ïź   Le code Ă  lancer est dĂ©terminĂ© suivant la
    classe de l'objet et non pas la classe de la
    référence à cet objet.

                                               27
ïź Comment cela fonctionne ?
ïź Java est dit un langage objet pur (comme Smalltalk et
  contrairement à C++) car le mécanisme de recherche de la
  méthode à lancer est automatique et systématique sans que le
  programmeur ait à le préciser.
ïź En Java un appel comme :
e.calculPrime();
ïź recherche, au moment de l'exĂ©cution l'objet rĂ©fĂ©rencĂ© par e.
ïź Connaissant alors l'objet, l'interprĂ©teur cherche, si dans la classe
  de cet objet, cette méthode existe. Si c'est le cas, cette méthode
  est lancée et le processus est terminé. Si ce n'est pas le cas,
  l'interpréteur refait cette recherche dans la classe de base et le
  processus est relancé sur cette classe de base, jusqu'à trouver
  une telle méthode.
ïź Si une telle mĂ©thode n'est pas trouvĂ©e, une exception est levĂ©e.



                                                                     28
ïź   Ce mĂ©canisme qui a le mĂ©rite d'ĂȘtre simple
    pour le programmeur, a l'inconvĂ©nient d'ĂȘtre
    indéterministe en temps de recherche et de
    pouvoir ĂȘtre lent Ă  l'exĂ©cution (d'oĂč un autre
    mécanisme déterministe proposé dans des
    langages comme C++).




                                                     29
ïź   En conclusion
ïź   Il est fondamental de voir que pour utiliser le
    polymorphisme, il faut :
       exploiter le mĂ©canisme d'hĂ©ritage sur les classes
        ou utiliser des interfaces.
       rĂ©fĂ©rencer les objets par la classe de base ou par
        l’interface.




                                                         30
public class Manager
public class Employee     extends Employee {
  {                     String department;
String name;            Employee []
Date hireDate;            subordinates;
Date dateOfBirth;       }
String jobTitle;
int grade;
}

                                               31
class Societe                     public void affichePrime(){
{                                 for (int i=0;i<compteur;i++){
Employe [] tabEmpl;               System.out.println
int compteur=0;                   (tabEmpl[i].calculPrime());
Societe(int taille)
                                  }
{
tabEmpl = new Employe[taille];    }
}                                 public static void main(String []
public void recuter(Employe e){       args){
tabEmpl[compteur]=e;              Societe s = new Societe();
compteur++;                       s.recruter(new Employe());
}                                 s.recruter(new Manager());
                                  s.affichePrime();
                                  }
                                  }


                                                                      32
‱ DĂ©finition du polymorphisme

ïź   Lorsqu’un objet est instanciĂ© d’une classe, il peut
    ĂȘtre vu comme instance de n’importe laquelle des
    classes héritées par la classe dont il est instancié.
ïź   En fait l’instance d’un tel objet est toutes les
    classes Ă  la fois.
ïź   Le rectangle r1 est Ă  la fois un objet de la classe
    Rect et un objet de la classe ObjetGraphique.
ïź   Le polymorphisme permet donc d’écrire :
    ObjectGraphique r = new Rect();


                                                            33
Définition de la redéfinition
(redéfinir une méthode héritée)

ïź  Lorsqu’un attribut ou une mĂ©thode ont Ă©tĂ© dĂ©finis dans une
  classe et sont redéfinis dans une classe dérivée (qui en
  hérite), les éléments visibles sont ceux redéfinis dans la
  classe dérivée. Les éléments de la classe de base (héritée)
  sont alors masqués.
Class Rect extends ObjetGraphique {
void move(int dx, int dy);
...
}
Class Cercle extends ObjetGraphique{
void move(int dx, int dy);
...
}

                                                                34
MĂ©thode toString




                   35
   Returns a string representation of the object. In general,
    the toString method returns a string that "textually
    represents" this object. The result should be a concise but
    informative representation that is easy for a person to read.
    It is recommended that all subclasses override this method.
    The toString method for class Object returns a string
    consisting of the name of the class of which the object is an
    instance, the at-sign character `@', and the unsigned
    hexadecimal representation of the hash code of the object.
    In other words, this method returns a string equal to the
    value of:
   getClass().getName() + '@' +
    Integer.toHexString(hashCode())
   Returns:
    ïź   a string representation of the object.


                                                                36
public class Personne {
String nom,prenom;
public static void main(String
  args[]){
Personne p = new Personne();
System.out.println(p);
}
}

                                 37
Personne@de6ced




                  38
public class Personne {
String nom,prenom;
public static void main(String
  args[]){
Personne p = new Personne();
//System.out.println(p);
System.out.println(p.toString());
}
}
                                    39
ïź   Afficher une rĂ©fĂ©rence c’est faire appel Ă  la
    méthode toString()




                                                    40
public class Personne extends Object{
String nom,prenom;
public String toString(){return « nom=«
  +nom+ « prenom=»+prenom;}
public static void main(String args[]){
Personne p = new Personne();
p.nom=«a »,p.prenom=« b »;
System.out.println(p);
//System.out.println(p.toString());
}
}

                                          41
nom=jo prenom=ji




                   42
Surcharge de méthodes
ïź Une classe peut contenir plusieurs mĂ©thodes de mĂȘme
  fonctionalitĂ© mais d’arguments diffĂ©rents.
ïź Par exemple une mĂ©thode conçue pour sortir une reprĂ©sentation
  textuelle de son argument.
ïź Cette mĂ©thode sera nommĂ©e print().

ïź La mĂ©thode d’impression pour imprimer diffĂ©rents types de
  données tels que int, float et String nécessitent une mise en
  forme différente et probablement un traitement différent.
ïź Vous pourriez crĂ©er ces mĂ©thodes baptisĂ©es respectivement
printint(int arg),
printfloat(float arg) et printString(String arg). Cette
solution est néanmoins fastidieuse.



                                                             43
ïź Java permet de rĂ©utiliser un mĂȘme nom de mĂ©thode pour
  plusieurs fonctionalités.
ïź Cette solution ne fonctionne que si le compilateur peut distinguer
  quelle méthode est effectivement requise.
ïź  Dans le cas des trois mĂ©thodes d’impression, il est possible de
  faire cette distinction sur la base des types des arguments.
ïź En rĂ©utilisant le nom de la mĂ©thode, nous obtenons les trois
  méthodes ci-aprÚs :
public void print(int i)
public void print(float f)
public void print(String s)
ïź Lorsque vous Ă©crivez du code pour appeler l’une de ces
  méthodes, la méthode appropriée est choisie en fonction du type
  des arguments que vous fournissez.


                                                                   44
ïź   Les mĂ©thodes surchargĂ©es sont soumises Ă 
    certaines rĂšgles :
       La liste d’arguments de l’instruction appelante doit ĂȘtre
        suffisamment différente pour que la méthode à appeler
        puisse ĂȘtre dĂ©terminĂ©e sans ambiguĂŻtĂ©. Des promotions
        d’élargissement normales (par exemple, float -> double)
        pourraient ĂȘtre appliquĂ©es, qui risqueraient de crĂ©er la
        confusion dans certains cas.
       Le type de retour des mĂ©thodes peut ĂȘtre diffĂ©rent, mais
        cette différence seule ne suffit pas. Les types de la liste
        d’argument des diffĂ©rentes mĂ©thodes surchargĂ©es doivent
        impérativement différer.
ïź   La surcharge est aussi appelĂ© parfois la
    surdéfinition.

                                                                      45
ïź   Il ne faut pas confondre les notions de
    surcharge (ou surdéfinition) et
    polymorphisme (ou liaison dynamique) qui
    ont finalement peu de point commun.
ïź   Voici un tableau qui rĂ©sume les diffĂ©rences :




                                                    46
47
Référence this

ïź   En Java, lors de l’écriture d’une mĂ©thode
    vous pouvez faire rĂ©fĂ©rence Ă  l’objet courant
    (qui a lancĂ© cette mĂ©thode) Ă  l’aide de
    lŽidentificateur this. On utilise cette référence
    dans les cas:




                                                        48
Premier cas

ïź   Passage de la rĂ©fĂ©rence de lÂŽobjet courant Ă  la
    méthode :
ïź   // les mĂ©thodes drawImage() de la classe Graphics
ïź   drawImage( . . . , this);
ïź   ....
ïź   // doivent informer rĂ©guliĂšrement l’objet courant
ïź   // de l’état d’avancement du chargement de l’image.




                                                      49
ïź   Supposons qu’un Cercle possĂšde une
    rĂ©fĂ©rence sur la FenĂȘtre graphique Ă  laquelle
    il est attaché




                                                50
51
ïź   Association et usage de this
ïź   - Le this permet Ă  un objet d’obtenir une rĂ©fĂ©rence sur lui-mĂȘme. Ceci est
    trùs utile lorsqu’un objet a besoin de laisser “une carte de visite” à un autre
    objet pour lui dire “c’est moi qui t’ai contactĂ©, voici par quelle rĂ©fĂ©rence tu
    peux m’utiliser”.
ïź   Avec l’exemple, voici ce qui se produit :
       1. Cercle dĂ©finit un attribut fenetre qui va permettre Ă  chaque instance de
        rĂ©fĂ©rencer sa fenĂȘtre (celle oĂč il est affichĂ©).
       2. Dans ce cas, un Cercle n’est pas propriĂ©taire de la fenĂȘtre dans laquelle il se
        trouve. Le constructeur de Cercle n’est pas responsable de la crĂ©ation de la
        fenĂȘtre. Celle-ci est crĂ©Ă©e indĂ©pendamment en dehors de la classe Cercle.
       3. L’attribut fenetre de Cercle est mis Ă  jour par la mĂ©thode placer()
       4. Fenetre possĂšde une liste de Cercles. La mĂ©thode placer() gĂšre la
        suppression du cercle dans l’ancienne fenĂȘtre et l’ajout dans la nouvelle, en
        invoquant ajouter() et enlever() de la classe Fenetre. Ces méthodes prennent en
        paramĂštre un Cercle. Celui-ci n’est autre que le receveur de la mĂ©thode placer(),
        référenc par this.




                                                                                        52
LevĂ©e d’une ambiguitĂ© :

class Client {
String nom ;
String clientID ;
....
Client(String nom, String ID) {
this.nom = nom ;
clientID = ID ; // this implicite
}
....
}

                                    53
ïź   Exemple de this explicite




                                54
ïź Appel d'un constructeur de la mĂȘme classe :
public MaClasse(int a, int b) {
...
}
public MaClasse(int c) {
this(c, 0);
}
public MaClasse() {
this(10);
}

                                                55
public class Personne {
String nom,prenom;
Public void affiche(){
System.out.println(this);
//System.out.println(this.toString());
//System.out.println(toString());
}
public String toString(){return « nom=« +nom+ «
   prenom=»+prenom;}
public static void main(String args[]){
Personne p = new Personne();
//System.out.println(p);
System.out.println(p.toString());
}
}


                                                  56
Référence super

ïź   En Java, lors d’un hĂ©ritage vous pouvez dans
    une méthode de la classe dérivée référencer
    la partie provenant de la classe de base Ă 
    l’aide de l®identificateur super.




                                               57
Premier cas :

class ClientRegulier extends Client {
double ristourne;
public String toString() {
return super.toString() + "ristourne=" +
ristourne;
. . .
}
}
class Client {
String nom ;
String clientID ;
public String toString() {
return "nom=" + nom + " id=" + clientID;
}
}


                                           58
ïź  DeuxiĂšme cas :
ïź Appel d'un constructeur de classe de base :

class ClientRegulier extends Client {
ClientRegulier( String leNom, String id,double ris) {
super ( leNom, id);
...
}
}


                                                        59
ïź   L’instruction super( . . . ) est un appel au
    constructeur approprié de la classe de base.
ïź   Une telle instruction ne peut se trouver que
    comme premiùre instruction d’un
    constructeur.
ïź   Si un constructeur ne possĂšde pas un tel
    appel, le compilateur Java en créé
    automatiquement un qui est super().
ïź   La classe de base doit alors possĂ©der un
    constructeur sans argument.
                                               60
Classes finales

ïź Java permet d’appliquer le mot-clĂ© final aux classes et, si tel est
  le cas, la classe ne peut pas ĂȘtre sous-classĂ©e.
ïź La classe java.lang.String, par exemple, est une classe finale.

ïź Cette opĂ©ration peut ĂȘtre effectuĂ©e pour des raisons de sĂ©curitĂ©
  car elle garantit que si une méthode comporte une référence à
  une chaüne (String), il s’agit effectivement d’une vraie chaüne
  (String) et non pas d’une sous-classe quelconque qui aurait pu
  ĂȘtre ajoutĂ©e de façon pernicieuse avec un comportement
  modifié.
ïź Exemple :
public final class Integer extends Number {
. . .
}


                                                                        61
public class personne{             // accesseurs
private String prenom;             public String getPrenom(){
private String nom;                return prenom;
private int age;                   }
public personne(String P, String   public String getNom(){
   N, int age){
                                   return nom;
this.prenom=P;
                                   }
this.nom=N;
                                   public int getAge(){
this.age=age;
                                   return age;
}
                                   }
public personne(personne P){
                                   //modifieurs
this.prenom=P.prenom;
                                   public void setPrenom(String P){
this.nom=P.nom;
                                   this.prenom=P;
this.age=P.age;
                                   }
}
                                   public void setNom(String N){
public String identite(){
                                   this.nom=N;
return
   "personne("+prenom+","+nom+",   }
   "+age+")";                      public void setAge(int age){
}                                  this.age=age;
                                   }
                                   }


                                                                  62
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;
}
}

                                            63
MĂ©thodes final

ïź   Des mĂ©thodes individuelles peuvent aussi ĂȘtre
    marquées avec le motclé final. Si tel est le cas, la
    mĂ©thode ne peut pas ĂȘtre redĂ©finie dans
ïź   une classe dĂ©rivĂ©e. Il s’agit lĂ -encore de raisons de
    sécurité de façon à
ïź   ce que celui qui appelle une mĂ©thode puisse savoir
    que le
ïź   comportement qui en rĂ©sulte est le comportement
    d’origine, et non
ïź   pas un comportement subversif de remplacement.

                                                            64
ïź   Les mĂ©thodes finales sont parfois utilisĂ©es aux fins
    d’optimisation d’accĂšs lors de l’exĂ©cution puisque le
    compilateur peut générer du code provoquant un
    appel direct de la méthode plutÎt que de devoir
    utiliser l’appel traditionnel de la mĂ©thode qui
    implique une recherche Ă  l’exĂ©cution pour dĂ©cider
    de la méthode à appeler (polymorphisme).
ïź   Les mĂ©thodes marquĂ©es comme privĂ©es sont
    automatiquement finales.
ïź   La liaison dynamique n’est appliquĂ©e (optimisation)
    ni aux méthodes finales, ni aux méthodes
    statiques.*


                                                        65
Exemple :
public final String getWarningString()
  {
....
}




                                     66
Champ de données final

ïź   Une variable prĂ©fixĂ© par le modificateur final est une
    constante.
ïź   Toute tentative pour modifier la valeur d’un champs
    de donnée final génÚre une erreur de compilation.
ïź   Note – Si vous marquez une variable de type de
    rĂ©fĂ©rence, c’est-Ă -dire tout type de classe, avec le
    mot-clé final, vous rendez impossible toute
    référence de la variable à un autre objet, mais la
    modification du contenu de l’objet reste possible.
ïź   Souvent associĂ© Ă  static ce qui en fait un champ
    d’une classe ( et non d’un objet).

                                                         67
Exemple :

// dans java.lang.Math
public static final double PI =
3.14159265358979323846;
// dans java.awt.Color
public static final Color white
= new Color(255, 255, 255);
// dans un champ d'instance
private final Date
  dateCreationInstance = new Date();
                                       68
ïź // java 1.1 "final" comme contrĂŽle d'initialisation
  unique
public class Client {
public final String clientID;
...
public Client( String nom, String ID) {
clientID = ID ;
....
}
}

                                                        69
ContrĂŽle d’accĂšs Ă©voluĂ©

ïź   Outre private et public, deux niveaux de contrĂŽle d’accĂšs
    supplĂ©mentaires sont dĂ©finis dans Java pour ĂȘtre utilisĂ©s sur des
    variables et des méthodes membres.
ïź    Il s’agit des niveaux de contrĂŽle protected et du niveau "par
    défaut" (noté sans modificateur).
ïź   Une variable ou mĂ©thode possĂšde un niveau d’accĂšs "par
    défaut" si elle ne comporte pas de modificateur explicite dans sa
    déclaration.
ïź   Ce niveau implique que l’accĂšs soit autorisĂ© depuis toute
    mĂ©thode d’une classe quelconque membre du mĂȘme package
    que la cible.
ïź   On le nomme aussi accĂšs friendly.



                                                                    70
ïź   Une mĂ©thode ou une variable protĂ©gĂ©e
    (protected) est accessible depuis toute
    mĂ©thode d’une classe quelconque membre
    du mĂȘme package.
ïź   Elle est Ă©galement accessible dans d’autres
    packages dans toute mĂ©thode d’une sous-
    classe qu’en cas de manipulation d’un
    membre de l’instance courante.


                                                  71
class A{ //extends java.lang.Object
void method( A autreinstance ) {
A autre = autreinstance.clone();
// refusé par le compilateur . . .
// methode clone protected.

class B{ //extends java.lang.Object
protected Object clone() ...{
return super.clone();
// accepté par le compilateur.
. . .
}


                                      72
73
74
75
ïź   ContrĂŽle d’accĂšs : conclusion
ïź   Une interface peut ĂȘtre : public, "pas de
    modificateur", abstract.
ïź   Une classe peut ĂȘtre : public, "pas de modificateur",
    abstract, final, static (en Java1.1).
ïź   Une mĂ©thode peut ĂȘtre : public, protected, "pas de
    modificateur", private, abstract, final, native,
    static,synchronized.
ïź   Une donnĂ©e membre peut ĂȘtre : public, protected,
    "pas de modificateur", private, final, static,transient,
    volatile.

                                                           76
Passage par valeur

ïź   Java ne transmet les arguments que par
    valeur, ce qui signifie que l’argument ne peut
    pas ĂȘtre modifiĂ© par la mĂ©thode appelĂ©e.
    Lorsqu’une instance d’objet est transmise
    comme argument à une méthode, la valeur
    de l’argument est une rĂ©fĂ©rence Ă  l’objet. Le
    contenu de l’objet peut ĂȘtre modifiĂ© dans la
    mĂ©thode appelĂ©e, mais la rĂ©fĂ©rence de l’objet
    n’est jamais changĂ©e.

                                                 77
public class PassTest {
float Value;
public static void main (String args[]) {
String str;
int val;
// Créer une instance de la classe
PassTest pt = new PassTest ();
// Affecter l’entier
val = 11;
// Tenter de le modifier
pt.changedInt ( val );
// Quelle est la valeur actuelle ?
System.out.println ("Int value is:"+val);
// Affecter la chaĂźne
str = new String ("hello");
// Tenter de la modifier
pt.changeStr (str);
// Quelle est la valeur actuelle ?
System.out.println ("Str value is:"+str);


                                            78
// Maintenant définir value
pt.value = 101f;
// Changer la valeur du flottant
// via la rĂ©fĂ©rence Ă  l’objet
pt.changeObjValue (pt);
// Quelle est la valeur actuelle ?
System.out.println ( "Valeur actuelle :
" + pt.value);
}
// MĂ©thode pour changer les valeurs actuelles
public void changeInt (int value) {
value = 55;
}
public void changeStr (String value) {
value = new String ("differente");
}
public void changeObjValue (PassTest ref) {
ref.value = 99f;
}
}




                                                79
Le résultat est :
% java PassTest
Int value is: 11
Str value is: hello
Current value is: 99.0




                         80
Variable de classe

ïź   Il est parfois souhaitable d’avoir une variable
    partagĂ©e par toutes les instances d’une classe.
ïź   Cette derniĂšre peut par exemple servir de base pour
    la communication entre les instances ou pour
    conserver une trace du nombre d’instances qui ont
    été créées.
ïź   Vous pouvez obtenir cet effet en marquant la
    variable avec le mot-clé static.
ïź   Une telle variable est parfois appelĂ©e variable de
    classe pour la distinguer d’une variable de membre
    ou d’une variable d’instance.

                                                      81
public class Count {
private int serialNumber;
private static int counter = 0;
public Count () {
counter++;
serialNumber = counter;
}
}
ïź Dans cet exemple, chaque objet crĂ©Ă© reçoit un numĂ©ro de sĂ©rie
  unique commençant à un, puis incrémenté.
ïź Le compteur de variables est partagĂ© par toutes les instances.




                                                                   82
ïź   Une variable statique est une variable unique
    accessible via une instance quelconque de la
    classe.
ïź   Le plus souvent on y accĂšde Ă  l’aide du nom
    de la classe




                                                83
public class StaticVar {
public static int number;
}
public class OtherClass {
public void method() {
int x = StaticVar.number;
}
}
                            84
MĂ©thode de classe

ïź   On a parfois besoin d’une fonctionnalitĂ© sans
    pour cela devoir utiliser un objet.
ïź   Une mĂ©thode marquĂ©e avec le mot-clĂ© static
    peut ĂȘtre utilisĂ©e de cette façon et est parfois
    appelée méthode de classe.




                                                   85
public class GeneralFunction {
public static int addUp( int x, int y) {
return x + y;
}
}
public class UseGeneral {
public void method() {
int a = 9;
int b = 10;
int c = GeneralFunction.addUp(a , b);
System.out.println("addUp() gives" + c);
}
}

                                           86
ïź   Une mĂ©thode statique pouvant ĂȘtre appelĂ©e
    sans instance de la classe Ă  laquelle elle
    appartient, n’ a pas de valeur rĂ©fĂ©rence this.
ïź   Par consĂ©quent, une mĂ©thode statique ne
    peut accéder à aucune variable hormis ses
    propres arguments et variables statiques.
ïź   Toute tentative d’accĂšs Ă  des variables non
    statiques génÚre une erreur de compilation.


                                                     87
public class Wrong {
int x;
public static void main(String args[]) {
x = 9; // ERREUR DE COMPILATION !
}
}
ïź Il existe en Java beaucoup de telles mĂ©thodes par
  exemple:
int Integer.parseInt( String );
String String.valueOf( int );

                                                      88
Opérateurinstanceof

ïź Etant donnĂ© que vous pouvez accĂ©der aux objets
  en utilisant les références de leurs classes parents,
  vous souhaiterez parfois savoir ce que vous avez
  réellement.
ïź C’est le rĂŽle de cet opĂ©rateur instanceof. Supposons
  que notre hiérarchie de classes soit étendue de
  façon à ce que nous ayons :
public class Employee extends Object
public class Manager extends Employee
public class Contractor extends Employee

                                                      89
ïź   Maintenant, si vous recevez un objet par
    l’intermĂ©diaire d’une rĂ©fĂ©rence de type
    Employee, il peut ĂȘtre en rĂ©alitĂ© un Manager
    ou un (’Contractor’).
ïź   Si vous le souhaitez, vous pouvez tester
    l’utilisation de sa classe à l’aide d’instanceof
    de la façon suivante :



                                                       90
public void method(Employee e) {
if (e instanceof Manager) {
// l’appeler ‘Monsieur’
}
else if (e instanceof Contractor) {
// garder les secrets de la société
}
else {
// employé de plein droit, parler librement
}
}

                                              91
Contrainte temporaire de type : Cast

ïź   Dans les situations oĂč vous avez reçu une
    rĂ©fĂ©rence Ă  une classe parent et oĂč vous
    avez dĂ©terminĂ© que l’objet est en fait une
    sous-classe particuliĂšre en utilisant
    instanceof, vous pouvez restaurer la
    fonctionnalitĂ© complĂšte de l’objet en forçant
    la référence.



                                                    92
public class Employee {
String name;
Date hireDate;
Date dateOfBirth;
String jobTitle;
int grade;
}
public class Manager extends Employee {
String department;
Employee [] subordinates;
}

                                          93
public void method(Employee e) {
if (e instanceof Manager) {
Manager m = (Manager)e;
System.out.println(“C’est le manager
  de ” +
m.department);
}
// reste de l’opĂ©ration
}
                                       94
ïź   Si vous omettez de faire le cast, toute
    tentative pour référencer e.department
    Ă©choue, car le compilateur ne connaĂźt aucun
    membre appelé department dans la classe
    Employee.
ïź   Si vous n’effectuez pas le test avec
    instanceof, vous courrez le risque que le cast
    Ă©choue.


                                                 95
ïź   En gĂ©nĂ©ral, toute tentative de forçage d’une
    rĂ©fĂ©rence d’objet est soumise Ă  plusieurs contrĂŽles :
       Les Ă©lĂ©vations de types de donnĂ©es dans la hiĂ©rarchie de
        classes sont toujours autorisées et, en fait, ne nécessitent
        pas l’opĂ©rateur de cast, mais peuvent ĂȘtre effectuĂ©es par
        simple affectation.
       Pour les dĂ©gradations de types de donnĂ©es, le compilateur
        doit vĂ©rifier que le cast est possible. A titre d’exemple, toute
        tentative de cast d’une rĂ©fĂ©rence Manager vers une
        référence Contractor est strictement interdite puisque un
        Contractor n’est pas un Manager. L’objet sur lequel le cast
        a lieu doit ĂȘtre un objet d’une sous-classe du type de
        référence en cours.


                                                                      96
97

Weitere Àhnliche Inhalte

Was ist angesagt?

ImplĂ©mentation de l’algorithme du Simplexe En Java
ImplĂ©mentation de l’algorithme du Simplexe En JavaImplĂ©mentation de l’algorithme du Simplexe En Java
ImplĂ©mentation de l’algorithme du Simplexe En JavaRached Krim
 
Design patterns
Design patternsDesign patterns
Design patternsEric Toguem
 
Cours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyCours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyENSET, Université Hassan II Casablanca
 
Programmation orientee aspect 201401 - Ensim
Programmation orientee aspect 201401 - EnsimProgrammation orientee aspect 201401 - Ensim
Programmation orientee aspect 201401 - EnsimLaurent Broudoux
 
Modélisation par Objets - Introduction - De Merise à UML
Modélisation par Objets - Introduction - De Merise à UMLModélisation par Objets - Introduction - De Merise à UML
Modélisation par Objets - Introduction - De Merise à UMLMireille Blay-Fornarino
 
Cours de GĂ©nie Logiciel / ESIEA 2013-2014
Cours de GĂ©nie Logiciel / ESIEA 2013-2014 Cours de GĂ©nie Logiciel / ESIEA 2013-2014
Cours de GĂ©nie Logiciel / ESIEA 2013-2014 Thierry Leriche-Dessirier
 
Programmation linéniaire
Programmation linéniaire Programmation linéniaire
Programmation linéniaire Mohammed Zaoui
 
Design patterns - Exemples en Java
Design patterns - Exemples en JavaDesign patterns - Exemples en Java
Design patterns - Exemples en JavaOussama BEN KHIROUN
 
Cours de C++, en français, 2002 - Cours 2.5
Cours de C++, en français, 2002 - Cours 2.5Cours de C++, en français, 2002 - Cours 2.5
Cours de C++, en français, 2002 - Cours 2.5Laurent BUNIET
 
Igl cours 3 - introduction Ă  uml
Igl   cours 3 - introduction Ă  umlIgl   cours 3 - introduction Ă  uml
Igl cours 3 - introduction Ă  umlMohammed Amine Mostefai
 

Was ist angesagt? (18)

Modélisation avec UML
Modélisation avec UMLModélisation avec UML
Modélisation avec UML
 
ImplĂ©mentation de l’algorithme du Simplexe En Java
ImplĂ©mentation de l’algorithme du Simplexe En JavaImplĂ©mentation de l’algorithme du Simplexe En Java
ImplĂ©mentation de l’algorithme du Simplexe En Java
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Support POO Java DeuxiĂšme Partie
Support POO Java DeuxiĂšme PartieSupport POO Java DeuxiĂšme Partie
Support POO Java DeuxiĂšme Partie
 
Cours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyCours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategy
 
Chapitre3 2013 POO
Chapitre3 2013 POOChapitre3 2013 POO
Chapitre3 2013 POO
 
Uml & cas d'utilisation
Uml & cas d'utilisationUml & cas d'utilisation
Uml & cas d'utilisation
 
Programmation orientee aspect 201401 - Ensim
Programmation orientee aspect 201401 - EnsimProgrammation orientee aspect 201401 - Ensim
Programmation orientee aspect 201401 - Ensim
 
Modélisation par Objets - Introduction - De Merise à UML
Modélisation par Objets - Introduction - De Merise à UMLModélisation par Objets - Introduction - De Merise à UML
Modélisation par Objets - Introduction - De Merise à UML
 
Uml
UmlUml
Uml
 
Cours de GĂ©nie Logiciel / ESIEA 2013-2014
Cours de GĂ©nie Logiciel / ESIEA 2013-2014 Cours de GĂ©nie Logiciel / ESIEA 2013-2014
Cours de GĂ©nie Logiciel / ESIEA 2013-2014
 
Uml
UmlUml
Uml
 
Asd
AsdAsd
Asd
 
Programmation linéniaire
Programmation linéniaire Programmation linéniaire
Programmation linéniaire
 
Design patterns - Exemples en Java
Design patterns - Exemples en JavaDesign patterns - Exemples en Java
Design patterns - Exemples en Java
 
Cours de C++, en français, 2002 - Cours 2.5
Cours de C++, en français, 2002 - Cours 2.5Cours de C++, en français, 2002 - Cours 2.5
Cours de C++, en français, 2002 - Cours 2.5
 
Cours c++
Cours c++Cours c++
Cours c++
 
Igl cours 3 - introduction Ă  uml
Igl   cours 3 - introduction Ă  umlIgl   cours 3 - introduction Ă  uml
Igl cours 3 - introduction Ă  uml
 

Andere mochten auch

Derechos del paciente
Derechos del pacienteDerechos del paciente
Derechos del pacientemanuelvudoyra
 
Yelitza marina leon PRESENTACION POWER POINT
Yelitza marina leon PRESENTACION POWER POINTYelitza marina leon PRESENTACION POWER POINT
Yelitza marina leon PRESENTACION POWER POINTYelimarLeon
 
αΟÎčÎżÎžÎ­Î±Ï„Î± Ï„ÎżÏ… ÎșÏŒÏƒÎŒÎżÏ…
αΟÎčÎżÎžÎ­Î±Ï„Î± Ï„ÎżÏ… ÎșÏŒÏƒÎŒÎżÏ…Î±ÎŸÎčÎżÎžÎ­Î±Ï„Î± Ï„ÎżÏ… ÎșÏŒÏƒÎŒÎżÏ…
αΟÎčÎżÎžÎ­Î±Ï„Î± Ï„ÎżÏ… ÎșÏŒÏƒÎŒÎżÏ…filipj2000
 
Go photos 2009
Go photos 2009Go photos 2009
Go photos 2009bymafe
 
PresentaciĂłn carolina
PresentaciĂłn carolinaPresentaciĂłn carolina
PresentaciĂłn carolinaKarolina Cardenas
 
Test presentation
Test presentationTest presentation
Test presentationmchladil
 
TecnologĂŹa educativa
TecnologĂŹa educativaTecnologĂŹa educativa
TecnologĂŹa educativagabygonzsan
 
Setinil (spain)
Setinil (spain)Setinil (spain)
Setinil (spain)filipj2000
 
PresentaciĂłn151
PresentaciĂłn151PresentaciĂłn151
PresentaciĂłn151Brench Jimenez
 
Guacho sagñay maría de los ångeles.Manejo de word
Guacho sagñay maría de los ångeles.Manejo de wordGuacho sagñay maría de los ångeles.Manejo de word
Guacho sagñay maría de los ångeles.Manejo de wordmary_gs19
 
Consejos para conseguir distintas texturas sobre pastas
Consejos para conseguir distintas texturas sobre pastasConsejos para conseguir distintas texturas sobre pastas
Consejos para conseguir distintas texturas sobre pastasCaridad Yåñez Barrio
 
Zotero 3.0 - Doctorado FormaciĂłn en la Sociedad del Conocimiento
Zotero 3.0 - Doctorado FormaciĂłn en la Sociedad del ConocimientoZotero 3.0 - Doctorado FormaciĂłn en la Sociedad del Conocimiento
Zotero 3.0 - Doctorado FormaciĂłn en la Sociedad del ConocimientoEducation in the Knowledge Society PhD
 
JUVENTUD COLEGIAL
JUVENTUD COLEGIALJUVENTUD COLEGIAL
JUVENTUD COLEGIALJohifers
 

Andere mochten auch (20)

Derechos del paciente
Derechos del pacienteDerechos del paciente
Derechos del paciente
 
Yelitza marina leon PRESENTACION POWER POINT
Yelitza marina leon PRESENTACION POWER POINTYelitza marina leon PRESENTACION POWER POINT
Yelitza marina leon PRESENTACION POWER POINT
 
αΟÎčÎżÎžÎ­Î±Ï„Î± Ï„ÎżÏ… ÎșÏŒÏƒÎŒÎżÏ…
αΟÎčÎżÎžÎ­Î±Ï„Î± Ï„ÎżÏ… ÎșÏŒÏƒÎŒÎżÏ…Î±ÎŸÎčÎżÎžÎ­Î±Ï„Î± Ï„ÎżÏ… ÎșÏŒÏƒÎŒÎżÏ…
αΟÎčÎżÎžÎ­Î±Ï„Î± Ï„ÎżÏ… ÎșÏŒÏƒÎŒÎżÏ…
 
Fortiflora
FortifloraFortiflora
Fortiflora
 
Cycle puces chez le chien
Cycle puces chez le chienCycle puces chez le chien
Cycle puces chez le chien
 
Go photos 2009
Go photos 2009Go photos 2009
Go photos 2009
 
PresentaciĂłn carolina
PresentaciĂłn carolinaPresentaciĂłn carolina
PresentaciĂłn carolina
 
Test presentation
Test presentationTest presentation
Test presentation
 
Juegos!
Juegos!Juegos!
Juegos!
 
Libros
LibrosLibros
Libros
 
TecnologĂŹa educativa
TecnologĂŹa educativaTecnologĂŹa educativa
TecnologĂŹa educativa
 
Setinil (spain)
Setinil (spain)Setinil (spain)
Setinil (spain)
 
PresentaciĂłn151
PresentaciĂłn151PresentaciĂłn151
PresentaciĂłn151
 
Guacho sagñay maría de los ångeles.Manejo de word
Guacho sagñay maría de los ångeles.Manejo de wordGuacho sagñay maría de los ångeles.Manejo de word
Guacho sagñay maría de los ångeles.Manejo de word
 
Groupe1.1
Groupe1.1Groupe1.1
Groupe1.1
 
Consejos para conseguir distintas texturas sobre pastas
Consejos para conseguir distintas texturas sobre pastasConsejos para conseguir distintas texturas sobre pastas
Consejos para conseguir distintas texturas sobre pastas
 
Orient
OrientOrient
Orient
 
Zotero 3.0 - Doctorado FormaciĂłn en la Sociedad del Conocimiento
Zotero 3.0 - Doctorado FormaciĂłn en la Sociedad del ConocimientoZotero 3.0 - Doctorado FormaciĂłn en la Sociedad del Conocimiento
Zotero 3.0 - Doctorado FormaciĂłn en la Sociedad del Conocimiento
 
Kelucha
KeluchaKelucha
Kelucha
 
JUVENTUD COLEGIAL
JUVENTUD COLEGIALJUVENTUD COLEGIAL
JUVENTUD COLEGIAL
 

Ähnlich wie Java uik-chap6-poo heritage v2 java

Java uik-chap6-poo heritage v2 java
Java uik-chap6-poo heritage v2 javaJava uik-chap6-poo heritage v2 java
Java uik-chap6-poo heritage v2 javaAmel Morchdi
 
chapitre5-Classesabstraitesetinterfaces.pdf
chapitre5-Classesabstraitesetinterfaces.pdfchapitre5-Classesabstraitesetinterfaces.pdf
chapitre5-Classesabstraitesetinterfaces.pdfMoez Moezm
 
Architecture Logiciel_GRASP11111111.pptx
Architecture Logiciel_GRASP11111111.pptxArchitecture Logiciel_GRASP11111111.pptx
Architecture Logiciel_GRASP11111111.pptxafamanalafa2001
 
Pensez objets avec java
Pensez objets avec javaPensez objets avec java
Pensez objets avec javaAsmaa BENGUEDDACH
 
SOLID _Principles.pptx
SOLID _Principles.pptxSOLID _Principles.pptx
SOLID _Principles.pptxafamanalafa2001
 
Traits : de la théorie à la pratique
Traits : de la théorie à la pratiqueTraits : de la théorie à la pratique
Traits : de la théorie à la pratiqueFrederic Hardy
 
Chapitre 5 classes abstraites et interfaces
Chapitre 5  classes abstraites et interfacesChapitre 5  classes abstraites et interfaces
Chapitre 5 classes abstraites et interfacesAmir Souissi
 
System c eniso_jan_fev_07
System c eniso_jan_fev_07System c eniso_jan_fev_07
System c eniso_jan_fev_07haythem_2015
 
Formation C# - Cours 3 - Programmation objet
Formation C# - Cours 3 - Programmation objetFormation C# - Cours 3 - Programmation objet
Formation C# - Cours 3 - Programmation objetkemenaran
 
Cours java smi 2007 2008
Cours java smi 2007 2008Cours java smi 2007 2008
Cours java smi 2007 2008Khalil Lechheb
 
Cours java smi 2007 2008
Cours java smi 2007 2008Cours java smi 2007 2008
Cours java smi 2007 2008Khalil Lechheb
 
POO-JAVA-partie-1.pdf
POO-JAVA-partie-1.pdfPOO-JAVA-partie-1.pdf
POO-JAVA-partie-1.pdfYasushiTsubakik
 
Cours de C++, en français, 2002 - Cours 2.1
Cours de C++, en français, 2002 - Cours 2.1Cours de C++, en français, 2002 - Cours 2.1
Cours de C++, en français, 2002 - Cours 2.1Laurent BUNIET
 
softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...ENSET, Université Hassan II Casablanca
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !Paris Salesforce Developer Group
 

Ähnlich wie Java uik-chap6-poo heritage v2 java (20)

Java uik-chap6-poo heritage v2 java
Java uik-chap6-poo heritage v2 javaJava uik-chap6-poo heritage v2 java
Java uik-chap6-poo heritage v2 java
 
chapitre5-Classesabstraitesetinterfaces.pdf
chapitre5-Classesabstraitesetinterfaces.pdfchapitre5-Classesabstraitesetinterfaces.pdf
chapitre5-Classesabstraitesetinterfaces.pdf
 
Architecture Logiciel_GRASP11111111.pptx
Architecture Logiciel_GRASP11111111.pptxArchitecture Logiciel_GRASP11111111.pptx
Architecture Logiciel_GRASP11111111.pptx
 
Pensez objets avec java
Pensez objets avec javaPensez objets avec java
Pensez objets avec java
 
SOLID _Principles.pptx
SOLID _Principles.pptxSOLID _Principles.pptx
SOLID _Principles.pptx
 
Traits : de la théorie à la pratique
Traits : de la théorie à la pratiqueTraits : de la théorie à la pratique
Traits : de la théorie à la pratique
 
Cours java
Cours javaCours java
Cours java
 
Chapitre 5 classes abstraites et interfaces
Chapitre 5  classes abstraites et interfacesChapitre 5  classes abstraites et interfaces
Chapitre 5 classes abstraites et interfaces
 
System c eniso_jan_fev_07
System c eniso_jan_fev_07System c eniso_jan_fev_07
System c eniso_jan_fev_07
 
Formation C# - Cours 3 - Programmation objet
Formation C# - Cours 3 - Programmation objetFormation C# - Cours 3 - Programmation objet
Formation C# - Cours 3 - Programmation objet
 
Java
JavaJava
Java
 
Etude des Frameworks PHP
Etude des Frameworks PHPEtude des Frameworks PHP
Etude des Frameworks PHP
 
Cours java smi 2007 2008
Cours java smi 2007 2008Cours java smi 2007 2008
Cours java smi 2007 2008
 
Cours java smi 2007 2008
Cours java smi 2007 2008Cours java smi 2007 2008
Cours java smi 2007 2008
 
Chapitre 04 : les fonctions
Chapitre 04 : les fonctionsChapitre 04 : les fonctions
Chapitre 04 : les fonctions
 
POO-JAVA-partie-1.pdf
POO-JAVA-partie-1.pdfPOO-JAVA-partie-1.pdf
POO-JAVA-partie-1.pdf
 
Cours de C++, en français, 2002 - Cours 2.1
Cours de C++, en français, 2002 - Cours 2.1Cours de C++, en français, 2002 - Cours 2.1
Cours de C++, en français, 2002 - Cours 2.1
 
softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
 

Mehr von Amel Morchdi

Cours réseaux informatiques ia2
Cours réseaux informatiques  ia2Cours réseaux informatiques  ia2
Cours réseaux informatiques ia2Amel Morchdi
 
Cours r _seaux__chapitre_5
Cours r _seaux__chapitre_5Cours r _seaux__chapitre_5
Cours r _seaux__chapitre_5Amel Morchdi
 
Cours réseaux chap3et4
Cours réseaux chap3et4Cours réseaux chap3et4
Cours réseaux chap3et4Amel Morchdi
 
Chapitre 2 poo classe objet c++
Chapitre 2 poo classe objet c++Chapitre 2 poo classe objet c++
Chapitre 2 poo classe objet c++Amel Morchdi
 
Chapitre 2 poo classe objet c++
Chapitre 2 poo classe objet c++Chapitre 2 poo classe objet c++
Chapitre 2 poo classe objet c++Amel Morchdi
 
Jeux d instruction du 6809
Jeux d instruction du 6809Jeux d instruction du 6809
Jeux d instruction du 6809Amel Morchdi
 
Cours r _seaux_chap1et2
Cours r _seaux_chap1et2Cours r _seaux_chap1et2
Cours r _seaux_chap1et2Amel Morchdi
 
Cours réseaux informatiques iia2
Cours réseaux informatiques  iia2Cours réseaux informatiques  iia2
Cours réseaux informatiques iia2Amel Morchdi
 
Corrections td4
Corrections td4Corrections td4
Corrections td4Amel Morchdi
 
Cours s epart2
Cours s epart2Cours s epart2
Cours s epart2Amel Morchdi
 
Exam seiia2gl20111
Exam seiia2gl20111Exam seiia2gl20111
Exam seiia2gl20111Amel Morchdi
 
Attachments 2011 12_19
Attachments 2011 12_19Attachments 2011 12_19
Attachments 2011 12_19Amel Morchdi
 
Java uik-chap4-poo3
Java uik-chap4-poo3Java uik-chap4-poo3
Java uik-chap4-poo3Amel Morchdi
 
Java uik-chap3-bases java
Java uik-chap3-bases javaJava uik-chap3-bases java
Java uik-chap3-bases javaAmel Morchdi
 
Java uik-chap2-dev java
Java uik-chap2-dev javaJava uik-chap2-dev java
Java uik-chap2-dev javaAmel Morchdi
 
Java uik-chap1-intro java
Java uik-chap1-intro javaJava uik-chap1-intro java
Java uik-chap1-intro javaAmel Morchdi
 
Td serie a-abstract-cast-heritage
Td serie a-abstract-cast-heritageTd serie a-abstract-cast-heritage
Td serie a-abstract-cast-heritageAmel Morchdi
 
Seria 3 iia2 2011_2012
Seria 3 iia2 2011_2012Seria 3 iia2 2011_2012
Seria 3 iia2 2011_2012Amel Morchdi
 
Attachments 2011 12_19
Attachments 2011 12_19Attachments 2011 12_19
Attachments 2011 12_19Amel Morchdi
 
Cours s epartie2
Cours s epartie2Cours s epartie2
Cours s epartie2Amel Morchdi
 

Mehr von Amel Morchdi (20)

Cours réseaux informatiques ia2
Cours réseaux informatiques  ia2Cours réseaux informatiques  ia2
Cours réseaux informatiques ia2
 
Cours r _seaux__chapitre_5
Cours r _seaux__chapitre_5Cours r _seaux__chapitre_5
Cours r _seaux__chapitre_5
 
Cours réseaux chap3et4
Cours réseaux chap3et4Cours réseaux chap3et4
Cours réseaux chap3et4
 
Chapitre 2 poo classe objet c++
Chapitre 2 poo classe objet c++Chapitre 2 poo classe objet c++
Chapitre 2 poo classe objet c++
 
Chapitre 2 poo classe objet c++
Chapitre 2 poo classe objet c++Chapitre 2 poo classe objet c++
Chapitre 2 poo classe objet c++
 
Jeux d instruction du 6809
Jeux d instruction du 6809Jeux d instruction du 6809
Jeux d instruction du 6809
 
Cours r _seaux_chap1et2
Cours r _seaux_chap1et2Cours r _seaux_chap1et2
Cours r _seaux_chap1et2
 
Cours réseaux informatiques iia2
Cours réseaux informatiques  iia2Cours réseaux informatiques  iia2
Cours réseaux informatiques iia2
 
Corrections td4
Corrections td4Corrections td4
Corrections td4
 
Cours s epart2
Cours s epart2Cours s epart2
Cours s epart2
 
Exam seiia2gl20111
Exam seiia2gl20111Exam seiia2gl20111
Exam seiia2gl20111
 
Attachments 2011 12_19
Attachments 2011 12_19Attachments 2011 12_19
Attachments 2011 12_19
 
Java uik-chap4-poo3
Java uik-chap4-poo3Java uik-chap4-poo3
Java uik-chap4-poo3
 
Java uik-chap3-bases java
Java uik-chap3-bases javaJava uik-chap3-bases java
Java uik-chap3-bases java
 
Java uik-chap2-dev java
Java uik-chap2-dev javaJava uik-chap2-dev java
Java uik-chap2-dev java
 
Java uik-chap1-intro java
Java uik-chap1-intro javaJava uik-chap1-intro java
Java uik-chap1-intro java
 
Td serie a-abstract-cast-heritage
Td serie a-abstract-cast-heritageTd serie a-abstract-cast-heritage
Td serie a-abstract-cast-heritage
 
Seria 3 iia2 2011_2012
Seria 3 iia2 2011_2012Seria 3 iia2 2011_2012
Seria 3 iia2 2011_2012
 
Attachments 2011 12_19
Attachments 2011 12_19Attachments 2011 12_19
Attachments 2011 12_19
 
Cours s epartie2
Cours s epartie2Cours s epartie2
Cours s epartie2
 

Java uik-chap6-poo heritage v2 java

  • 2. Plan 1. HĂ©ritage 2. Polymorphisme 3. Surcharge 4. this & super 5. Final 6. Variables & mĂ©thodes statiques 7. cast 2
  • 3. 2.HĂ©ritage et polymorphisme ïź L’hĂ©ritage permet de crĂ©er des classes par combinaison de classes dĂ©jĂ  existantes 3
  • 4. 4
  • 5. HĂ©ritage et polymorphisme DĂ©finition de l’hĂ©ritage ïź Lorsqu’une classe hĂ©rite d’une autre classe, elle bĂ©nĂ©ficie automatiquement de ses dĂ©finitions d’attributs et de mĂ©thodes. ïź Elle peut y ajouter ses propres dĂ©finitions, ce qui permet facilement de constituer un ensemble fonctionnellement plus riche. ïź Les liens d’hĂ©ritage spĂ©cifient une hiĂ©rarchie de classe qui peut ĂȘtre constituĂ©e par une dĂ©marche de spĂ©cialisation, ou au contraire de gĂ©nĂ©ralisation. 5
  • 6. ïź Il est courant en programmation de crĂ©er un modĂšle de quelque chose, par exemple, un employĂ© (Employee), puis de s’apercevoir qu’on a besoin d’un modĂšle de quelque chose qui est une version spĂ©cialisĂ©e de ce modĂšle d’origine. ïź Dans ce cas prĂ©cis, nous pourrions vouloir un modĂšle de manager (Manager). Il est clair qu’un manager est un employĂ©, mais un employĂ© prĂ©sentant des caractĂ©ristiques supplĂ©mentaires. ConsidĂ©rez les exemples de dĂ©clarations de classes suivants : 6
  • 7. public class Employee { public class Manager { String name; String name; Date hireDate; Date hireDate; Date dateOfBirth; Date dateOfBirth; String jobTitle; String jobTitle; int grade; int grade; } String department; Employee [] subordinates; } 7
  • 8. ïź On s’aperçoit qu’il y a des partie redondantes. ïź En rĂ©alitĂ©, plusieurs champs sont applicables Ă  Employee et sont aussi requis par la classe Manager . 8
  • 9. ïź Note – L’utilisation du copier-coller dans un Ă©diteur ne rĂ©soud pas le problĂšme car les soucis de mise Ă  jour subsistent. ïź Si la classe Employee est modifiĂ©e, vous devrez probablement aussi mettre Ă  jour Manager. 9
  • 10. ïź Dans les langages orientĂ©s-objet, des mĂ©canismes spĂ©ciaux sont fournis pour permettre au programmeur de dĂ©finir une classe en fonction d’une classe dĂ©jĂ  dĂ©finie : c’est l’hĂ©ritage. ïź Dans Java, cette opĂ©ration s’effectue Ă  l’aide du mot-clĂ© extends de la façon suivante : 10
  • 11. public class Manager public class Employee extends Employee { { String department; String name; Employee [] Date hireDate; subordinates; Date dateOfBirth; } String jobTitle; int grade; } 11
  • 12. 12
  • 13. ïź La classe Manager est dĂ©finie maintenant pour comporter toutes les variables et mĂ©thodes qu’un employĂ© possĂšde. ïź Toutes ces variables et mĂ©thodes sont hĂ©ritĂ©es de la dĂ©finition de la classe parent. ïź Le programmeur n’a plus qu’à dĂ©finir des fonctions supplĂ©mentaires, ou, comme nous le verrons bientĂŽt, indiquer les modifications Ă  appliquer. 13
  • 14. ïź Note – Cette approche marque un grand progrĂšs en matiĂšre de mise Ă  jour et donc de fiabilitĂ©. ïź Lors d’une correction dans la classe Employee, la classe Manager est corrigĂ©e sans intervention du programmeurt. 14
  • 15. ïź HĂ©ritage simple ïź Java permet Ă  une classe de s’élargir (extend) relativement Ă  une seule autre classe. ïź Cette restriction est appelĂ©e hĂ©ritage simple. ïź Certains langages permettent de dĂ©finir une classe Ă  partir de plusieurs autres, c’est l’hĂ©ritage multiple qui n’existe pas dans Java. 15
  • 16. ïź La classe Object est la classe mĂšre de toutes les classes ïź Par dĂ©faut class Personne extends Object { 

 } 16
  • 17. 17
  • 18. SpĂ©cialisation des mĂ©thodes ïź On considĂšre deux classes liĂ©es par l'hĂ©ritage. Par exemple : class Employee { 
 } class Manager extends Employee { 
 } 18
  • 19. ïź Souvent une mĂ©thode est dĂ©finie dans la classe de base, mais a besoin d'ĂȘtre "affinĂ©e" dans la classe dĂ©rivĂ©e. On a par exemple : class Employee { void calculPrime() { // une prime pour un employe 
 } } 19
  • 20. ïź Les deux mĂ©thodes de ces deux classes ont mĂȘme signature. ïź On dit que la mĂ©thode calculPrime() de la classe Manager spĂ©cialise la mĂ©thode calculPrime() de la classe Employee. 20
  • 21. Polymorphisme ïź Le nom de la mĂ©thode calculPrime() dĂ©note alors 2 codes distincts. ïź Autrement dit l'identificateur calculPrime reprĂ©sente "plusieurs formes" de code distinct. ïź On parle de polymorphisme. 21
  • 22. ïź On utilise le polymorphisme Ă  l'aide d'une rĂ©fĂ©rence d'objet de classe de base. Par exemple on Ă©crit en Java : Employee e = new Employee(); e.calculPrime(); // lance la methode calculPrime() de la classe Employee 22
  • 23. ïź mais aussi Employee e = new Manager(); e.calculPrime(); // lance la methode calculPrime() de la classe Manager 23
  • 24. ïź Un des avantages de ceci est de pouvoir utiliser une seule rĂ©fĂ©rence e de la classe Employee pour rĂ©fĂ©rencer un Employee ou un Manager. ïź C'est possible car un Manager (classe dĂ©rivĂ©e de la classe Employee) est un Employee : sĂ©mantique de l'hĂ©ritage. Mais 
 24
  • 25. ïź 
 le gros avantage du polymorphisme est de pouvoir rĂ©fĂ©rencer des objets sans connaĂźtre Ă  la compilation vĂ©ritablement leur classe, et de pouvoir par la suite, Ă  l’exĂ©cution lancer le code appropriĂ© Ă  cet objet. ïź Tout ceci au moment de l'exĂ©cution du programme (et non pas Ă  la compilation). 25
  • 26. ïź Polymorphisme = liaison dynamique ïź Au moment de la compilation, le compilateur ne sait pas si c'est la mĂ©thode calculPrime() de la classe Employee ou celui de la classe Manager qui sera lancĂ©. ïź Autrement dit, la liaison entre l'identificateur calculPrime() et le code Ă  lancer est dĂ©terminĂ© Ă  l'exĂ©cution du programme (suivant le choix de l'utilisateur du programme). ïź On dit alors que la liaison est dynamique. 26
  • 27. ïź Remarquer que si e rĂ©fĂšre un Manager, l'appel de la mĂ©thode calculPrime() de la classe Employee n'est pas fait (sauf si mentionner explicitement par le programmeur dans le code de la mĂ©thode calculPrime() de la classe Manager). ïź Le code Ă  lancer est dĂ©terminĂ© suivant la classe de l'objet et non pas la classe de la rĂ©fĂ©rence Ă  cet objet. 27
  • 28. ïź Comment cela fonctionne ? ïź Java est dit un langage objet pur (comme Smalltalk et contrairement Ă  C++) car le mĂ©canisme de recherche de la mĂ©thode Ă  lancer est automatique et systĂ©matique sans que le programmeur ait Ă  le prĂ©ciser. ïź En Java un appel comme : e.calculPrime(); ïź recherche, au moment de l'exĂ©cution l'objet rĂ©fĂ©rencĂ© par e. ïź Connaissant alors l'objet, l'interprĂ©teur cherche, si dans la classe de cet objet, cette mĂ©thode existe. Si c'est le cas, cette mĂ©thode est lancĂ©e et le processus est terminĂ©. Si ce n'est pas le cas, l'interprĂ©teur refait cette recherche dans la classe de base et le processus est relancĂ© sur cette classe de base, jusqu'Ă  trouver une telle mĂ©thode. ïź Si une telle mĂ©thode n'est pas trouvĂ©e, une exception est levĂ©e. 28
  • 29. ïź Ce mĂ©canisme qui a le mĂ©rite d'ĂȘtre simple pour le programmeur, a l'inconvĂ©nient d'ĂȘtre indĂ©terministe en temps de recherche et de pouvoir ĂȘtre lent Ă  l'exĂ©cution (d'oĂč un autre mĂ©canisme dĂ©terministe proposĂ© dans des langages comme C++). 29
  • 30. ïź En conclusion ïź Il est fondamental de voir que pour utiliser le polymorphisme, il faut :  exploiter le mĂ©canisme d'hĂ©ritage sur les classes ou utiliser des interfaces.  rĂ©fĂ©rencer les objets par la classe de base ou par l’interface. 30
  • 31. public class Manager public class Employee extends Employee { { String department; String name; Employee [] Date hireDate; subordinates; Date dateOfBirth; } String jobTitle; int grade; } 31
  • 32. class Societe public void affichePrime(){ { for (int i=0;i<compteur;i++){ Employe [] tabEmpl; System.out.println int compteur=0; (tabEmpl[i].calculPrime()); Societe(int taille) } { tabEmpl = new Employe[taille]; } } public static void main(String [] public void recuter(Employe e){ args){ tabEmpl[compteur]=e; Societe s = new Societe(); compteur++; s.recruter(new Employe()); } s.recruter(new Manager()); s.affichePrime(); } } 32
  • 33. ‱ DĂ©finition du polymorphisme ïź Lorsqu’un objet est instanciĂ© d’une classe, il peut ĂȘtre vu comme instance de n’importe laquelle des classes hĂ©ritĂ©es par la classe dont il est instanciĂ©. ïź En fait l’instance d’un tel objet est toutes les classes Ă  la fois. ïź Le rectangle r1 est Ă  la fois un objet de la classe Rect et un objet de la classe ObjetGraphique. ïź Le polymorphisme permet donc d’écrire : ObjectGraphique r = new Rect(); 33
  • 34. DĂ©finition de la redĂ©finition (redĂ©finir une mĂ©thode hĂ©ritĂ©e) ïź Lorsqu’un attribut ou une mĂ©thode ont Ă©tĂ© dĂ©finis dans une classe et sont redĂ©finis dans une classe dĂ©rivĂ©e (qui en hĂ©rite), les Ă©lĂ©ments visibles sont ceux redĂ©finis dans la classe dĂ©rivĂ©e. Les Ă©lĂ©ments de la classe de base (hĂ©ritĂ©e) sont alors masquĂ©s. Class Rect extends ObjetGraphique { void move(int dx, int dy); ... } Class Cercle extends ObjetGraphique{ void move(int dx, int dy); ... } 34
  • 36.  Returns a string representation of the object. In general, the toString method returns a string that "textually represents" this object. The result should be a concise but informative representation that is easy for a person to read. It is recommended that all subclasses override this method. The toString method for class Object returns a string consisting of the name of the class of which the object is an instance, the at-sign character `@', and the unsigned hexadecimal representation of the hash code of the object. In other words, this method returns a string equal to the value of:  getClass().getName() + '@' + Integer.toHexString(hashCode())  Returns: ïź a string representation of the object. 36
  • 37. public class Personne { String nom,prenom; public static void main(String args[]){ Personne p = new Personne(); System.out.println(p); } } 37
  • 39. public class Personne { String nom,prenom; public static void main(String args[]){ Personne p = new Personne(); //System.out.println(p); System.out.println(p.toString()); } } 39
  • 40. ïź Afficher une rĂ©fĂ©rence c’est faire appel Ă  la mĂ©thode toString() 40
  • 41. public class Personne extends Object{ String nom,prenom; public String toString(){return « nom=« +nom+ « prenom=»+prenom;} public static void main(String args[]){ Personne p = new Personne(); p.nom=«a »,p.prenom=« b »; System.out.println(p); //System.out.println(p.toString()); } } 41
  • 43. Surcharge de mĂ©thodes ïź Une classe peut contenir plusieurs mĂ©thodes de mĂȘme fonctionalitĂ© mais d’arguments diffĂ©rents. ïź Par exemple une mĂ©thode conçue pour sortir une reprĂ©sentation textuelle de son argument. ïź Cette mĂ©thode sera nommĂ©e print(). ïź La mĂ©thode d’impression pour imprimer diffĂ©rents types de donnĂ©es tels que int, float et String nĂ©cessitent une mise en forme diffĂ©rente et probablement un traitement diffĂ©rent. ïź Vous pourriez crĂ©er ces mĂ©thodes baptisĂ©es respectivement printint(int arg), printfloat(float arg) et printString(String arg). Cette solution est nĂ©anmoins fastidieuse. 43
  • 44. ïź Java permet de rĂ©utiliser un mĂȘme nom de mĂ©thode pour plusieurs fonctionalitĂ©s. ïź Cette solution ne fonctionne que si le compilateur peut distinguer quelle mĂ©thode est effectivement requise. ïź Dans le cas des trois mĂ©thodes d’impression, il est possible de faire cette distinction sur la base des types des arguments. ïź En rĂ©utilisant le nom de la mĂ©thode, nous obtenons les trois mĂ©thodes ci-aprĂšs : public void print(int i) public void print(float f) public void print(String s) ïź Lorsque vous Ă©crivez du code pour appeler l’une de ces mĂ©thodes, la mĂ©thode appropriĂ©e est choisie en fonction du type des arguments que vous fournissez. 44
  • 45. ïź Les mĂ©thodes surchargĂ©es sont soumises Ă  certaines rĂšgles :  La liste d’arguments de l’instruction appelante doit ĂȘtre suffisamment diffĂ©rente pour que la mĂ©thode Ă  appeler puisse ĂȘtre dĂ©terminĂ©e sans ambiguĂŻtĂ©. Des promotions d’élargissement normales (par exemple, float -> double) pourraient ĂȘtre appliquĂ©es, qui risqueraient de crĂ©er la confusion dans certains cas.  Le type de retour des mĂ©thodes peut ĂȘtre diffĂ©rent, mais cette diffĂ©rence seule ne suffit pas. Les types de la liste d’argument des diffĂ©rentes mĂ©thodes surchargĂ©es doivent impĂ©rativement diffĂ©rer. ïź La surcharge est aussi appelĂ© parfois la surdĂ©finition. 45
  • 46. ïź Il ne faut pas confondre les notions de surcharge (ou surdĂ©finition) et polymorphisme (ou liaison dynamique) qui ont finalement peu de point commun. ïź Voici un tableau qui rĂ©sume les diffĂ©rences : 46
  • 47. 47
  • 48. RĂ©fĂ©rence this ïź En Java, lors de l’écriture d’une mĂ©thode vous pouvez faire rĂ©fĂ©rence Ă  l’objet courant (qui a lancĂ© cette mĂ©thode) Ă  l’aide de lÂŽidentificateur this. On utilise cette rĂ©fĂ©rence dans les cas: 48
  • 49. Premier cas ïź Passage de la rĂ©fĂ©rence de lÂŽobjet courant Ă  la mĂ©thode : ïź // les mĂ©thodes drawImage() de la classe Graphics ïź drawImage( . . . , this); ïź .... ïź // doivent informer rĂ©guliĂšrement l’objet courant ïź // de l’état d’avancement du chargement de l’image. 49
  • 50. ïź Supposons qu’un Cercle possĂšde une rĂ©fĂ©rence sur la FenĂȘtre graphique Ă  laquelle il est attachĂ© 50
  • 51. 51
  • 52. ïź Association et usage de this ïź - Le this permet Ă  un objet d’obtenir une rĂ©fĂ©rence sur lui-mĂȘme. Ceci est trĂšs utile lorsqu’un objet a besoin de laisser “une carte de visite” Ă  un autre objet pour lui dire “c’est moi qui t’ai contactĂ©, voici par quelle rĂ©fĂ©rence tu peux m’utiliser”. ïź Avec l’exemple, voici ce qui se produit :  1. Cercle dĂ©finit un attribut fenetre qui va permettre Ă  chaque instance de rĂ©fĂ©rencer sa fenĂȘtre (celle oĂč il est affichĂ©).  2. Dans ce cas, un Cercle n’est pas propriĂ©taire de la fenĂȘtre dans laquelle il se trouve. Le constructeur de Cercle n’est pas responsable de la crĂ©ation de la fenĂȘtre. Celle-ci est crĂ©Ă©e indĂ©pendamment en dehors de la classe Cercle.  3. L’attribut fenetre de Cercle est mis Ă  jour par la mĂ©thode placer()  4. Fenetre possĂšde une liste de Cercles. La mĂ©thode placer() gĂšre la suppression du cercle dans l’ancienne fenĂȘtre et l’ajout dans la nouvelle, en invoquant ajouter() et enlever() de la classe Fenetre. Ces mĂ©thodes prennent en paramĂštre un Cercle. Celui-ci n’est autre que le receveur de la mĂ©thode placer(), rĂ©fĂ©renc par this. 52
  • 53. LevĂ©e d’une ambiguitĂ© : class Client { String nom ; String clientID ; .... Client(String nom, String ID) { this.nom = nom ; clientID = ID ; // this implicite } .... } 53
  • 54. ïź Exemple de this explicite 54
  • 55. ïź Appel d'un constructeur de la mĂȘme classe : public MaClasse(int a, int b) { ... } public MaClasse(int c) { this(c, 0); } public MaClasse() { this(10); } 55
  • 56. public class Personne { String nom,prenom; Public void affiche(){ System.out.println(this); //System.out.println(this.toString()); //System.out.println(toString()); } public String toString(){return « nom=« +nom+ « prenom=»+prenom;} public static void main(String args[]){ Personne p = new Personne(); //System.out.println(p); System.out.println(p.toString()); } } 56
  • 57. RĂ©fĂ©rence super ïź En Java, lors d’un hĂ©ritage vous pouvez dans une mĂ©thode de la classe dĂ©rivĂ©e rĂ©fĂ©rencer la partie provenant de la classe de base Ă  l’aide de lÂŽidentificateur super. 57
  • 58. Premier cas : class ClientRegulier extends Client { double ristourne; public String toString() { return super.toString() + "ristourne=" + ristourne; . . . } } class Client { String nom ; String clientID ; public String toString() { return "nom=" + nom + " id=" + clientID; } } 58
  • 59. ïź DeuxiĂšme cas : ïź Appel d'un constructeur de classe de base : class ClientRegulier extends Client { ClientRegulier( String leNom, String id,double ris) { super ( leNom, id); ... } } 59
  • 60. ïź L’instruction super( . . . ) est un appel au constructeur appropriĂ© de la classe de base. ïź Une telle instruction ne peut se trouver que comme premiĂšre instruction d’un constructeur. ïź Si un constructeur ne possĂšde pas un tel appel, le compilateur Java en crĂ©Ă© automatiquement un qui est super(). ïź La classe de base doit alors possĂ©der un constructeur sans argument. 60
  • 61. Classes finales ïź Java permet d’appliquer le mot-clĂ© final aux classes et, si tel est le cas, la classe ne peut pas ĂȘtre sous-classĂ©e. ïź La classe java.lang.String, par exemple, est une classe finale. ïź Cette opĂ©ration peut ĂȘtre effectuĂ©e pour des raisons de sĂ©curitĂ© car elle garantit que si une mĂ©thode comporte une rĂ©fĂ©rence Ă  une chaĂźne (String), il s’agit effectivement d’une vraie chaĂźne (String) et non pas d’une sous-classe quelconque qui aurait pu ĂȘtre ajoutĂ©e de façon pernicieuse avec un comportement modifiĂ©. ïź Exemple : public final class Integer extends Number { . . . } 61
  • 62. public class personne{ // accesseurs private String prenom; public String getPrenom(){ private String nom; return prenom; private int age; } public personne(String P, String public String getNom(){ N, int age){ return nom; this.prenom=P; } this.nom=N; public int getAge(){ this.age=age; return age; } } public personne(personne P){ //modifieurs this.prenom=P.prenom; public void setPrenom(String P){ this.nom=P.nom; this.prenom=P; this.age=P.age; } } public void setNom(String N){ public String identite(){ this.nom=N; return "personne("+prenom+","+nom+", } "+age+")"; public void setAge(int age){ } this.age=age; } } 62
  • 63. 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; } } 63
  • 64. MĂ©thodes final ïź Des mĂ©thodes individuelles peuvent aussi ĂȘtre marquĂ©es avec le motclĂ© final. Si tel est le cas, la mĂ©thode ne peut pas ĂȘtre redĂ©finie dans ïź une classe dĂ©rivĂ©e. Il s’agit lĂ -encore de raisons de sĂ©curitĂ© de façon Ă  ïź ce que celui qui appelle une mĂ©thode puisse savoir que le ïź comportement qui en rĂ©sulte est le comportement d’origine, et non ïź pas un comportement subversif de remplacement. 64
  • 65. ïź Les mĂ©thodes finales sont parfois utilisĂ©es aux fins d’optimisation d’accĂšs lors de l’exĂ©cution puisque le compilateur peut gĂ©nĂ©rer du code provoquant un appel direct de la mĂ©thode plutĂŽt que de devoir utiliser l’appel traditionnel de la mĂ©thode qui implique une recherche Ă  l’exĂ©cution pour dĂ©cider de la mĂ©thode Ă  appeler (polymorphisme). ïź Les mĂ©thodes marquĂ©es comme privĂ©es sont automatiquement finales. ïź La liaison dynamique n’est appliquĂ©e (optimisation) ni aux mĂ©thodes finales, ni aux mĂ©thodes statiques.* 65
  • 66. Exemple : public final String getWarningString() { .... } 66
  • 67. Champ de donnĂ©es final ïź Une variable prĂ©fixĂ© par le modificateur final est une constante. ïź Toute tentative pour modifier la valeur d’un champs de donnĂ©e final gĂ©nĂšre une erreur de compilation. ïź Note – Si vous marquez une variable de type de rĂ©fĂ©rence, c’est-Ă -dire tout type de classe, avec le mot-clĂ© final, vous rendez impossible toute rĂ©fĂ©rence de la variable Ă  un autre objet, mais la modification du contenu de l’objet reste possible. ïź Souvent associĂ© Ă  static ce qui en fait un champ d’une classe ( et non d’un objet). 67
  • 68. Exemple : // dans java.lang.Math public static final double PI = 3.14159265358979323846; // dans java.awt.Color public static final Color white = new Color(255, 255, 255); // dans un champ d'instance private final Date dateCreationInstance = new Date(); 68
  • 69. ïź // java 1.1 "final" comme contrĂŽle d'initialisation unique public class Client { public final String clientID; ... public Client( String nom, String ID) { clientID = ID ; .... } } 69
  • 70. ContrĂŽle d’accĂšs Ă©voluĂ© ïź Outre private et public, deux niveaux de contrĂŽle d’accĂšs supplĂ©mentaires sont dĂ©finis dans Java pour ĂȘtre utilisĂ©s sur des variables et des mĂ©thodes membres. ïź Il s’agit des niveaux de contrĂŽle protected et du niveau "par dĂ©faut" (notĂ© sans modificateur). ïź Une variable ou mĂ©thode possĂšde un niveau d’accĂšs "par dĂ©faut" si elle ne comporte pas de modificateur explicite dans sa dĂ©claration. ïź Ce niveau implique que l’accĂšs soit autorisĂ© depuis toute mĂ©thode d’une classe quelconque membre du mĂȘme package que la cible. ïź On le nomme aussi accĂšs friendly. 70
  • 71. ïź Une mĂ©thode ou une variable protĂ©gĂ©e (protected) est accessible depuis toute mĂ©thode d’une classe quelconque membre du mĂȘme package. ïź Elle est Ă©galement accessible dans d’autres packages dans toute mĂ©thode d’une sous- classe qu’en cas de manipulation d’un membre de l’instance courante. 71
  • 72. class A{ //extends java.lang.Object void method( A autreinstance ) { A autre = autreinstance.clone(); // refusĂ© par le compilateur . . . // methode clone protected. class B{ //extends java.lang.Object protected Object clone() ...{ return super.clone(); // acceptĂ© par le compilateur. . . . } 72
  • 73. 73
  • 74. 74
  • 75. 75
  • 76. ïź ContrĂŽle d’accĂšs : conclusion ïź Une interface peut ĂȘtre : public, "pas de modificateur", abstract. ïź Une classe peut ĂȘtre : public, "pas de modificateur", abstract, final, static (en Java1.1). ïź Une mĂ©thode peut ĂȘtre : public, protected, "pas de modificateur", private, abstract, final, native, static,synchronized. ïź Une donnĂ©e membre peut ĂȘtre : public, protected, "pas de modificateur", private, final, static,transient, volatile. 76
  • 77. Passage par valeur ïź Java ne transmet les arguments que par valeur, ce qui signifie que l’argument ne peut pas ĂȘtre modifiĂ© par la mĂ©thode appelĂ©e. Lorsqu’une instance d’objet est transmise comme argument Ă  une mĂ©thode, la valeur de l’argument est une rĂ©fĂ©rence Ă  l’objet. Le contenu de l’objet peut ĂȘtre modifiĂ© dans la mĂ©thode appelĂ©e, mais la rĂ©fĂ©rence de l’objet n’est jamais changĂ©e. 77
  • 78. public class PassTest { float Value; public static void main (String args[]) { String str; int val; // CrĂ©er une instance de la classe PassTest pt = new PassTest (); // Affecter l’entier val = 11; // Tenter de le modifier pt.changedInt ( val ); // Quelle est la valeur actuelle ? System.out.println ("Int value is:"+val); // Affecter la chaĂźne str = new String ("hello"); // Tenter de la modifier pt.changeStr (str); // Quelle est la valeur actuelle ? System.out.println ("Str value is:"+str); 78
  • 79. // Maintenant dĂ©finir value pt.value = 101f; // Changer la valeur du flottant // via la rĂ©fĂ©rence Ă  l’objet pt.changeObjValue (pt); // Quelle est la valeur actuelle ? System.out.println ( "Valeur actuelle : " + pt.value); } // MĂ©thode pour changer les valeurs actuelles public void changeInt (int value) { value = 55; } public void changeStr (String value) { value = new String ("differente"); } public void changeObjValue (PassTest ref) { ref.value = 99f; } } 79
  • 80. Le rĂ©sultat est : % java PassTest Int value is: 11 Str value is: hello Current value is: 99.0 80
  • 81. Variable de classe ïź Il est parfois souhaitable d’avoir une variable partagĂ©e par toutes les instances d’une classe. ïź Cette derniĂšre peut par exemple servir de base pour la communication entre les instances ou pour conserver une trace du nombre d’instances qui ont Ă©tĂ© crĂ©Ă©es. ïź Vous pouvez obtenir cet effet en marquant la variable avec le mot-clĂ© static. ïź Une telle variable est parfois appelĂ©e variable de classe pour la distinguer d’une variable de membre ou d’une variable d’instance. 81
  • 82. public class Count { private int serialNumber; private static int counter = 0; public Count () { counter++; serialNumber = counter; } } ïź Dans cet exemple, chaque objet crĂ©Ă© reçoit un numĂ©ro de sĂ©rie unique commençant Ă  un, puis incrĂ©mentĂ©. ïź Le compteur de variables est partagĂ© par toutes les instances. 82
  • 83. ïź Une variable statique est une variable unique accessible via une instance quelconque de la classe. ïź Le plus souvent on y accĂšde Ă  l’aide du nom de la classe 83
  • 84. public class StaticVar { public static int number; } public class OtherClass { public void method() { int x = StaticVar.number; } } 84
  • 85. MĂ©thode de classe ïź On a parfois besoin d’une fonctionnalitĂ© sans pour cela devoir utiliser un objet. ïź Une mĂ©thode marquĂ©e avec le mot-clĂ© static peut ĂȘtre utilisĂ©e de cette façon et est parfois appelĂ©e mĂ©thode de classe. 85
  • 86. public class GeneralFunction { public static int addUp( int x, int y) { return x + y; } } public class UseGeneral { public void method() { int a = 9; int b = 10; int c = GeneralFunction.addUp(a , b); System.out.println("addUp() gives" + c); } } 86
  • 87. ïź Une mĂ©thode statique pouvant ĂȘtre appelĂ©e sans instance de la classe Ă  laquelle elle appartient, n’ a pas de valeur rĂ©fĂ©rence this. ïź Par consĂ©quent, une mĂ©thode statique ne peut accĂ©der Ă  aucune variable hormis ses propres arguments et variables statiques. ïź Toute tentative d’accĂšs Ă  des variables non statiques gĂ©nĂšre une erreur de compilation. 87
  • 88. public class Wrong { int x; public static void main(String args[]) { x = 9; // ERREUR DE COMPILATION ! } } ïź Il existe en Java beaucoup de telles mĂ©thodes par exemple: int Integer.parseInt( String ); String String.valueOf( int ); 88
  • 89. OpĂ©rateurinstanceof ïź Etant donnĂ© que vous pouvez accĂ©der aux objets en utilisant les rĂ©fĂ©rences de leurs classes parents, vous souhaiterez parfois savoir ce que vous avez rĂ©ellement. ïź C’est le rĂŽle de cet opĂ©rateur instanceof. Supposons que notre hiĂ©rarchie de classes soit Ă©tendue de façon Ă  ce que nous ayons : public class Employee extends Object public class Manager extends Employee public class Contractor extends Employee 89
  • 90. ïź Maintenant, si vous recevez un objet par l’intermĂ©diaire d’une rĂ©fĂ©rence de type Employee, il peut ĂȘtre en rĂ©alitĂ© un Manager ou un (’Contractor’). ïź Si vous le souhaitez, vous pouvez tester l’utilisation de sa classe Ă  l’aide d’instanceof de la façon suivante : 90
  • 91. public void method(Employee e) { if (e instanceof Manager) { // l’appeler ‘Monsieur’ } else if (e instanceof Contractor) { // garder les secrets de la sociĂ©tĂ© } else { // employĂ© de plein droit, parler librement } } 91
  • 92. Contrainte temporaire de type : Cast ïź Dans les situations oĂč vous avez reçu une rĂ©fĂ©rence Ă  une classe parent et oĂč vous avez dĂ©terminĂ© que l’objet est en fait une sous-classe particuliĂšre en utilisant instanceof, vous pouvez restaurer la fonctionnalitĂ© complĂšte de l’objet en forçant la rĂ©fĂ©rence. 92
  • 93. public class Employee { String name; Date hireDate; Date dateOfBirth; String jobTitle; int grade; } public class Manager extends Employee { String department; Employee [] subordinates; } 93
  • 94. public void method(Employee e) { if (e instanceof Manager) { Manager m = (Manager)e; System.out.println(“C’est le manager de ” + m.department); } // reste de l’opĂ©ration } 94
  • 95. ïź Si vous omettez de faire le cast, toute tentative pour rĂ©fĂ©rencer e.department Ă©choue, car le compilateur ne connaĂźt aucun membre appelĂ© department dans la classe Employee. ïź Si vous n’effectuez pas le test avec instanceof, vous courrez le risque que le cast Ă©choue. 95
  • 96. ïź En gĂ©nĂ©ral, toute tentative de forçage d’une rĂ©fĂ©rence d’objet est soumise Ă  plusieurs contrĂŽles :  Les Ă©lĂ©vations de types de donnĂ©es dans la hiĂ©rarchie de classes sont toujours autorisĂ©es et, en fait, ne nĂ©cessitent pas l’opĂ©rateur de cast, mais peuvent ĂȘtre effectuĂ©es par simple affectation.  Pour les dĂ©gradations de types de donnĂ©es, le compilateur doit vĂ©rifier que le cast est possible. A titre d’exemple, toute tentative de cast d’une rĂ©fĂ©rence Manager vers une rĂ©fĂ©rence Contractor est strictement interdite puisque un Contractor n’est pas un Manager. L’objet sur lequel le cast a lieu doit ĂȘtre un objet d’une sous-classe du type de rĂ©fĂ©rence en cours. 96
  • 97. 97