9
votes

Puis-je modifier la référence à l'intérieur d'une méthode avec cette référence comme argument en Java?

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.

0 commentaires

10 Réponses :


6
votes

Les références en Java sont passées par valeur , donc même si vous modifiez la référence à l'intérieur de la fonction, les modifications ne seront pas reflétées à la fonction d'appel, car ce que vous modifiez à l'intérieur de la fonction est juste un Copie de la référence d'origine non pas la référence d'origine elle-même.

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.


0 commentaires

4
votes

Seulement si vous faites la fonction

private static void changeString(String[] s) {
    s[0] = new String("new string");
}


0 commentaires

0
votes

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.


0 commentaires

2
votes

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 Comme ça et utilisez-le comme prévu: P>

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"
}


0 commentaires

0
votes

Java n'est pas Autoriser out paramètres comme c # , alors vous ne pourrez pas y parvenir comme tel.


0 commentaires

2
votes

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.

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.

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.


0 commentaires

2
votes

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 en C #). Vous pouvez transmettre un stringbuilder et modifier son contenu est aussi facilement aussi facilement.


0 commentaires

10
votes

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");
    }
}


6 commentaires

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.



0
votes

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"
    }


0 commentaires

1
votes

Je sais que c'est vieux, mais juste pour la postérité, la plupart de cela est essentiellement faux.

en Java, non-primitives sont passés par référence . Primitives (Boxed and Unboxed) sont passés par valeur .

Pour répondre directement à OP, vous obtenez un référence à la chaîne réelle que vous avez passée . Cependant, comme @bmarguilies pointus correctement indiquée - Strings est immuable dans Java . Toute affectation à une chaîne crée une copie, puis attribue la copie nouvellement assemblée à la référence.


0 commentaires