private static void changeString(String s) { s = new String("new string"); } public static void main(String[] args) { String s = new String("old string"); changeString(s); System.out.println(s); // expect "new string" } How could I make the output of "new string" happen with s as the only argument to method changeString?thanks.
10 Réponses :
Les références en Java sont passées par Mais vous pouvez renvoyer la nouvelle chaîne de votre méthode de changetring au lieu d'essayer de modifier la référence là-bas (à l'intérieur de la fonction) elle-même. P>
Seulement si vous faites la fonction
private static void changeString(String[] s) { s[0] = new String("new string"); }
Ce n'est pas possible en Java car tout dans Java est passé par la valeur. Dans ce cas où l'argument est une référence d'objet, il est la valeur de la référence transmise à la méthode, pas la référence elle-même. P>
A STROR>: Vous ne pouvez pas, dans les références d'objet Java, les références sont transmises par la valeur. Si vous avez vraiment besoin de, vous pouvez créer un wrapper private static void changeString( _<String> str) {
str.s("new string");
}
public static void main(String[] args) {
_<String> s = new _<String>("old string");
changeString(s);
System.out.println(s); // prints "new string"
}
Java n'est pas Autoriser out em> paramètres comme c # , alors vous ne pourrez pas y parvenir comme tel. P>
Vous pouvez bien sûr renvoyer la nouvelle chaîne de votre méthode de changetring au lieu d'essayer de le changer en place. P>
Alternativement, vous pouvez créer un objet qui enveloppe ou contient une chaîne et transmettez-le. La méthode changetring modifierait la chaîne interne à votre objet, et la méthode principale tiendrait toujours une référence à cet objet. p>
Sinon, vous ne pouvez pas faire cela. La chaîne est immuable et Java transmet toujours des objets comme une valeur qui est un pointeur à un objet particulier. Changez où vous indiquez, et vous ne référez-vous plus le même objet. P>
Les chaînes sont immuables dans Java et les paramètres sont transmis par la valeur afin que vous ne puissiez pas les modifier (il n'y a pas équivalent à ref code> en C #). Vous pouvez transmettre un
stringbuilder code> et modifier son contenu est aussi facilement aussi facilement. P>
Dans les arguments Java sont passés par la valeur, les arguments d'objet passent une référence à l'objet, cela signifie que vous pouvez modifier la référence de l'argument, mais cela ne modifie pas l'objet que vous avez passé la référence à. Vous avez deux possibilités, renvoyer le nouvel objet (préféré) ou transmettez-vous à un conteneur pouvant recevoir la nouvelle référence (collecte, tableau, etc.), par exemple:
private static String changeStringAndReturn(String s) { return new String("new string"); } private static void changeStringInArray(String[] s) { if (null != s && 0 < s.length) { s[0] = new String("new string"); } }
En Java, des arguments sont passés par la valeur!
La chose amusante est que le code est correct mais la "documentation" est trompeuse. Je me demande si la même chose arrive avec son code?
@ RSP-Pourriez-vous corriger votre documentation, car c'est la réponse acceptée
Correction du fait que la référence de l'objet est transmise par la valeur.
Ne faites pas la chose de tableau cependant. Oui ça marche, mais c'est un "hack" et vous devriez vraiment utiliser une valeur de retour. Si vous devez modifier plusieurs choses, reportez-vous au problème (généralement vous n'avez pas à) ou à créer une classe et à renvoyer cette classe.
@Tofu, j'ai dit que le retour de la nouvelle valeur est la méthode préférée. Le tableau est, comme mentionné, un exemple de conteneur. Passer une carte serait une meilleure alternative. Et comme nous sommes nitpicking aujourd'hui, le retour d'une classe ne vous aiderait pas :-) Vous voulez dire de définir une classe d'objet titulaire de données et renvoyer une instance de porte-données avec plusieurs valeurs.
Son laid, mais vous pouvez changer la chaîne en statique globale:
private static String s; private static void changeString(String t) { if(s.equals(t)) s = new String("new string"); } public static void main(String[] args) { s = new String("old string"); changeString(s); System.out.println(s); // expect "new string" }
Je sais que c'est vieux, mais juste pour la postérité, la plupart de cela est essentiellement faux. P>
en Java, non-primitives forts> sont passés Pour répondre directement à OP, vous obtenez un référence em> à la chaîne réelle que vous avez passée em>. Cependant, comme @bmarguilies pointus correctement indiquée -