Transferencia de valor y transferencia de referencia de Java (con ejemplos)

Consejos antes de ver:

La versión de IDEA utilizada en este artículo es la última 2019.1, y la versión JDK es 1.8.0_141.

1. Tipo de datos

1.1 Tipos de datos básicos

Los tipos de datos básicos incluyen numérico (entero y punto flotante), carácter y booleano

  1. Tipo de entero: byte, corto, int, largo
  2. Punto flotante: flotar, doble
  3. Tipo de carácter: char
  4. Booleano: booleano

El siguiente código de programa muestra el número de bits, el tipo de empaquetado, el valor máximo y el valor mínimo de estos tipos de datos básicos.

package testBasicDataType;

public class Test {
    
    

    public static void main(String[] args) {
    
    
        //byte
        System.out.println("数据类型为 :" + Byte.TYPE);
        System.out.println("二进制位数 :" + Byte.SIZE);
        System.out.println("包装类为 :" + Byte.class);
        System.out.println("最大值为 :" + Byte.MAX_VALUE);
        System.out.println("最小值为 :" + Byte.MIN_VALUE);
        System.out.println("\n");

        //short
        System.out.println("数据类型为 :" + Short.TYPE);
        System.out.println("二进制位数 :" + Short.SIZE);
        System.out.println("包装类为 :" + Short.class);
        System.out.println("最大值为 :" + Short.MAX_VALUE);
        System.out.println("最小值为 :" + Short.MIN_VALUE);
        System.out.println("\n");

        //int
        System.out.println("数据类型为 :" + Integer.TYPE);
        System.out.println("二进制位数 :" + Integer.SIZE);
        System.out.println("包装类为 :" + Integer.class);
        System.out.println("最大值为 :" + Integer.MAX_VALUE);
        System.out.println("最小值为 :" + Integer.MIN_VALUE);
        System.out.println("\n");

        //long
        System.out.println("数据类型为 :" + Long.TYPE);
        System.out.println("二进制位数 :" + Long.SIZE);
        System.out.println("包装类为 :" + Long.class);
        System.out.println("最大值为 :" + Long.MAX_VALUE);
        System.out.println("最小值为 :" + Long.MIN_VALUE);
        System.out.println("\n");

        //float
        System.out.println("数据类型为 :" + Float.TYPE);
        System.out.println("二进制位数 :" + Float.SIZE);
        System.out.println("包装类为 :" + Float.class);
        System.out.println("最大值为 :" + Float.MAX_VALUE);
        System.out.println("最小值为 :" + Float.MIN_VALUE);
        System.out.println("\n");

        //Double
        System.out.println("数据类型为 :" + Double.TYPE);
        System.out.println("二进制位数 :" + Double.SIZE);
        System.out.println("包装类为 :" + Double.class);
        System.out.println("最大值为 :" + Double.MAX_VALUE);
        System.out.println("最小值为 :" + Double.MIN_VALUE);
        System.out.println("\n");

        //char
        System.out.println("数据类型为 :" + Character.TYPE);
        System.out.println("二进制位数 :" + Character.SIZE);
        System.out.println("包装类为 :" + Character.class);
        System.out.println("最大值为 :" + (int) Character.MAX_VALUE);
        System.out.println("最小值为 :" + (int) Character.MIN_VALUE);
        System.out.println("\n");

        //boolean
        System.out.println("数据类型为 :" + Boolean.TYPE);
        System.out.println("包装类为 :" + Boolean.class);
        System.out.println("真值为 :" + Boolean.TRUE);
        System.out.println("假值为 :" + Boolean.FALSE);
    }
}

Los resultados son los siguientes
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

1.2 Tipos de datos de referencia

Incluyendo clase, tipo de interfaz, tipo de matriz, tipo de enumeración, tipo de anotación, tipo de cadena

2. Parámetros reales de participación formal

2.1 Uso en funciones

  1. Los parámetros formales aparecen en la definición de la función y se pueden usar en todo el cuerpo de la función, pero no se pueden usar fuera de la función.

  2. El parámetro actual aparece en la función de llamada. Después de ingresar la función llamada, la variable de parámetro real no se puede utilizar.

