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 p> dans le code d'appel 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? P> p>
6 Réponses :
Java ne peut pas faire "passer par référence". p>
Java utilise " Pass par valeur forte>". p>
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).
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 après votre la touche clé à remarquer est que comme une autre façon de penser à ce sujet: P> en Java, P> aclass = code> Ligne: p>
aclass = code> ligne: p>
aclass code> ne pointe pas sur
obj code> - il pointe 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>
Bar *foo = new Bar();
Considérez vos arguments d'objet (en Java) passés en tant que tels (illustré en C ++):
void method(TObject* arg);
Devrait être mode vide (TOBJEJECT * & ARG); code>?
@Ishtar no, mode vide (Tobject * & Arg) code> 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) code> 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); Code>
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) code> dans Java est identique à la méthode
(t * A) code> en C ++. Mais, quelle op veut faire dans la méthode:
aclass = nouveau myClass (); code> nécessite le
& code>. 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 =)
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 }
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
}
Consultez mon article à ce sujet, "Java passe par valeur, Dammit" P>
Mon plaisir! Content que tu aies aimé!
Dupliqué possible de Quelle est la différence entre passer par référence et appelez par référence?