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 :

Héritage, getClass, instanceof, casting


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Héritage, getClass, instanceof, casting
    Bonjour,

    J'ai une classe B qui hérite de A. Cette classe B contient un attribut de type String alors que la classe A n'en a pas.

    Quelqu'un peut-il m'expliquer pourquoi quand je caste une instance de B en A je ne perds pas l'attribut ? Pourtant A n'a pas d'attribut !

    Voici le programme de test:

    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
     
    public class Main {
     
        class A {
        }
     
        class B extends A{
            public String s = "hello";
        }
     
        public static void main(String[] args) {
            Main m = new Main();
            m.heritage();
        }
     
        private void heritage() {
     
            A a = new A();
            B b = new B();
     
            if (a instanceof A) {
                System.out.println("a instanceof A");
            }
            if (a instanceof B) {
                System.out.println("a instanceof B");
            }
            if (b instanceof A) {
                System.out.println("b instanceof A");
            }
            if (b instanceof B) {
                System.out.println("b instanceof B");
            }
            if (a.getClass().equals(A.class)) {
                System.out.println("a.getClass().equals(A.class)");
            }
            if (a.getClass().equals(B.class)) {
                System.out.println("a.getClass().equals(B.class)");
            }
            if (b.getClass().equals(A.class)) {
                System.out.println("b.getClass().equals(A.class)");
            }
            if (b.getClass().equals(B.class)) {
                System.out.println("b.getClass().equals(B.class)");
            }
     
            b.s = "bonjour";
     
            A a2 = (A) b;
     
            B b2 = (B) a2;
     
            System.out.println("A a2 = (A) b; B b2 = (B) a2;");
            System.out.println("b2.s = " + b2.s);
     
        }
    }
    et la sortie:

    a instanceof A
    b instanceof A
    b instanceof B
    a.getClass().equals(A.class)
    b.getClass().equals(B.class)
    A a2 = (A) b; B b2 = (B) a2;
    b2.s = bonjour

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Parce qu'un cast ne modifie pas le type réel de ton objet. Il force le langage à traiter ton objet "comme s'il était" un objet de type A. Mais il ne "transforme" pas ton objet.

    Avec ton exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    A a2 = (A) b2;
    // Le type réel de l'objet a2 est "B". Mais à cause du cast, il est considéré
    // comme un objet de type A. "a2.s" donne donc une erreur de compilation,
    // même si l'objet a2 contient bien l'attribut s (car sa classe réelle est B).
     
    B b2 = (B) a2;
    // Ce cast ne fonctionne parce que l'objet a2 est en réalité un objet de classe B
     
    A a3 = new A();
    // Le type réel de a3 étant A, une tentative de cast en B échouera à
    // l'exécution du programme (mais pas à la compilation)
    Pour mieux comprendre tout ça, je t'invite à relire un cours sur les mécanismes de base des langages objets (java en particulier). => cf. http://java.developpez.com/cours/
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  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,


    Le cast ne change en rien le type réel d'un objet, mais seulement le type avec lequel il est déclaré.


    a++

    [edit] grillé !

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci à vous deux

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

Discussions similaires

  1. Héritage multiple et cast
    Par le-roy_a dans le forum C++
    Réponses: 4
    Dernier message: 01/09/2008, 16h58
  2. petite question sur l'héritage et les cast
    Par baedal dans le forum Langage
    Réponses: 3
    Dernier message: 29/02/2008, 00h48
  3. Réponses: 20
    Dernier message: 04/01/2007, 11h43
  4. Conception : héritage et instanceof
    Par herve91 dans le forum Langage
    Réponses: 10
    Dernier message: 05/12/2006, 17h11
  5. [héritage] Problème de cast
    Par mambo dans le forum Visual C++
    Réponses: 7
    Dernier message: 16/08/2006, 16h32

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