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 :

passage variable par référence


Sujet :

avec Java

  1. #1
    Invité
    Invité(e)
    Par défaut passage variable par référence
    Bonjour, voici une question que je n'ai jamais eu à me poser et qui pourtant paraît très bête : le passage d'une variable, un int par exemple, par référence et non par valeur.

    Si on veut modifier la valeur d'un entier grâce à une méthode, on peut faire un return bien sûr, mais si il y a plusieurs entiers, ... cela reste trop limité.
    De plus si on veut qu'une variable est sa valeur toujours attachée à celle d'une autre variable, cela ne marche plus.
    Je n'ai quasiment pas fait de C, mais en C avec un pointeur c'est immédiat. Alors en java, faut-il créer une classe exprès pour gérer ce cas, pour faire un passage par référence d'une classe contenant cet entier, ou peut-on simplement associé la valeur d'un entier à un autre.

    Je donne un exemple (c'est pas du java, c'est juste pour comprendre) :
    x=0
    y=x // donc y = 0
    x=2
    //alors y=2 aussi
    C'est ce que j'aimerai obtenir.

    J'ai fait un exemple qui marche avec une classe qui enveloppe un entier. Mais c'est un peu lourd juste pour faire pointer un entier sur la valeur d'un autre.
    L'exemple est en fichier joint.

    Merci d'avance

    ++ et bonne prog

    PS : enfin dernière question, avec le système que j'emploie, à cette ligne ci :

    Origin o = wrapper1.getO();
    wrapper2.setO(o);
    o=null;

    Pourquoi si je la remplace par cela, ça ne marche plus : wrapper2.getO()=wrapper1.getO();

    Je récupère l'instance o de wrapper2 que je fais pointer sur le même objet (Origin) que l'instance o de wrapper1 ??? non ?

    Mais j'ai une erreur : the left-hand side of an assignment must be a variable. (sous eclipse)
    Fichiers attachés Fichiers attachés

  2. #2
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Une question à la fois SVP nous sommes tout de même le dimanche de Pâques !! Il faut faire des pauses de temps en temps !

    Bon, en java, les valeurs primitives (donc les int) se passent par valeur, tandis que les objets se passent par référence. C'est tout.

    Si tu veux passer une valeur primitive par référence, il faut la mettre dans un objet, et si tu veux passer un objet par valeur il faut le mettre dans des valeurs primitives (par exemple).

    Et s'il y a plusieurs entiers ?... Alors, il faut Penser en Java.
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    2 règles de base de java:

    1) tous les arguments des méthodes sont passés par valeur.
    2) les variables peuvents soit contenir des types de base (boolean, int, etc), soit une référence vers un type Object.

    donc, dans ton cas, si tu veux modifier un contenu, tu ne peux que passer par valeur la référence vers un objet. Tu pourra modifier les contenu de l'objet et l'appelant y trouvera les nouvelles valeur, mais tu ne pourra pas changer d'instance d'objet (car alors tu change la référence, et cette référence t'as été passée par valeur).

    En règle générale, si une méthode doit renvoyer des valeurs, on utilise return. Et si t'as une méthodes qui doit modifier plusieurs valeurs liées entre elle, il serait probablement bon de prendre ces valeur et cette méthode et de faire un objet de l'ensemble. Si les valeurs sont liées, elles sont de bonnes candidates pour etre dans un même objet.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup de vos explications.

    Si je comprends bien, ma manière de le faire ici est donc bonne ?

    Le problème du return, est que ça retourne une valeur, mais ça n'associe pas la valeur d'une primitive à une autre automatiquement.
    Donc si je comprends bien, je dois encapsuler mes primitives dans un objet, et passer les instances de ces objets en paramètre d'une méthode, afin de modifier l'objet sur lequel elles pointent.
    En clair il n'y a pas vraiment plus court que le code que j'ai mis en exemple .

    Merci beaucoup

    ++

    PS : désolé de poser deux questions à la fois , mais je ne vois aps pourquoi cela ne marche pas : wrapper2.getO()=wrapper1.getO();

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    si, il y a plus court, utiliser le return :/

    De plus, dans ton cas, tu fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        Enveloppeur wrapper1 = new Enveloppeur(5);
        Enveloppeur wrapper2 = new Enveloppeur();
        Origin o = wrapper1.getO();
        wrapper2.setO(o);
        wrapper1.setI(6);
    Fonctionnellemen, le code suivant serait le même:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Origin o = new Origin(5);
    Origin o2 = o;
    o.setOrigin(i);
    La classe enveloppeur en moins :/

  6. #6
    Invité
    Invité(e)
    Par défaut
    Merci, je me doutais bien que la classe enveloppeur était inutile, mais c'est parce que je mettais en lien avec l'application que je voulais en faire.

    Sinon pour le return je ne vois toujours pas : le return renvoie une valeur oui, mais si je change ma valeur trois fois, je dois appeler trois fois ma méthode qui contient le return, alors que là, j'ai rien à faire : o.setOrigin(i) autant de fois que je veux, et o2 est modifié automatiquement.

    ++

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    avec les référence, (en C par exemple) ce n'est pas possible non plus, accessoirement.

    Sis je fait ceci en C

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int j,k;
     
    j =3;
    k =j;
    methode(&j);
    même si methode modifie j, il ne modifiera pas k. Et lier deux int, j'ai du mal à en voir l'intérêt

  8. #8
    Invité
    Invité(e)
    Par défaut
    Oui, je crois que je comprends

    Sinon l'intérêt de lier deux int ensembles, c'était de faire un arbre hiérarchique entre plusieurs objets 3D. Par exemple une lumière est attachée à une lampe qui est attachée à un bureau. Ainsi, si le bureau se déplace, la lampe et la lumière bouge avec. J'avais donc pensé à lier l'origine de ma lampe à l'origine de mon bureau. Par exemple si l'origine de la lampe est (x,y,z) et celle du bureau est (x',y',z'), avoir un truc du genre x=x'+5,y=y'-3,...
    Ainsi si je modifie (x',y',z') en faisant bouger mon bureau, la lampe a ses coordonnées actualisées automatiquement, sans avoir besoin d'appeler une méthode qui modifie les coordonnées à chaque renouvellement de la position du bureau.

    ++

    PS : quel est le problème dans cette instruction ? wrapper2.getO()=wrapper1.getO();

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    tu peux pas assigner. Si tu voulais comparer, faut un double ==

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

Discussions similaires

  1. passage par variable par référence.
    Par label55 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 23/04/2008, 14h02
  2. [VB.NET]Problème passage paramètre par référence
    Par biau dans le forum Windows Forms
    Réponses: 4
    Dernier message: 05/02/2008, 14h03
  3. Passage Boolean par référence
    Par Duc Lebowski dans le forum Langage
    Réponses: 7
    Dernier message: 14/11/2007, 12h05
  4. [Tableaux] passage d'une variable par référence
    Par grinder59 dans le forum Langage
    Réponses: 7
    Dernier message: 14/05/2007, 17h52
  5. Retourner des variables par références
    Par dorian53 dans le forum Langage
    Réponses: 3
    Dernier message: 21/11/2006, 14h19

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