Este código 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);
}
}
generará esto:
Número de juguete en juego 5 Número de juguete en juego después del incremento 6 Número de juguete en el principal 5
En C ++ puedo pasar la toyNumber
variable como pasar por referencia para evitar el sombreado, es decir, crear una copia de la misma variable que se muestra a continuación:
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;
}
y la salida de C ++ será esta:
Número de juguete en juego 5 Número de juguete en juego después del incremento 6 Número de juguete principal 6
Mi pregunta es: ¿cuál es el código equivalente en Java para obtener el mismo resultado que el código C ++, dado que Java se pasa por valor en lugar de pasar por referencia ?
java
pass-by-reference
Estudiante
fuente
fuente
toyNumber
variable declarada en elmain
método no está dentro del alcance delplay
método. El sombreado en C ++ y Java solo ocurre cuando hay anidación de ámbitos. Consulte en.wikipedia.org/wiki/Variable_shadowing .Respuestas:
Tienes varias opciones. El que tenga más sentido realmente depende de lo que intente hacer.
Opción 1: hacer de toyNumber una variable miembro pública en una clase
luego pase una referencia a un MyToy a su método.
Opción 2: devolver el valor en lugar de pasar por referencia
Esta opción requeriría un pequeño cambio en el modo en callsite principal que se lee,
toyNumber = temp.play(toyNumber);
.Opción 3: conviértalo en una clase o variable estática
Si las dos funciones son métodos en la misma clase o instancia de clase, puede convertir toyNumber en una variable miembro de clase.
Opción 4: cree una matriz de un solo elemento de tipo int y páselo
Esto se considera un truco, pero a veces se emplea para devolver valores de invocaciones de clases en línea.
fuente
toyNumber = temp.play(toyNumber);
para que funcione como se desea.Java no se llama por referencia, solo se llama por valor
Pero todas las variables de tipo de objeto son en realidad punteros.
Entonces, si usa un objeto mutable, verá el comportamiento que desea
Salida de este código:
También puede ver este comportamiento en las bibliotecas estándar. Por ejemplo Collections.sort (); Colecciones.shuffle (); Estos métodos no devuelven una nueva lista, pero modifican su objeto de argumento.
Salida de este código:
fuente
play
; ejmutableList[0] = mutableList[0] + 1;
. Como sugiere Ernest Friedman-Hill.private static void play(StringBuilder toyNumber)
: ¿cómo lo llama si, por ejemplo, es public static int que devuelve un número entero? Porque tengo un método que devuelve un número, pero si no lo llamo en algún lugar, no está en uso.Hacer una
luego pase una referencia a una instancia de la misma. Tenga en cuenta que es mejor evitar un método que mute el estado a través de sus argumentos, especialmente en código paralelo.
fuente
No puede pasar primitivas por referencia en Java. Todas las variables de tipo de objeto son en realidad punteros, por supuesto, pero las llamamos "referencias" y también siempre se pasan por valor.
En una situación en la que realmente necesita pasar una primitiva por referencia, lo que la gente hará a veces es declarar el parámetro como una matriz de tipo primitivo y luego pasar una matriz de un solo elemento como argumento. Entonces pasa una referencia int [1], y en el método, puede cambiar el contenido de la matriz.
fuente
Para una solución rápida, puede usar AtomicInteger o cualquiera de las variables atómicas que le permitirán cambiar el valor dentro del método usando los métodos incorporados. Aquí hay un código de muestra:
Salida:
fuente
fuente