Ce code Java:
public class XYZ {
public static void main(){
int toyNumber = 5;
XYZ temp = new XYZ();
temp.play(toyNumber);
System.out.println("Toy number in main " + toyNumber);
}
void play(int toyNumber){
System.out.println("Toy number in play " + toyNumber);
toyNumber++;
System.out.println("Toy number in play after increement " + toyNumber);
}
}
affichera ceci:
Numéro de jouet en jeu 5 Numéro de jouet en jeu après incrément 6 Numéro de jouet dans le 5 principal
En C ++, je peux passer la toyNumber
variable comme passe par référence pour éviter le shadowing, c'est-à-dire créer une copie de la même variable que ci-dessous:
void main(){
int toyNumber = 5;
play(toyNumber);
cout << "Toy number in main " << toyNumber << endl;
}
void play(int &toyNumber){
cout << "Toy number in play " << toyNumber << endl;
toyNumber++;
cout << "Toy number in play after increement " << toyNumber << endl;
}
et la sortie C ++ sera la suivante:
Numéro de jouet en jeu 5 Numéro de jouet en jeu après incrément 6 Numéro de jouet dans le 6 principal
Ma question est la suivante: quel est le code équivalent en Java pour obtenir la même sortie que le code C ++, étant donné que Java est un passage par valeur plutôt que par référence ?
java
pass-by-reference
Étudiant
la source
la source
toyNumber
variable déclarée dans lamain
méthode n'est pas dans la portée de laplay
méthode. L'observation en C ++ et Java ne se produit qu'en cas d'imbrication des étendues. Voir en.wikipedia.org/wiki/Variable_shadowing .Réponses:
Vous avez plusieurs choix. Celui qui a le plus de sens dépend vraiment de ce que vous essayez de faire.
Choix 1: faire de toyNumber une variable membre publique dans une classe
puis passez une référence à un MyToy à votre méthode.
Choix 2: renvoyer la valeur au lieu de passer par référence
Ce choix nécessiterait un petit changement au callsite dans le principal afin qu'il lit,
toyNumber = temp.play(toyNumber);
.Choix 3: en faire une classe ou une variable statique
Si les deux fonctions sont des méthodes sur la même classe ou instance de classe, vous pouvez convertir toyNumber en variable membre de classe.
Choix 4: Créez un tableau d'élément unique de type int et transmettez-le
Ceci est considéré comme un hack, mais est parfois utilisé pour renvoyer des valeurs à partir d'appels de classes en ligne.
la source
toyNumber = temp.play(toyNumber);
pour qu'il fonctionne comme vous le souhaitez.Java n'est pas appelé par référence, il est appelé par valeur uniquement
Mais toutes les variables de type objet sont en fait des pointeurs.
Donc, si vous utilisez un objet mutable, vous verrez le comportement souhaité
Sortie de ce code:
Vous pouvez également voir ce comportement dans les bibliothèques standard. Par exemple Collections.sort (); Collections.shuffle (); Ces méthodes ne retournent pas de nouvelle liste mais modifient leur objet argument.
Sortie de ce code:
la source
play
; par exemplemutableList[0] = mutableList[0] + 1;
. Comme le suggère Ernest Friedman-Hill.private static void play(StringBuilder toyNumber)
- comment l'appeler si c'est par exemple public static int qui renvoie un entier? Parce que j'ai une méthode qui renvoie un nombre mais si je ne l'appelle pas quelque part, elle n'est pas utilisée.Faire un
puis passez une référence à une instance de celui-ci. Notez qu'une méthode qui fait muter l'état via ses arguments est mieux évitée, en particulier dans le code parallèle.
la source
Vous ne pouvez pas transmettre de primitives par référence en Java. Toutes les variables de type objet sont en fait des pointeurs, bien sûr, mais nous les appelons des "références", et elles sont également toujours passées par valeur.
Dans une situation où vous avez vraiment besoin de passer une primitive par référence, ce que les gens feront parfois est de déclarer le paramètre comme un tableau de type primitif, puis de passer un tableau à un seul élément comme argument. Vous passez donc une référence int [1], et dans la méthode, vous pouvez modifier le contenu du tableau.
la source
Pour une solution rapide, vous pouvez utiliser AtomicInteger ou l'une des variables atomiques qui vous permettront de modifier la valeur à l'intérieur de la méthode à l'aide des méthodes intégrées. Voici un exemple de code:
Production:
la source
la source