Partage
  • Partager sur Facebook
  • Partager sur Twitter

affectation/cast/list : classe fille/classe mère

Anonyme
    22 novembre 2015 à 14:21:02

    Salut,

    dans cette partie du tutoriel de java dans le site d'oracle :

    Consider an example that contains two classes. The first is Animal, which contains one instance method and one static method:
    
    public class Animal {
        public static void testClassMethod() {
            System.out.println("The static method in Animal");
        }
        public void testInstanceMethod() {
            System.out.println("The instance method in Animal");
        }
    }
    
    The second class, a subclass of Animal, is called Cat:
    
    public class Cat extends Animal {
        public static void testClassMethod() {
            System.out.println("The static method in Cat");
        }
        public void testInstanceMethod() {
            System.out.println("The instance method in Cat");
        }
    
        public static void main(String[] args) {
            Cat myCat = new Cat();
            Animal myAnimal = myCat;
            Animal.testClassMethod();
            myAnimal.testInstanceMethod();
        }
    }
    
    The Cat class overrides the instance method in Animal and hides the static method in Animal. The main method in this class creates an instance of Cat and invokes testClassMethod() on the class and testInstanceMethod() on the instance.
    
    The output from this program is as follows:
    
    The static method in Animal
    The instance method in Cat
    

    1)Je n'ai pas compris ce qui se passe, normalement tout appel des méthodes la classe Animal , que ça soit à travers la classe elle même ou d'une de ses instanciation,doit normalement renvoyer les méthodes de la classe mère et non pas ceux de la classe fille , donc o doit avoir "The instance method in Animal" et non pas "The instance method in Cat" n'est ce pas?

    2)On peut affecter un objet d'une classe fille à un objet de sa classe mère (cast implicit) et on ne peut pas faire le contraire (sauf avec un cast explicit , et la classe mère doit contenir une référence de la classe fille) ce qui me parait absurde car la classe fille contient tous les membres de la classe mére et peut avoir d'autres que la classe mère n'a pas , donc il y aura une perte de données si on affecte un objet de la classe fille à un objet de la classe mère , donc si on réaffecte l'objet mère à l'objet fils en utilisant un cast , il y aura des données perdues non? quelqu'un peut m'expliquer comment ça marche les affectations des objets de différentes classes (fille/mère ou même autre s'il y en a)???

    3)Comment une même liste peut contenir des objets de différents types?? est ce qu'un simple tableau peut contenir plusieurs type d'objet??

    Merci d'avance

    • Partager sur Facebook
    • Partager sur Twitter
      22 novembre 2015 à 14:50:35

      Lu'!

      1) Non. Ici :

      Animal.testClassMethod();

      tu demandes explicitement l'appel de la fonction statique qui se trouve dans Animal. Ici :

      myAnimal.testInstanceMethod();

      Tu appelles "testInstanceMethod" sur un animal, MAIS cet animal est une instance de "Cat", il y a donc une résolution de type qui est effectuée pour connaître le type "réel" de l'objet et appeler la méthode correspondante.

      2) Tu n'affectes pas d'objet en Java. C'est là le piège. Tous les noms qui sont présents dans le code sont des références vers des objets en mémoire. Ce ne sont pas les objets eux mêmes. Quand tu "affectes" un objet dérivé à une référence de base aucun cast n'est fait. C'est juste qu'en présence de type qui sont nécessairement compatibles, la référence peut être affectée, sinon non.

      Ceci :

      Animal a = new Cat();

      dit simplement que la référence "a" est maintenant liée à un objet de type Cat (qui par polymorphisme d'inclusion - plus de détails - est bien un Animal). En revanche, écrire ceci :

      Animal a = new Cat();
      Cat c = a;

      n'est pas légal sans cast puisque par défaut, si on écrit :

      Animal a = null;
      
      //du code qui affecte peut être la référence "a"
      
      Cat c = a;

      Rien ne nous dit que "a" est bien de type "Cat".

      3) Même réponse que pour la question 2), en Java, à part les types primitifs, tout est référence (~= pointeur).

      • Partager sur Facebook
      • Partager sur Twitter

      Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

      Anonyme
        28 novembre 2015 à 18:42:39

        Merci beaucoup por votre aide :)
        j'ai encore une petite question , quand on declare deux objets qeulconques A et B et on affect B à A, est ce qu'une copie de B est placé en A ou bien c'est "l'adresse" (la référence?) de B qui est placé en A qui   , c-à-d si on modifie après  B , est ce que A sera aussi modifié?

        • Partager sur Facebook
        • Partager sur Twitter
          1 décembre 2015 à 9:05:05

          Deuxième option, c'est une référence.

          • Partager sur Facebook
          • Partager sur Twitter

          Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

          Anonyme
            1 décembre 2015 à 18:22:00

            je n'ai pas bien compris , je suis débutant en java , que veut dire une référence? d'après ce que j'ai trouvé sur la toile c'est pareil que les pointeurs , mais si c'est le cas quand on crée deux variables A et B et on modifie A alors B sera aussi modifié , mais quand j'essaie ce n'est pas ça qui se passe (j'ai essayé avec des types primitives int)
            • Partager sur Facebook
            • Partager sur Twitter
              1 décembre 2015 à 19:45:52

              Ksass`Peuk a écrit:

              en Java, à part les types primitifs, tout est référence (~= pointeur).

              • Partager sur Facebook
              • Partager sur Twitter

              Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

              affectation/cast/list : classe fille/classe mère

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown