Explicación detallada de la estrategia de evaluación de Java

La estrategia de evaluación de Java

Anteriormente introdujimos llamada por valor, llamada por referencia y llamada por valor como casos especiales de llamada por objeto compartido Entonces, ¿qué estrategia de evaluación se usa en Java?

Mucha gente dice que los tipos de datos básicos en Java se pasan por valor. Básicamente, no hay nada que discutir sobre esto, y generalmente piensan que sí.

Sin embargo, mucha gente cree erróneamente que pasar objetos en Java es pasar por referencia. La razón de este malentendido se debe principalmente a que existe una relación de referencia entre las variables y los objetos en Java. En el lenguaje Java, los objetos se manipulan a través de referencias a objetos. Por eso, mucha gente piensa que el paso de objetos es el paso de referencias.

Y muchas personas también pueden citar los siguientes ejemplos de código:

public static void main(String[] args) {
  Test pt = new Test();

  User hollis = new User();
  hollis.setName("Hollis");
  hollis.setGender("Male");
  pt.pass(hollis);
  System.out.println("print in main , user is " + hollis);
}

public void pass(User user) {
  user.setName("hollischuang");
  System.out.println("print in pass , user is " + user);
}

Resultado de salida:

print in pass , user is User{name='hollischuang', gender='Male'}
print in main , user is User{name='hollischuang', gender='Male'}

Se puede ver que después de pasar el tipo de objeto al método de paso, su contenido cambia dentro del método y, finalmente, el objeto en el método principal de la persona que llama también cambia.

Por lo tanto, mucha gente dice que esto es lo mismo que el fenómeno de pasar por referencia, es decir, cambiar el valor del parámetro en el método afectará a la persona que llama.

Sin embargo, esto es en realidad un malentendido.

Paso de objetos en Java

Muchas personas usan el fenómeno de los ejemplos de código para explicar que los objetos de Java se pasan por referencia, así que comencemos con el fenómeno y refutemos primero este punto de vista.

Como dijimos antes, ya sea pasando por valor o pasando por referencia, es solo una especie de estrategia de evaluación. Hay muchas otras estrategias de evaluación. Por ejemplo, el fenómeno de pasar objetos compartidos mencionado anteriormente es lo mismo que pasar por referencia. . Entonces, ¿por qué dice que el paso de parámetros en Java debe pasarse por referencia en lugar de un objeto compartido?

Entonces, ¿cuál es la forma de paso de objetos en Java? De hecho, es realmente una transferencia de objeto compartido.

De hecho, en "Los tutoriales de Java™", hay instrucciones sobre esta parte del contenido. En primer lugar, los tipos básicos se describen a continuación:

Los argumentos primitivos, como un int o un doble, se pasan a los métodos por valor. Esto significa que cualquier cambio en los valores de los parámetros existe solo dentro del alcance del método. Cuando el método regresa, los parámetros desaparecen y se pierden todos los cambios realizados en ellos.

Es decir, el parámetro original se pasa al método por valor. Esto significa que cualquier cambio en los valores de los parámetros solo existe dentro del alcance del método. Cuando el método regresa, los parámetros desaparecen y se pierden todos los cambios realizados en ellos.

La descripción de la transferencia de objetos es la siguiente:

Los parámetros de tipos de datos de referencia, como los objetos, también se pasan a los métodos por valor. Esto significa que cuando el método regresa, la referencia pasada todavía hace referencia al mismo objeto que antes. Sin embargo, los valores de los campos del objeto se pueden cambiar en el método, si tienen el nivel de acceso adecuado.

Es decir, los parámetros de tipos de datos de referencia, como los objetos, también se pasan a los métodos por valor. Esto significa que cuando el método regresa, la referencia pasada todavía se refiere al mismo objeto que antes. Sin embargo, los campos de objeto pueden cambiar sus valores dentro de un método si tienen el nivel de acceso adecuado.

La documentación oficial sobre este punto ha señalado claramente que Java está pasando por valor, pero pasando la referencia del objeto como valor al método. Eche un vistazo más de cerca, ¿no es esto la transferencia de objetos compartidos?

**De hecho, la estrategia de evaluación utilizada en Java es pasar la llamada al objeto compartido, es decir, Java pasará una copia de la dirección del objeto al parámetro formal de la función llamada. ** Es solo que la palabra "pasar llamada de objeto compartido" no se usa comúnmente, por lo que las personas en la comunidad de Java generalmente dicen "Java es llamada por valor", lo cual es cierto, porque la llamada por objeto compartido es en realidad un caso especial de llamada por valor

