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 par adresse


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2013
    Messages : 18
    Points : 13
    Points
    13
    Par défaut Passage par adresse
    Bonjour à tous,

    Je viens de m'apercevoir qu'une séries de fonctions que j'ai construite ne vont pas fonctionner comme je l'esperais.. à tel point que je met en doute ma connaissance sur le sujet, me retrouvant très destabilisé sur l'utilité de mon programme

    J'ai pu résumer la partie concernée à ce qui suit. Pourriez vous m'éclairer un peu svp?

    En gros, voici mon problème:

    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
    public class ClasseTest {
     
    	public static void main(String[] args) {
     
    		ClasseTest test = new ClasseTest();
     
    		String stringAModifier = ("Cette valeur doit être modifiée");
     
    				System.out.println(stringAModifier);
     
    		int integer = test.jeRetourneUnIntEtModifieLaValeur(stringAModifier);
     
    				System.out.println(stringAModifier);
     
    	}
     
    	int jeRetourneUnIntEtModifieLaValeur(String valeurAModifier)
    	{
    		valeurAModifier = "Cette valeur a étée modifiée";
    		return -27;
     
    	}
     
    }

    Pourquoi la console me retourne
    Cette valeur doit être modifiée
    Cette valeur doit être modifiée
    et pas

    Cette valeur doit être modifiée
    Cette valeur a étée modifiée
    ????

    Il me semblait qu'en java, les valeurs se passent par adresse... C'est pas le cas? ou s'est arretée la portée de la variable stringAModifier?

    Je me retrouve vraiment confus là..

  2. #2
    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
    En java, tous les paramètres des méthode se passent par copie. Pour les objet, ça veux dire copie de la référence (pas clonage de l'objet). Du coup quand tu écrit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    valeurAModifier = "Cette valeur a étée modifiée";
    Tu crée un nouvel objet (tu ne modifie pas l'ancien) et tu met sa référence dans ta variable locale.

    Si tu veux changer un variable chez l'appelant, ben tu retourne cette valeur


    Bref, tu confond l'objet (la string) qui n'est pas modifiée (une String est immutable d'ailleurs) et la variable qui contient une référence vers cet objet (qui elle est locale à la méthode).

    Pour prendre l'analogie avec du C, tu passe à ta méthode un void* et non pas un void** comme tu le croyais

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2013
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Arf.... Vraiment?

    Les types non primitifs se passent par référence non? Ou plutôt: Un String n'est-il pas un objet?

    Dsl mais je suis toujours un peu embrouillé:

    Pour moi, je croyais que les objets se passent par référence et les primitifs se passent par valeur.

    Qu'en est-il de ce String?

  4. #4
    Membre confirmé

    Homme Profil pro
    Chomeur
    Inscrit en
    Juin 2006
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 347
    Points : 452
    Points
    452
    Par défaut
    Bonjour,

    Pour compléter Tchize, tu peux aussi déclarer valeurAModifier comme variable de ClasseTest. Ca donnerait quelquechose du genre (ajoute getter/setter et constructeur...) :
    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 ClasseTest {
     
            String stringAModifier = ("Cette valeur doit être modifiée");
     
            public static void main(String[] args) {
     		ClasseTest test = new ClasseTest();
    		System.out.println(test.stringAModifier);
     
    		int integer = test.jeRetourneUnIntEtModifieLaValeur();
                    System.out.println(test.stringAModifier);
    	}
     
    	int jeRetourneUnIntEtModifieLaValeur() {
    		this.valeurAModifier = "Cette valeur a étée modifiée";
    		return -27;
    	}
    }
    Signature à venir...
    Ancienne : Divers NTIC (PHP, Dojo, à venir...) : http://tif44.fr/blog/

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2013
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Merci pour vos réponses ^^

    Si je comprends bien, si je veux quand même modifier le string à travers une fonction qui retourne un int, je dois:
    -Soit créer un objet contenant le string et passer l'objet dans la méthode
    -Soit créer l'attribut string dans la classeTest, et modifier cet attribut au sein de ma méthode int (comme le propose TIFéç)

    C'est bien ça?

    EDIT : Sauf avis contraire, je prends ça pour un oui ^^ (J'ai pas testé la première méthode, mais la deuxième fonctionne )

    Merci encore

  6. #6
    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
    Troisième option, puisque tu est dans un language objet et que, manifestement, ta String et ton int sont liés: retourner un objet qui encapsule cette paire:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class ResultatMachin {
        public int entier;
        public String chaine;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ResultatMachin machin = maMethode(maString);

  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
    Pour répéter, java passe tout par copie vers les méthodes. Simplement, il faut garder à l'esprit qu'un variable peux contenir en java un type primitif ou une référence, et rien d'autre (donc elle ne contient pas l'objet). Donc on passe une copie de la référence et non pas une copie de l'objet

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2013
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Merci infiniment pour vos réponses

    J'ai pu raccoller les failles dans mon code grâce à vous!

    Et m'endormirai ce soir sans l'obsession de ne pas avoir résolu la faille

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 03/12/2006, 18h46
  2. passage par adresse
    Par gloubig dans le forum C++
    Réponses: 1
    Dernier message: 20/05/2006, 07h35
  3. Passage par valeur / passage par adresse
    Par jeje99 dans le forum C++
    Réponses: 13
    Dernier message: 16/02/2006, 11h29
  4. passage par adresse
    Par cari dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 01/02/2006, 12h33
  5. [Debutant(e)]passage par adresse?
    Par cap2fosse dans le forum Langage
    Réponses: 4
    Dernier message: 24/09/2004, 11h05

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