El concepto de objetos y referencias en ava es muy completo.

  Para facilitar la descripción, primero defina una clase:

  Con esta clase, puede usarla para crear objetos: Vehículo veh1 = nuevo Vehículo (). La acción de esta declaración generalmente se llama crear un objeto. De hecho, contiene cuatro acciones:

  El nuevo Vehículo a la derecha usa la clase Vehículo como plantilla para crear un objeto de clase Vehículo (también llamado objeto Vehículo para abreviar) en el espacio de almacenamiento dinámico.

  El () al final significa que, después de crear el objeto, se llama al constructor de la clase Vehículo inmediatamente para inicializar el objeto recién generado. Definitivamente hay constructores. Si no lo escribió, Java completará un constructor predeterminado para usted

  Vehículo veh1 a la izquierda crea una variable de referencia de clase Vehículo. La llamada referencia de clase de vehículo es una referencia de objeto que se puede usar para apuntar al objeto de vehículo en el futuro

  = El operador hace que el objeto haga referencia al objeto Vehículo recién creado

  Podemos dividir esta declaración en dos partes:

  1.Vehículo veh1;

  2.veh1 = nuevo vehículo ();

  El efecto es el mismo. Es más claro escribir de esta manera: hay dos entidades: una es la variable de referencia del objeto y la otra es el objeto mismo.

  Las entidades creadas en el espacio de almacenamiento dinámico son diferentes de las entidades creadas en el segmento de datos y el espacio de pila. Aunque también son entidades reales, no podemos verlas ni tocarlas. No solo eso,

  Echemos un vistazo más de cerca a la segunda oración: ¿Cuál es el nombre del objeto recién creado? Algunas personas dicen que se llama "Vehículo". No, "Vehículo" es el nombre de la clase (creación de plantilla para objetos).

  Una clase de Vehículo puede crear innumerables objetos basados ​​en esto, estos objetos no pueden llamarse "Vehículo".

  El objeto ni siquiera tiene un nombre, y no puede acceder a él directamente. Solo podemos acceder a los objetos indirectamente a través de referencias de objetos.

  Para ilustrar los objetos, las referencias y las relaciones entre ellos, es posible una metáfora que no sea apropiada. El objeto es como un gran globo, tan grande que no podemos atraparlo. La variable de referencia es una cuerda que se puede usar para atar globos.

  Si solo se ejecuta la primera instrucción y la segunda no se ha ejecutado, la variable de referencia veh1 creada en este momento aún no ha apuntado a ningún objeto, y su valor es nulo. La variable de referencia puede apuntar a un objeto o ser nula.

  Es una soga, una soga que no ha sido atada con ningún globo. Después de ejecutar la segunda oración, se hizo un nuevo globo y se ató al vehículo de cuerda. Cuando agarramos esta cuerda, atrapamos el globo.

  Una oración más: Vehículo veh2;

  Acabo de hacer otra cuerda sin atar el globo.

  Si agrega otra oración: veh2 = veh1;

  Atado Aquí se produce un comportamiento de copia. Sin embargo, debe tenerse en cuenta que el objeto en sí no se copia, solo se copia la referencia del objeto. Como resultado, veh2 también apunta al objeto señalado por veh1. Las dos cuerdas están atadas al mismo globo.

  Si crea otro objeto con la siguiente oración: veh2 = new Vehicle ();

  Luego, la variable de referencia veh2 se cambia para apuntar al segundo objeto.

  De la descripción y deducción anteriores, podemos obtener las siguientes conclusiones:

  Una referencia de objeto puede apuntar a 0 o 1 objeto (una cuerda se puede atar a un globo o un globo)

  Un objeto puede tener N referencias apuntando a él (puede haber N cuerdas atadas a un globo)

  Si vienes a la siguiente declaración: veh1 = veh2;

  De acuerdo con la inferencia anterior, veh1 también apunta al segundo objeto. Esto no es problema La pregunta es el primer objeto? Sin una cuerda para atarlo, voló. La mayoría de los libros dicen que fue recolectado por el mecanismo de recolección de basura de Java.

  Esto no es exacto. Para ser correcto, se ha convertido en el objetivo de procesamiento del mecanismo de recolección de basura. En cuanto a cuándo se recicla realmente, depende del estado de ánimo del mecanismo de recolección de basura.

  Desde este punto de vista, ¿la siguiente declaración debería ser ilegal? Al menos inútil?

  Vehículo nuevo ();

  Mal. Es legal y utilizable. Por ejemplo, si creamos un objeto solo para imprimir, no necesitamos vincularlo con variables de referencia. Lo más común es imprimir una cadena: System.out.println ("¡Soy Java!"); El objeto de cadena "¡Soy Java!" Se descarta después de la impresión. Algunas personas llaman a estos objetos objetos temporales.

  La relación entre el objeto y la referencia continuará hasta que el objeto sea reciclado.

  Segundo, objetos y referencias Java.

  Los objetos y referencias Java son el conocimiento básico que es fácil de confundir pero que debe dominarse. Este capítulo elabora los conceptos de objetos y referencias Java, y la transferencia de parámetros estrechamente relacionados con ellos.

  Primero mira el siguiente programa:

  StringBuffer s;

  s = new StringBuffer ("¡Hola, mundo!");

  La primera instrucción solo asigna espacio para referencias, mientras que la segunda instrucción genera una instancia (u objeto) para la clase llamando al constructor StringBuffer (String str) de la clase (StringBuffer). Una vez completadas estas dos operaciones, se puede acceder al contenido del objeto a través de s-in Java, el objeto se manipula por referencia.

  Se puede decir que la relación entre objetos Java y referencias está relacionada entre sí, pero es independiente la una de la otra. Independientemente el uno del otro se manifiesta principalmente en: la referencia se puede cambiar, puede apuntar a otros objetos, como los anteriores, puede darle otro objeto, como:

  s = nuevo StringBuffer ("Java");

  De esta manera, s se desconecta del primer objeto al que apunta.

  En términos de espacio de almacenamiento, los objetos y las referencias también son independientes. Se almacenan en diferentes lugares. Los objetos generalmente se almacenan en el montón y las referencias se almacenan en la pila más rápida.

  Las referencias pueden apuntar a diferentes objetos, y los objetos también pueden ser manipulados por múltiples referencias, tales como:

  StringBuffer s1 = s;

  Esta declaración hace que s1 ys apunten al mismo objeto. Dado que dos referencias apuntan al mismo objeto, no importa qué referencia se use para manipular el objeto, el contenido del objeto cambia y solo hay una copia. El contenido obtenido a través de s1 y s es naturalmente el mismo, (excepto String, porque String es siempre el mismo String s1 = "AAAA"; String s = s1, la operación s, s1 es siempre la misma, por lo que abre espacio para que s almacene s), como en el siguiente programa:

  El programa anterior muestra que el contenido impreso por s1 ys es el mismo. Este resultado parece muy confuso, pero piense en ello, s1 ys son solo dos referencias, son solo joysticks, apuntan al mismo objeto , Se manipula el mismo objeto y se obtiene el contenido del mismo objeto a través de ellos.

  Esto es como los frenos y el acelerador de un automóvil. Controlan la velocidad del automóvil. Si el automóvil arranca a 80, pisa el acelerador una vez y el automóvil acelera. Si la velocidad del automóvil llega a 120, entonces presiona el freno. Comienza a disminuir desde 120. Si cae a 60 y se pisa nuevamente el acelerador, la velocidad del vehículo aumentará de 60 en lugar de 120 después del primer paso del acelerador. En otras palabras, la velocidad del automóvil se ve afectada tanto por el acelerador como por el freno. Sus efectos son acumulativos, no independientes (a menos que el freno y el acelerador no estén en un automóvil).

  Por lo tanto, en el programa anterior, no importa si s1 o s se utiliza para manipular el objeto, su impacto en el objeto también es acumulativo (más referencias son las mismas).

  3. Solo cuando comprenda la relación entre objetos y referencias podrá comprender el paso de parámetros

  En las preguntas generales de la entrevista, se prueba la cuestión de pasar parámetros en Java, y su respuesta estándar es que Java solo tiene un método para pasar parámetros: es decir, pasar por valor, es decir, todo lo que se pasa en Java se pasa por valor. Si el método entrante es de tipo básico, obtendrá una copia de este tipo básico. Si es por referencia, obtendrá una copia de la referencia.

  En general, podemos entender fácilmente la transferencia de tipos básicos, y para los objetos, siempre se siente como pasar por referencia, consulte el siguiente programa:

  El resultado permitido del programa anterior muestra que los parámetros del método testBasicType son tipos básicos, aunque el valor del parámetro m cambia, no afecta a i.

  El parámetro del método add es un objeto. Cuando sMain se pasa al parámetro s, s obtiene una copia de sMain, entonces s y sMain apuntan al mismo objeto. Por lo tanto, el efecto de usar la operación s es en realidad el objeto señalado por sMain, así que llame Después del método add, el contenido del objeto señalado por sMain ha cambiado.

  En el método changeRef, el parámetro también es un objeto. Cuando sMain se pasa al parámetro s, s obtiene una copia de sMain, pero a diferencia del método add, el objeto al que apunta s cambia en el cuerpo del método (es decir, s apunta a otro Objeto, cambie el globo sosteniendo la cuerda del globo), después de reasignar s, sy sMain ya no están relacionados, este y sMain apuntan a diferentes objetos, por lo que no importa qué operación se realice en s, no afectará a sMain apuntando Object, por lo que el contenido del objeto señalado por sMain antes y después del método changeRef no cambia.

  Por el resultado de llamar al método add, muchas personas pueden sentir lo siguiente: ¿No está claro que se pasa por referencia? Para este tipo de problema, aún aplique las palabras de Bruce Eckel: depende de cómo vea la cita, y eventualmente comprenderá que este argumento no es tan importante. Lo que realmente importa es que comprenda que pasar referencias hace que la modificación del objeto (llamante) sea impredecible.

  Solo hay una respuesta: los parámetros se pasan por valor en Java. De hecho, debemos entender qué sucede cuando el parámetro es un objeto, por referencia (al igual que el método de agregar anterior).

  Resumen:

  La siguiente expresión: A a1 = new A ();

  Representa que A es una clase, a1 es una referencia, a1 no es un objeto, la nueva A () es un objeto y a1 hace referencia al objeto de la nueva A ().

  En JAVA, "=" no puede considerarse como una declaración de asignación, no está asignando un objeto a otro objeto, su proceso de ejecución es esencialmente pasar la dirección del objeto derecho a la referencia izquierda, haciendo que la izquierda La referencia apunta al objeto a la derecha. Java no parece tener un puntero en la superficie, pero su referencia es esencialmente un puntero. Lo que se almacena en la referencia no es el objeto, sino la dirección del objeto, de modo que la referencia apunta al objeto. En Java, la declaración "=" no debe traducirse en una declaración de asignación, porque de hecho no es un proceso de asignación, sino un proceso de pasar direcciones. Ser traducida en una declaración de asignación causará muchos malentendidos y una traducción inexacta .

  Otro ejemplo: A a2;

  Representa que A es una clase, a2 es una referencia, a2 no es un objeto, el objeto señalado por a2 está vacío nulo;

  Otro ejemplo: a2 = a1;

  Representa que a2 es una referencia y a1 también es una referencia. La dirección del objeto al que apunta a1 se pasa a a2 (dirección), de modo que a2 y a1 apuntan al mismo objeto.

  En resumen, se puede escribir simplemente que durante la inicialización, el lado izquierdo de la declaración "=" es una referencia, y el nuevo de la derecha es un objeto.

  Cuando las declaraciones izquierda y derecha se citan "=", las referencias izquierda y derecha apuntan al objeto señalado por la referencia derecha al mismo tiempo.

  La llamada instancia es en realidad un sinónimo de objeto.

Supongo que te gusta

Origin www.cnblogs.com/javaxiachen/p/12707284.html
Recomendado
Clasificación