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

Collection et Stream Java Discussion :

Tableau mélangé entre objets et objets hérités


Sujet :

Collection et Stream Java

  1. #1
    Membre éclairé

    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Septembre 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2007
    Messages : 214
    Points : 816
    Points
    816
    Par défaut Tableau mélangé entre objets et objets hérités
    Bonjour

    J’ai un peu du mal avec le mélange d’objet différent dans le même tableau : je considère A une classe, B1 et B2 deux classes qui héritent de A, C une classe qui hérite de B1. Si je déclare un tableau de A, alors ce tableau peut contenir indifféremment des objets A, B1, B2 ou C, c’est bien ca ?

    Ca me parait étrange a deux points de vu :

    1/ On se retrouve avec un tableau qui contient deux types différents
    2/ Au niveau de la mémoire, on "prépare" la mémoire pour des objets de taille A, et on y place des objets de taille B1, B2 ou C, objet qui sont potentiellement plus gros que A.

    Christophe
    Christophe
    Porteur du projet R++ https://rplusplus.com
    YouTubeur https://www.youtube.com/c/lesstatsmemepasmal

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    C'est ce qu'on appelle le polymorphisme.

    En gros, tu réduit les objets instanciés grâce aux classes B1, B2 et C à leur nature A.

    Prenons un bon vieil exemple concret. Tu as une classe Animal et une classe Chien dérivant d'Animal. Tu peux stocker des chiens dans un tableau d'animaux car un chien est un animal avec des caractéristiques en plus : tu fais abstraction de ce qui différencie le chien des autres animaux.

    Pour ce qui est de la mémoire, ce n'est pas tout à fait ça. La zone mémoire de tes objets est conservée. Par contre, quand tu accède via le tableau A a ton objet B, tu n'auras accès qu'aux méthodes de A puisque tu a réduit tes objet B à leur nature A. Pour accéder à toutes les méthodes/attributs de tes objets, tu dois caster.

    Exemple
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ArrayList<A> aArray = new ArrayList();
    aArray.add(new B()); // polymorphisme : réduction de B à la partie A de lui-même ; son espace mémoire est bien conservé dans son intégralité
    B b = (B) aArray.get(0); // cast de l'objet A retourné pour retrouver l'objet B dans son intégralité
    Dernière modification par Invité ; 03/07/2013 à 15h59.

  3. #3
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    1/ On se retrouve avec un tableau qui contient deux types différents
    Oui et non. Surtout non. On se retrouve au final avec un tableau de A et uniquement de A.

    Si tu prend dans le rôle de la classe :
    A => Chat
    B1 => ChatBlanc
    B2 => ChatNoir
    C => ChatBlancALongPoile

    Au final ton tableau se retrouve avec uniquement des "Chat".

    2/ Au niveau de la mémoire, on "prépare" la mémoire pour des objets de taille A, et on y place des objets de taille B1, B2 ou C, objet qui sont potentiellement plus gros que A.
    C'est là que les références font la différences.

    Un tableau d'objet en Java est un tableau de référence. C'est un pointeur qui indique où est l'objet. Le tableau de contient donc pas réellement les objets, mais juste les références qui sont de taille fixe. Les objets sont stocké en mémoire à coté.
    Pour ce qui est de la question de la taille d'un objet de la classe A. Il ne faut pas oublié que cela peux grandement varié d'une instance à l'autre. Par exemple, une instance d'Image.

    Cordialement,
    Patrick Kolodziejczyk.

    source :
    http://fr.wikiversity.org/wiki/Java/Tableaux
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  4. #4
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    @Enerian : bon pour sur le polymorphisme. Tout les objets d'un tableau de A ou d'une liste de A sera considéré comme un objet de type A. Même si celui-ci est de type B1, B2 ou même C. Il est cependant possible de "casté" l'objet dans son type réel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Object[] tableau ={new String()};
    if(tableau[0] instanceof String){
    	String monString  = ((String)tableau[0]);
    }
    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  5. #5
    Membre éclairé

    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Septembre 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2007
    Messages : 214
    Points : 816
    Points
    816
    Par défaut
    Merci !
    Christophe
    Porteur du projet R++ https://rplusplus.com
    YouTubeur https://www.youtube.com/c/lesstatsmemepasmal

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 17/08/2010, 17h23
  2. Collision entre souris et objet
    Par youp_db dans le forum SDL
    Réponses: 8
    Dernier message: 26/07/2006, 13h15
  3. [VB.NET] PB avec lien entre propriété d'objet et TextBox
    Par apoingsfermes dans le forum Windows Forms
    Réponses: 1
    Dernier message: 19/07/2006, 11h01
  4. Réponses: 3
    Dernier message: 07/07/2006, 18h00
  5. choix entre dbexpress et objet interbase
    Par hani dans le forum Bases de données
    Réponses: 5
    Dernier message: 18/11/2004, 23h09

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