2.2 Llamar

  1. La variable de parámetro formal asigna la unidad de memoria solo cuando se llama y libera la unidad de memoria asignada inmediatamente al final de la llamada. Por tanto, los parámetros formales solo son válidos dentro de la función. Una vez que finaliza la llamada a la función y vuelve a la función principal que llama, la variable de parámetro formal ya no se puede utilizar.

  2. Los parámetros reales pueden ser constantes, variables, expresiones, funciones, etc., sin importar qué tipo de cantidad sean los parámetros reales, deben tener ciertos valores al llamar a una función, para que estos valores se puedan transferir a los parámetros formales. Por lo tanto, debe utilizar la asignación, la entrada y otros métodos de antemano para obtener un cierto valor para el parámetro.

3. Pasar por valor y pasar por referencia

3.1 Definición

  1. Pasar
    por valor Cuando se llama a un método, los parámetros pasados ​​se pasan por copia de valor.

  2. Pasar
    por referencia Al llamar a un método, los parámetros pasados ​​se pasan por referencia, de hecho, la dirección de la referencia pasada es la dirección del espacio de memoria correspondiente a la variable.

3.2 Ejemplos

Ejemplo 1

package testTransfer;

public class Test {
    
    
    public static void main(String[] args) {
    
    
        int num = 10;
        num = 100;
        System.out.println(num);

        String str = "ab";
        str = "bd";
        System.out.println(str);

    }
}

Los resultados de la operación son los
Inserte la descripción de la imagen aquí
siguientes

El tipo de datos básico es la asignación directa y el tipo de referencia es abrir una nueva dirección y volver a asignar la nueva dirección.
Inserte la descripción de la imagen aquí

Ejemplo 2

package testTransfer;

import java.util.ArrayList;
import java.util.List;

public class Test {
    
    
    public static void main(String[] args) {
    
    
        int num = 10;
        System.out.println("num改变前:" + num);
        changeNum(10);
        System.out.println("num改变后:" + num);

        String str = "ab";
        System.out.println("str改变前:" + str);
        changeStr(str);
        System.out.println("str改变后:" + str);

        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        System.out.println("list.get(1)改变前:" + list.get(1));
        changeList(list);
        System.out.println("list.get(1)改变后:" + list.get(1));

        String[] strings = new String[]{
    
    "a", "b"};
        System.out.println("strings[1]改变前:" + strings[1]);
        changeStrArray(strings);
        System.out.println("strings[1]改变后:" + strings[1]);

        User user = new User();
        user.name = "张三";
        user.age = 30;
        System.out.println("user.name改变前:" + user.name);
        System.out.println("user.age改变前:" + user.age);
        changeUserName(user);
        changeUserAge(user);
        System.out.println("user.name改变后:" + user.name);
        System.out.println("user.age改变后:" + user.age);
    }

    private static void changeNum(int num){
    
    
        num = 100;
    }

    private static void changeStr(String str){
    
    
        str = "abcd";
    }

    private static void changeList(List<String> list){
    
    
        list.set(1,"cd");
    }

    private static void changeStrArray(String[] strings){
    
    
        strings[1] = "cd";
    }

    private static void changeUserName(User user){
    
    
        user.name = "李四";
    }

    private static void changeUserAge(User user){
    
    
        user.age = 31;
    }
}

class User{
    
    
    String name;
    int age;
}

Los resultados de la operación son los
Inserte la descripción de la imagen aquí
siguientes

  1. El valor pasado por el parámetro de tipo de datos básico es una copia de este valor real, por lo que no importa qué otros valores se asignen a esta copia, el valor original no cambiará.

  2. Para los tipos de referencia (excepto String), lo que se pasa es una copia de la dirección de referencia del valor almacenado (es decir, la referencia antes y después de la transferencia es la misma), cambiar el valor apuntado por la dirección de referencia de esta copia cambiará el contenido del valor original.

3.3 Conclusión

  1. Las operaciones de los tipos de datos básicos son todas transferencia de valor. Dado que el contenido original y la copia almacenan valores reales y están en diferentes áreas de pila, el funcionamiento de los parámetros formales no afecta el contenido original.

  2. Básicamente (excepto para String) las operaciones en datos de tipo de referencia son "pasar por referencia" (pasando la dirección referenciada). Hay dos casos: uno es que el parámetro formal y el parámetro real siguen apuntando a la misma dirección de objeto, y la operación del parámetro formal afectará el contenido del objeto apuntado por el parámetro real. Una es que el parámetro formal se cambia para apuntar a la nueva dirección del objeto (como la referencia de reasignación), entonces la operación del parámetro formal no afectará el contenido del objeto apuntado por el parámetro real.

Supongo que te gusta

Origin blog.csdn.net/weixin_43611145/article/details/103561154
Recomendado
Clasificación