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

Java Discussion :

Redéfinir une méthode static dans une classe dérivée


Sujet :

Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Points : 114
    Points
    114
    Par défaut Redéfinir une méthode static dans une classe dérivée
    Bonjour,

    je lis dans un ouvrage "Programmer en JAVA " Claude Delannoy Editions Eyrolles 2008 p 207 ceci

    "Remarques
    1 Une méthode de classe (static) ne peut pas être redéfinie dans une classe dérivée. Cette restriction va de soi puisque c’est le type de l’objet appelant une méthode qui permet de choisir entre la méthode de la classe de base et celle de la classe dérivée. Comme une méthode de classe peut être appelée sans être associée à un objet, on comprend qu’un tel choix ne soit plus possible."

    Pourtant voici le code suivant qui semble démentir cela

    Aurais-je mal compris ? Merci pour votre avis

    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
     
    package heritage;
     
    class Ca
    {
    	public static int thode (int i,int j)
    	{
    		System.out.println("Voici la methode static de Ca : " + i + " " +  j);
    		return i+j;
    	}
    }
     
     
    class Cb extends Ca
     
    {
    	public static int thode (int i,int j)
    	{
    		System.out.println("Voici la methode static de Cb : " + i + " " +  j);
    		return i+j;
    	}
    }
     
     
    public class methode_static {
     
    	public static void main(String[] args) {
    		Ca ca = new Ca();
    		int retour = ca.thode(12,13);
    		System.out.println(retour);
     
    		Cb cb = new Cb();
    		int retour2 = cb.thode(78,79);
    		System.out.println(retour2);
    		}
    }
    Résultat :

    Voici la methode static de Ca : 12 13
    25
    Voici la methode static de Cb : 78 79
    157

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Tu n'appelles pas la méthode de manière "static"

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Ce sont des notions qui se comprennent mieux avec l'expérience.

    Ce qu'il faut comprendre ici, c'est que la méthode n'est pas redéfinie. Elle est juste définie.
    Redéfinir une méthode permet de réaliser un comportement polymorphique : deux objets qu'on appelle de la même façon ne vont pas forcément avoir le même comportement, parce qu'ils ne sont pas forcément de la même classe et que leurs classes n'implémentent pas forcément cette méthode de la même façon.

    Ici, il n'y a pas d'objet. Oui, tu as fait new Ca() et new Cb() mais ça n'a aucun effet, puisque les méthodes sont static et se fichent complètement des objets.

    Ton code est équivalent à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    new Ca(); // construire un objet et l'oublier tout de suite
    int retour = Ca.thode(12,13);
    System.out.println(retour);
     
    new Cb(); // construire un objet et l'oublier tout de suite
    int retour2 = Cb.thode(78,79);
    System.out.println(retour2);
    Et c'est la manière correcte de l'écrire (encore qu'en général, on évitera de créer des objets pour rien.)

    Donc, pas d'objet ici. Pas d'objet, donc pas de polymorphisme. Pas de polymorphisme, donc pas de redéfinition.

    Pour s'en convaincre, essayer le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Ca ca = new Ca();
    int retour = ca.thode(12,13);
    System.out.println(retour);
     
    Ca cb = new Cb();
    int retour2 = cb.thode(78,79);
    System.out.println(retour2);
    Dans les deux cas c'est la méthode de la classe Ca qui est appelée. Pourquoi ? Parce que ce sont des méthodes static, et donc il n'y a pas d'objet, il n'y a que des classes. Et la classe à prendre, c'est le type de la variable, pas l'objet qu'elle contient (puisque je le répète, c'est static et donc il n'y a pas d'objet.) Le type de la variable cb, c'est Ca. Donc la méthode static appelée, c'est celle de Ca.

    Maintenant, même bout de code, mais en enlevant les static.
    L'un appelle Ca, l'autre appelle Cb. Parce que l'objet est un Cb, même si la variable est de type Ca. C'est ça le polymorphisme. C'est ça, redéfinir.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Points : 114
    Points
    114
    Par défaut thelvin
    Grand merci Thelvin pour cet exposé détaillé

    Delannoy s'exprime aussi "mal" en disant

    " Une méthode de classe (static) ne peut pas être redéfinie dans une classe dérivée

    MAIS grâce à ton post, j'ai remis les choses en place.

    Bonne soirée

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Ça dépend s'il a clairement exprimé ce que veut dire "redéfinir," et je veux bien croire qu'il ne l'a pas fait.

    De fait, une méthode static ne peut pas être redéfinie, puisque redéfinir implique de créer un comportement polymorphique, que le polymorphisme repose sur les objets, et que ce qui est static ignore les objets.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 1
    Points : 2
    Points
    2
    Par défaut
    Bonjour
    la réponse et claire , ce qui m'a permis de bien comprendre qu'en java les termes sont essentiels;quand on perle de redéfinition je pense c'est par rapport au polymorphisme; sinon on parlerait de définition tout simplement.

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

Discussions similaires

  1. arrayList dans une méthode recupérer dans une autre méthode
    Par toufik34 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 31/07/2013, 09h45
  2. Utiliser une méthode non-static dans une méthode static
    Par mcfly37 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 18/08/2010, 11h41
  3. obtenir le nom de la classe dans une méthode static
    Par einboubou dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 13/11/2009, 16h46
  4. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  5. Réponses: 16
    Dernier message: 26/10/2006, 16h17

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