¿El fenómeno del paso de valores y el paso de objetos compartidos entran en conflicto?

Al ver esto, muchas personas pueden tener una pregunta: dado que la transferencia de objetos compartidos es un caso especial de transferencia de valor, ¿por qué sus fenómenos son completamente diferentes?

¿Es posible que durante el proceso de transferencia de valor, si se cambia el valor en el método llamado, también pueda afectar a la persona que llama? Entonces, ¿cuándo se verá afectado y cuándo no se verá afectado?

De hecho, no hay conflicto.La razón de esta confusión es que todos han entendido mal lo que es un "valor de cambio".

Volvamos al ejemplo anterior y veamos qué sucede realmente durante la llamada.

pasaporte2

En el proceso de paso de parámetros, la dirección del parámetro real 0X1213456se copia en el parámetro formal. Este proceso es en realidad pasar valor, pero el valor pasado es la aplicación del objeto.

Entonces, ¿por qué cambiamos el valor del atributo en el usuario, pero afectó al usuario original?

De hecho, este proceso es como: copiaste una llave de tu casa a tu amigo, y después de que él obtuvo la llave, no hizo ningún cambio en la llave, sino que abrió la habitación de tu casa a través de la llave. , entra en la casa y destroza tu televisor.

Este proceso no tiene efecto en la llave que tienes en la mano, pero el contenido de la casa correspondiente a tu llave ha cambiado.

Es decir, la transferencia de objetos Java es pasar la relación de referencia copiando. Si no cambiamos la relación de referencia, pero encontramos la dirección de referencia y cambiamos el contenido dentro, tendrá un impacto en la persona que llama. Porque todos apunta al mismo objeto compartido.

Entonces, si cambiamos el contenido del método pass:

public void pass(User user) {
  user = new User();
  user.setName("hollischuang");
  user.setGender("Male");
  System.out.println("print in pass , user is " + user);
}

En el código anterior, recreamos un nuevo objeto de usuario en el método de paso y cambiamos su valor. El resultado es el siguiente:

print in pass , user is User{name='hollischuang', gender='Male'}
print in main , user is User{name='Hollis', gender='Male'}

Echemos un vistazo a lo que sucedió en todo el proceso:

pasaporte1

Este proceso es como si le copiaras una llave a tu amigo. Después de que tu amigo obtuvo la llave que le diste, buscó un cerrajero para modificarla y la llave en su mano se convirtió en una llave abierta. La llave de su cerradura. En este momento, si abrió su casa, incluso si ordenó la casa, no tendría ningún efecto sobre las llaves en su mano o en su casa.

Por lo tanto, si la transferencia del objeto en Java es para modificar la referencia, no tendrá ningún impacto en el objeto original, pero si modifica directamente el valor de la propiedad del objeto compartido, tendrá un impacto en el objeto original.

Resumir

Sabemos que los lenguajes de programación necesitan pasar parámetros entre métodos, y esta estrategia de paso se llama estrategia de evaluación.

En programación existen muchas estrategias de evaluación, las más comunes son pasar por valor y pasar por referencia. También hay un caso especial de transferencia de valor: la transferencia de objetos compartidos.

La mayor diferencia entre pasar por valor y pasar por referencia es si se copia una copia durante el proceso de pasar.Si se pasa una copia, se pasa por valor, de lo contrario se pasa por referencia.

En Java, en realidad es el paso de parámetros a través del paso de valores, pero para el paso de objetos Java, el contenido pasado es una referencia al objeto.

Podemos concluir que la estrategia de evaluación en Java es el paso de objetos compartidos, lo cual es completamente cierto.

Sin embargo, para que todos entiendan lo que dijo, decimos que solo hay transferencia de valor en Java, pero el contenido pasado es una referencia al objeto. Esto también está bien.

Sin embargo, nunca se debe suponer que existe el paso por referencia en Java.

OK, lo anterior es todo el contenido de este artículo, no sé si este artículo te haya ayudado a resolver las dudas de tu corazón. Bienvenido a dejar un mensaje para decirnos sus pensamientos.

Supongo que te gusta

Origin blog.csdn.net/zy_dreamer/article/details/132364870
Recomendado
Clasificación