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

avec Java Discussion :

erreurs de compilation non signalées


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Par défaut erreurs de compilation non signalées
    Bonjour, sur un livre de tests java voici un test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    abstract class Bird {
        protected Bird() {
            System.out.print("Wow-");
        }
     
        private final void fly() {
            System.out.println("Bird");
        }
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class Pelican extends Bird {
        public Pelican() {
            System.out.print("Oh-");
        }
     
        protected void fly() {
            System.out.println("Pelican");
        }
     
        static void main(String[] args) {
            var chirp = new Pelican();
            chirp.fly();
        }
    }
    private final void fly() {System.out.println("Bird");} : cette méthode ne peut être appelée que depuis sa classe et ne peut pas être overridée dans une classe fille. Donc à quoi sert-elle ? et est-ce que private final est possible et ne soulève pas une erreur ?

    dans la classe fille Pelican on a : protected void fly() { System.out.println("Pelican");}. Il semble justement que c'est un override de la méthode précédemment discutée. Ca ne soulève pas une erreur ?

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 943
    Billets dans le blog
    54
    Par défaut
    Le soucis a déjà été soulevé il y a 14 ans et la réponse semble être le fait que les méthodes private ne sont pas visibles et donc pas héritées par les classes enfants (le final importe peu).

    Qui plus est, si tu crée dans Bird une méthode qui invoque fly() et que tu l'utilise depuis ton instance de Pelican tu verras que c'est bien la variante de Bird qui est invoquée. Donc il n'y a pas de surcharge. Le soucis disparaît des que tu replaces le private final void fly() par protected void fly() dans Bird.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    protected void doStuff() {
            fly();
        }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Par défaut
    merci pour ta réponse Bouye,
    il y a une chose que je n'ai pas compris: fly() dans Pelican est bien un override de fly() dans bird. Etant final dans Bird, ça soulève une erreur non

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 595
    Par défaut
    Hello,

    non, les membres en visibilité private ne sont pas visibles aux autres classes, que ce soit des classes descendantes ou pas, c'est traité comme s'ils n'existaient pas en ce qui concerne les autres classes. La notion de les redéfinir n'a donc pas de sens, ça ne sera jamais le cas.

    Les signatures de ces méthodes sont comme elles devraient être pour que l'une redéfinisse l'autre, mais puisque celle de la classe parente est private, elle est traitée par les autres classes comme si elle n'existait pas et il n'y a pas de redéfinition. Ce n'est pas une erreur. C'est juste un peu redondant de dire qu'une méthode private est final, parce que ça ne peut pas être autrement.

    (Bon, je simplifie un peu. Une méthode private est toujours final et elle est tenue à l'écart du système de redéfinitions, parce que ça a été décidé comme ça. Et aussi parce que tout l'intérêt de la redéfinition, est perdu avec des méthodes private. Mais elle peut être appelée par les classes imbriquées dans la classe qui a la méthode private, donc du point de vue de ces classes-là la méthode existe, mais elle n'a quand même pas de notion de pouvoir être redéfinie, et elle n'aura quand même aucun lien avec d'autres méthodes dans d'autres classes qui portent le même nom, parce que ça fait ça avec les méthodes private. A la rigueur, elle peut se retrouver masquée quand une méthode de même nom et de signature compatible est déclarée dans une classe imbriquée et descendante.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Par défaut
    Merci Thelvin, je comprends mieux. Résolu

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

Discussions similaires

  1. une erreur de compilation non comprise
    Par JeanNoel53 dans le forum C++/CLI
    Réponses: 2
    Dernier message: 08/03/2016, 11h19
  2. Réponses: 0
    Dernier message: 29/01/2012, 19h54
  3. Erreur de compilation non comprise
    Par GuiYom00 dans le forum C
    Réponses: 8
    Dernier message: 18/02/2008, 18h12
  4. Erreur de compilation non comprise
    Par coraziari_l dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 09/01/2008, 18h38
  5. [g++]Erreur de compilation non comprise
    Par GLDavid dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 29/05/2006, 16h16

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