IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Super classes et sous-classes/Méthodes


Sujet :

Langage Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 42
    Points
    42
    Par défaut Super classes et sous-classes/Méthodes
    Bonjour,
    Pourquoi staff[0].getsalary() qui soit disant est de type employé mais fait référence à un objet de type manager appelle getsalary() ( dans la classe Manager),
    mais que Staff[0].getBonus() ne marche pas?
    Si Staff[0].getBonus,ne marche pas, staff[0].getsalary devrait appeller alors getsalary() de la classe Employée?
    Merci à vous


    j'ai l'exemple suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    import java.util.*;
     
    public class ManagerTest
    {  
       public static void main(String[] args)
       {  
          // construct a Manager object
          Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);
          boss.setBonus(5000);
     
          Employee[] staff = new Employee[3];
     
          // fill the staff array with Manager and Employee objects
     
          staff[0] = boss;
          staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);
          staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15);
     
     
     
          // print out information about all Employee objects
          for (Employee e : staff)
             System.out.println("name=" + e.getName()
                + ",salary=" + e.getSalary());
       }
    }
     
    class Employee
    {  
       public Employee(String n, double s, int year, int month, int day)
       {  
          name = n;
          salary = s;
          GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
          hireDay = calendar.getTime();
       }
     
       public String getName()
       {
          return name;
       }
     
       public double getSalary()
       {  
          return salary;
       }
     
       public Date getHireDay()
       {  
          return hireDay;
       }
     
       public void raiseSalary(double byPercent)
       {  
          double raise = salary * byPercent / 100;
          salary += raise;
       }
     
       private String name;
       private double salary;
       private Date hireDay;
    }
     
    class Manager extends Employee
    {  
       /**
          @param n the employee's name
          @param s the salary
          @param year the hire year
          @param month the hire month
          @param day the hire day
       */
       public Manager(String n, double s, int year, int month, int day)
       {  
          super(n, s, year, month, day);
          bonus = 0;
       }
     
       public double getSalary()
       { 
     
    	   double baseSalary = super.getSalary();
          return baseSalary + bonus;
       }
     
       public void setBonus(double b)
       {  
          bonus = b;
       }
     
       private double bonus;
    }
    Pourquoi staff[0].getsalary() qui soit disant est de type employé mais fait référence à un objet de type manager appelle getsalary() ( dans la classe Manager),
    mais que Staff[0].getBonus() ne marche pas?
    Si Staff[0].getBonus,ne marche pas, staff[0].getsalary devrait appeller alors getsalary() de la classe Employée?

  2. #2
    Membre confirmé Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Points : 649
    Points
    649
    Par défaut
    Pour commencer, il y a pas de methode getBonus() dans ta classe Manager.... mais bon, pour mon explication je vais suppose que c'est une simple erreur de copie/colle

    Ton objet staff[0] est declare en tant qu'objet "Employe", cela signifie donc que tu ne peux appeler uniquement les methodes de la classe "Employe" ... donc comme getBonus() n'y fait pas parti, tu ne peux pas l'appeler. Si tu veux l'appeler, il faut que tu signifies clairement que c'est un Manager en faisant un cast par exemple.

    Ensuite, lorsque tu appele la methode getSalary() sur staff[0] ( tu as le droit car toutes les objets de type employe on cette methode ), que ce passe-t-il ? Et bien c'est la que le fait que staff[0] soit un Manager va rentrer en jeux... car staff[0], bien qu'etant defini comme "Employe" et un "Manager", cela signifie que lorsque l'on appele la methode getSalary(), c'est la methode de Manager qui est appele.

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Ton "boss" reste du type Manager même si il est caster en Employee...
    Donc quand tu appelles la méthode getSalary(), c'est bien la méthode getSalary() de Manager qui est appellé...

    Pour t'en convaincre : affiche le vrai nom de la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (Employee e : staff) {
             System.out.println("class=" + e.getClass().getName() );
             System.out.println("name=" + e.getName()
                + ",salary=" + e.getSalary());
    }

    C'est le principe du polymorphisme.
    Pour plus de détail :
    http://java.developpez.com/livres/pe...&page=0#00.001

    a++

  4. #4
    Membre confirmé Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Points : 558
    Points
    558
    Par défaut Re: Super classes et sous-classes/Méthodes
    Citation Envoyé par smag
    Pourquoi staff[0].getsalary() qui soit disant est de type employé mais fait référence à un objet de type manager appelle getsalary() ( dans la classe Manager),
    mais que Staff[0].getBonus() ne marche pas?
    Si Staff[0].getBonus,ne marche pas, staff[0].getsalary devrait appeller alors getsalary() de la classe Employée?
    Staff[0] est aussi de type employé donc tu peux appeler la methode getSalary(). Cependant la methode appelé est la plus approprié (donc celle de la classe Manager puisque staff[0] est de type Manager). Le choix de la méthode appelé est fait par la JVM à l'execution.
    Tu ne peux pas ecire staff[0].getBonus() car tu ne sais pas a l'avance si staff[0] est de type Employe ou de type Manager. Comme ton tableau staff est un tableau d'Employe, tu ne peux utiliser que les methodes définie dans cette classe mais les methode appeler seront celle des classes fille si ces methodes ont été surchargé.
    Si tu ve forcer l'appel a la methode getSalary car tu est certain que tu a affaire a un objet de type Manager, tu peux "caster" ton object comme ceci : ((Manager)staff[0]).getSalary()
    Si ton objet n'est pas de type Manager, une exception sera levé a l'execution
    Librairie d'accès LDAP en Java : LdapBeans
    et pensez au tag

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 42
    Points
    42
    Par défaut Re: Super classes et sous-classes/Méthodes
    Tu ne peux pas ecrire staff[0].getBonus() car tu ne sais pas a l'avance si staff[0] est de type Employe ou de type Manager.
    En fait c'est cette phrase que j'attendais;Je savais comment faire, mais je voulais comprendre le pourquoi de la chose
    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. méthodes de classe et sous-classe
    Par dancingmad dans le forum Langage
    Réponses: 4
    Dernier message: 17/01/2009, 17h16
  2. Réponses: 2
    Dernier message: 25/12/2008, 20h51
  3. Classe et sous-classe : Visibilité
    Par JohnNC dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2008, 13h38
  4. [Reflection] Obtenir les sous-classes d'une classe
    Par El Saigneur dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 11/06/2007, 07h14
  5. [POO] Organiser ses classes (en sous classes)
    Par alexfrere dans le forum Langage
    Réponses: 5
    Dernier message: 20/03/2007, 13h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo