6
votes

Java vs c ++ passe par référence


Je suis confus dans ce qui suit:
En C ++, nous pouvons transmettre un paramètre à une fonction par référence (le déclarant comme une variable de pointeur ou de référence) et si nous le modifions à l'intérieur de la fonction, les modifications sont réfléchies à l'appelant lorsque la fonction retourne.
Cela ne se produit pas dans Java et je ne suis pas sûr de comprendre pourquoi.

E.g. C'est une méthode à partir d'un objet x xxx

dans le code d'appel : xxx

Je l'utilise en C ++, c'est-à-dire pour renvoyer un résultat qui notifie que le paramètre de fonction peut être utilisé, mais en Java, cela ne fonctionne pas.
Je saisis la sucrate si (x.aMethod (2, obj)), mais l'Obj est null. Pourquoi est-ce nul?
N'avez-je pas affecté une adresse mémoire à partir du tas à l'aide d'une nouvelle méthode Amethod (INT ID, MYCLASS ACLASS)? Est-ce que je ne passe pas l'adresse de l'obj dans la fonction? Je m'attendais à avoir l'obj correctement construit et utilisable dans le code d'appel. Ai-je mal compris quelque chose concernant la mémoire en Java?


6 Réponses :


1
votes

Java ne peut pas faire "passer par référence".

Java utilise " Pass par valeur ".


1 commentaires

Vous répondez ne fournit rien de nouveau (répétant essentiellement ce que les autres personnes ont déjà dit en détail) et confond / induire les gens en erreur. Bien que Jave utilise "Pass par valeur", mais les gens peuvent toujours changer les propriétés de l'objet transmis. Cependant, ils ne peuvent pas ré-attribuer un tout nouvel objet (ce que l'OP veut faire).



27
votes

Java passe tout par valeur - y compris les références em>.

Qu'est-ce que cela signifie que si vous passez un objet, vous pouvez modifier propriétés em> de cet objet, et ils persistera après votre retour, mais vous ne pouvez pas remplacer em> l'objet dans son intégralité avec un objet complètement nouveau, car vous ne pouvez pas modifier réellement la référence em> - seulement ce que Points de référence à. p>

avant votre aclass = code> Ligne: p> xxx pré>

après votre aclass = code> ligne: p> xxx pré>

la touche clé à remarquer est que aclass code> ne pointe pas sur obj code> - il pointe de code>. Vous n'en passez pas l'adresse de obj code>, vous passez l'adresse de ce que obj code> pointe sur em>. Ainsi, lorsque vous modifiez ce que aclass code> pointe sur, qui ne touche pas obj code>. P>


comme une autre façon de penser à ce sujet: P>

en Java, P>

Bar *foo = new Bar();


0 commentaires

0
votes

Considérez vos arguments d'objet (en Java) passés en tant que tels (illustré en C ++):

void method(TObject* arg);


5 commentaires

Devrait être mode vide (TOBJEJECT * & ARG); ?


@Ishtar no, mode vide (Tobject * & Arg) est référence à un pointeur. ARG peut être modifié (pour pointer vers une autre adresse) en interne et sera reflété à l'extérieur - de sorte que le client argore pourrait pointer vers une autre adresse lorsque méthode (arg) retourne. Java passe des objets comme des pointeurs / par adresse. Java Devs aime l'appeler 'par valeur', mais à partir d'une perspective C ++, elle est transmise par le pointeur (ou l'adresse), avec la langue abstraite ce fait (et des pointeurs entièrement). suite ...


@Ishtar Partie 2: En C ++, Pass par valeur == Passez une copie de l'objet. Il n'y a pas de copie avec Java ici. Donc, le passage d'un objet Java en syntaxe C ++ est analogue à: Méthode Void (Tobject * Arg);


Pardon. Je dois avoir mal compris, mon anglais n'est pas si bon .. pensais que tu voulais dire quelque chose de différent. En effet méthode (t) dans Java est identique à la méthode (t * A) en C ++. Mais, quelle op veut faire dans la méthode: aclass = nouveau myClass (); nécessite le & . C'est ce que je pensais que vous vouliez dire.


@Ishtar pas de problème. En fait, ma réponse initiale manque de détails - il est donc bon qu'il ait été clarifié maintenant. merci =)



3
votes

en C ++ Que se produirait si vous l'avez fait:

 void myFunct (Integere anInteger) {
       // anInteger is  reference to whatever is passed
       anInteger = new Integer(99); // no effect on caller
 }


0 commentaires

2
votes

Le commentaire dans votre exemple suggère que la méthode amethod code> existe pour configurer l'objet. Donc, au lieu de passer à NULL, que diriez-vous d'instantifier l'objet d'abord, puis de le transmettre. Vous pouvez également rendre la méthode de retour de l'objet montant, comme si:

myClass obj = X.aMethod(2);
if(obj != null)
{
  obj.methodA();//start using the object
}


0 commentaires

4
votes

Consultez mon article à ce sujet, "Java passe par valeur, Dammit"

http://javadade.com/articles/passbyvalue.htm


1 commentaires

Mon plaisir! Content que tu aies aimé!