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 :

Bref. Les cast me rendent fou.


Sujet :

avec Java

  1. #1
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Points : 81
    Points
    81
    Par défaut Bref. Les cast me rendent fou.
    Bonjour à tous,

    Ayant lu quelques cours de Java, je reste bloqué sur le cast.
    J'ai des exemples sous les yeux que je ne comprends pas.

    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 A {
    	void g() {System.out.println("A");}
    public class B extends A {
    	void g() {System.out.println("B");}
    public class C extends B{
    	void g() {System.out.println("C");}
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		A a=new C(); ((C)a).g();
    	}
    
    }
    Le code fonctionne et m'affiche C.
    Maintenant, lorsque j'essai de caster l objet a en A, B, C ou même sans cast... ça fonctionne toujours...

    A quoi sert mon cast ? En quoi ça joue à la compilation ou à l'éxecution ?

    2eme Q:

    Si j'ai : B(ou C) a=new C(); ((C)a).g();
    Qu'est ce que ça change, sachant que ça donne le même résultat ?

    Je suis embrouillé car C hérite quand meme de A et de B donc pourquoi le cast ?

    Merci d'avance.

  2. #2
    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 sert à changer la déclaration du type d'une référence. Cela permet par exemple d'appeler des méthodes spécifiques à un type.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ((A)a).g();	// invoke A.g()
    ((B)a).g();	// invoke B.g()
    ((C)a).g();	// invoke C.g()
    Mais dans ton cas cela ne sert pas à grand chose car tu redéfinis la méthode à chaque fois. Or à l'exécution c'est la méthode réelle qui est exécuté. Ainsi même si à la compilation appelles A.g(), le type réelle de l'instance est vérifié à la compilation.

    En clair comme le vrai type de "a" est C, et que ce dernier redéfini la méthode g(), c'est finalement la méthode C.g() qui sera exécuté...


    a++

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 545
    Points : 21 601
    Points
    21 601
    Par défaut
    Citation Envoyé par larchicha Voir le message
    A quoi sert mon cast ? En quoi ça joue à la compilation ou à l'éxecution ?
    Il sert à vérifier si l'objet a est bien de type C. S'il ne l'était pas, ce cast générerait une ClassCastException à l'exécution.

    Il ne change rien à la compilation, à part demander à l'exécution de faire cette vérif.

    Pour tester, essaie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A a=new A(); ((C)a).g();
    Mais, à part ça, je dois bien reconnaître qu'il ne sert pas à grand-chose. Dans un cas comme celui-là, le cast est inutile.

    Citation Envoyé par larchicha Voir le message
    2eme Q:

    Si j'ai : B(ou C) a=new C(); ((C)a).g();
    Qu'est ce que ça change, sachant que ça donne le même résultat ?
    Rien.
    Le compilateur sait déjà que la variable a est de type B et pas juste un A, ce qui n'a pas d'importance dans cet exemple.

    Citation Envoyé par larchicha Voir le message
    Je suis embrouillé car C hérite quand meme de A et de B donc pourquoi le cast ?
    Le cast est inutile.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Points : 81
    Points
    81
    Par défaut
    Merci de votre promptitude déja...
    Donc je commence à mettre le doigt dessus, mais pourriez vous me donner un exemple (simple ~~ niveau noob) d'un cast utile ?

    Merci.

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 545
    Points : 21 601
    Points
    21 601
    Par défaut
    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
    public class Personne {
      int age;
     
      /** Vérifier si cet objet est égal à l'objet o.
      Il l'est si o est de type Personne et a le même âge. */
      public boolean equals(Object o) {
        if(o instanceof Personne) {
          // o est de type Personne : nous devons comparer les âges
          // pour accéder à l'âge de o, nous devons le caster vers le type Personne.
          Personne autrePersonne = (Personne)o;
          return age == autrePersonne.age;
        } else {
          // o n'est pas de type Personne : pas d'égalité
          return false;
        }
      }
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Points : 81
    Points
    81
    Par défaut
    Merci encore, c'est cristal clear.

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

Discussions similaires

  1. Réponses: 544
    Dernier message: 04/10/2023, 14h14
  2. Réponses: 167
    Dernier message: 22/09/2009, 15h39
  3. Question sur les casts
    Par nicolas66 dans le forum C++
    Réponses: 3
    Dernier message: 16/03/2006, 20h03
  4. [Début.] Les CAST
    Par Sylvester dans le forum Langage
    Réponses: 13
    Dernier message: 08/07/2005, 23h24
  5. Les dates me rendent dingue...
    Par David.V dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/10/2004, 14h44

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