English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java paso por valor y paso por referencia (pregunta común en entrevistas)

Primero, copia una entrevista/Pregunta de la prueba escrita:

Cuando un objeto se pasa como parámetro a un método, este método puede cambiar las propiedades del objeto y puede devolver el resultado modificado, ¿es esto paso por valor o paso por referencia?

Respuesta:

Es una pasaje por valor. La llamada de métodos del lenguaje Java solo admite el paso por valor de los parámetros. Cuando una instancia de objeto se pasa como parámetro a un método, el valor del parámetro es una referencia al objeto. Las propiedades del objeto pueden cambiar durante la llamada, pero los cambios en la referencia no afectan al llamador. C++En C#, se puede cambiar el valor de los parámetros pasados por referencia o por parámetros de salida. En C#, se puede escribir el código como se muestra a continuación, pero en Java no se puede hacer lo mismo.

Paso por valor y paso por referencia (paso por referencia) en java, para entender estos dos conceptos, es necesario entender el paso por valor y el paso por referencia.

A continuación, se presentará un ejemplo simple para ilustrar:

Por ejemplo, si va a viajar al extranjero y toma una foto especialmente buena, y desea compartirla con sus amigos, hay dos formas: primero, directamente envíe esta foto a sus amigos, es decir, envíe una copia de esta foto a sus amigos; segundo, si sube esta excelente foto a QQ (Weibo) y otros, obtendrá una dirección de acceso a esta foto (URL), y luego comparta esta URL con sus amigos.
Como se muestra en el ejemplo anterior, el primero puede considerarse un paso por valor, y el segundo puede considerarse un paso por referencia (paso por referencia). Una vez que se entienden estos conceptos, se procederá a un análisis simple.

Paso por valor:Sólo cuando los parámetros son variables de tipo básico, Java realiza la transmisión de esta manera.

En el caso de compartir la foto, si el amigo recibe una copia de la foto, las modificaciones del amigo no afectarán su foto, y las modificaciones en su foto no afectarán la foto compartida con el amigo.

Paso por referencia:Sólo cuando los parámetros son variables de tipo referencia, Java realiza la transmisión de esta manera.
Si la dirección URL superior se proporciona al amigo, y si el amigo tiene permiso para modificar, al realizar la operación en la foto, la foto que el amigo accede es el resultado de la operación del amigo.

A continuación, se explicará este ejemplo mediante código:

paquete com.dufy.reforvalue;
import java.util.Arrays;
/**
 * Paso por valor y paso por referencia en java
 * Paso por valor: variables de tipo básico-Paso por valor, el paso por valor implica obtener una copia de los parámetros
 * Paso por referencia: variables de tipo referencia-Paso por referencia, el paso por referencia implica pasar la dirección de referencia del objeto
 * 
 * @author dufy
 * @creation 2017Año2Mes9Día
 */
public class ReferenceOrValue {
 /**
  * Tipos básicos, paso por valor
  * Por ejemplo: compartir la foto con un amigo, el amigo recibe una copia real de la foto.
  * Usted y sus amigos pueden realizar operaciones en sus propias fotos sin afectar las fotos de los demás!
  */
 public static void testVal(int photo){
  photo++;//El amigo realiza cambios en la foto
  System.out.println("Mi amigo ve la foto = " + photo);
 }
 /**
  * Tipos de referencia:传递 por dirección
  * Por ejemplo: compartir la foto con un amigo, lo que se comparte es la URL (dirección) de la foto que subió a Internet.
  * Usted y sus amigos pueden acceder a la foto a través de esta dirección y realizar una operación en la foto!
  */
 public static void testRef(Photo photo){
  photo.setPhoto("java Photo,Great!");//El amigo cambia tu foto
  System.out.println("Mi amigo ve la foto = " + photo.getPhoto());
 }
 /**
  * Tipos de referencia:传递 por dirección
  * Dado que el array es un tipo de referencia. Por lo tanto, lo que se pasa es su referencia, por lo que en el método intercambian sus valores, también afectarán necesariamente sus valores originales.
  */
 public static void testArrayRef(int[] array){
  for (int i = 0; i < array.length; i++) {
   array[i] = 0;
  }
  System.out.println("testArrayRef array is = "+Arrays.toString(array)));
 }
 public static void main(String[] args) {
  //Uno:传递 por valor
  int photo = 10;//Definir la foto a enviar
  testVal(photo);//Enviar la foto a tu amigo, tu amigo recibe una copia
  System.out.println("Yo veo la foto = " + photo);
  //Dos:传递地址
  Photo p = new Photo();//Definir un objeto de foto, que yo mismo tomé java photo
  p.setPhoto("java photo");
  testRef(p);//Enviar el objeto de foto (es decir, la dirección URL) a tu amigo, tu amigo debe recibir una URL (dirección), y al abrir la URL es donde está la foto
  System.out.println("Mi amigo ve la foto = " + p.getPhoto());
  //Tres: El array también es un objeto, el array está en la memoria de pila. La referencia está en la memoria de stack.
  int array[] = {1,2,3,4,5};
  testArrayRef(array);
  System.out.println("array is = "+Arrays.toString(array)));
 }
 /**
  * Clase de foto
  */
 clase estática Photo{
  String photo;
  public String getPhoto() {
   devolver photo;
  }
  public void setPhoto(String photo) {
   this.photo = photo;
  }
 }
}

El resultado de salida es el siguiente:

Mi amigo ve la foto = 11
Yo veo la foto = 10
Mi amigo ve la foto = java Photo, ¡Excelente!
Mi amigo ve la foto = java Photo, ¡Excelente!
La referencia de array es = [0, 0, 0, 0, 0]
array is = [0, 0, 0, 0, 0]

Intermezzo: Hay un problema como este: ¿cómo debe escribirse este método?

public static void main(String[] args) {
  int a = 10;
  int b = 20;
  method(a,b);//Es necesario que se imprima solo a = después de que el método method sea llamado,100,b=200, escriba el método method(a,b)!
  System.out.println("a = ", + a);
  System.out.println("b = ", + b);
 }

Sin duda, muchas personas, como yo antes, sin pensarlo, escribieron el siguiente código:

private static void method(int a, int b) {
  a*=10;
  b*=10;
 }

¡Pero después de ejecutar el resultado, descubrirá que no se imprimió el resultado esperado!

¡Ahora, si observa atentamente la introducción anterior, no es difícil entender por qué se produjo este resultado!

Ofreceremos los posibles resultados correctos de este problema:

private static void method(int a, int b) {
  System.out.println("a=",100,b=200");
  System.exit(0);
 }

Lo que se mencionó anteriormente es lo que el editor le ha presentado a todos sobre la pasaje por valor y por referencia de Java (frecuentemente preguntado en entrevistas), espero que les sea útil. Si tienen alguna pregunta, déjenme un mensaje y responderé a tiempo. También agradezco mucho el apoyo de todos a la página web de tutorial de clamor!

Declaración: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha contribuido y subido por los usuarios de Internet, este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume ninguna responsabilidad legal. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @) para denunciar y proporcionar pruebas relacionadas. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustaría que te gustara