java - tipos - variable tipo objeto
AsignaciĆ³n de objetos Java (6)
Soy nuevo en Java y tengo algunas preguntas en mente con respecto a la asignación de objetos. Por ejemplo,
Test t1 = new Test();
Test t2 = t1;
t1.i=1;
Suponiendo que la variable i
se define dentro de la clase de prueba, ¿es correcto suponer que tanto t1 como t2 apuntan al mismo objeto donde la modificación t1.i=1
afecta tanto a t1
como a t2
? En realidad lo probé y parece que tenía razón. Sin embargo, cuando intento lo mismo en String
, la modificación ocurre solo en un lado donde el otro lado no se ve afectado. Cuál es la razón detrás de esto?
Editar: El caso que probé con String.
String s1 = "0";
String s2 = s1;
s1 = "1";
System.out.println(s1);
System.out.println(s2);
Me doy cuenta de mi error al probar los casos en String ya que es inmutable. La situación en la que pensé que s1="1"
modificaba la cadena, de hecho está devolviendo la referencia de "1" a s1. Sin embargo, mi pregunta permanece. Test t2 = t1;
¿Por qué tanto t2 como t1 apuntan al mismo objeto o cada uno tiene sus propios objetos? ¿Esta situación se aplica a todos los objetos en Java?
Estás en lo cierto con tu primera suposición. Con la siguiente línea de código:
Test t1 = new Test();
crea un nuevo objeto Test y, al mismo tiempo, crea una referencia de Prueba llamada t1 para referirse a ella.
En la segunda línea del código que publicó:
Test t2 = t1;
En realidad está creando otra referencia de prueba, y la asigna para referirse al mismo objeto al que se refiere t1.
Entonces t1.i = 1;
afectará a t2.i
ya que es el mismo objeto después de todo.
En cuanto a las cadenas, las cadenas son inmutables y no se pueden modificar una vez creadas.
En cuanto a tu edición:
String s1 = "0";
String s2 = s1;
s1 = "1";
System.out.println(s1);
System.out.println(s2);
Imprimirán resultados diferentes, porque cuando dices
s1 = "1";
en realidad estás vinculando s1 a otro objeto String, pero s2 todavía se referirá al objeto con el valor "0".
Estás haciendo cosas completamente diferentes en los dos casos. En el primer caso, con t1.i = 1;
, estás modificando el objeto apuntado por t1
. En el segundo caso, con t1 = "1";
, está cambiando la referencia para señalar otro objeto (similar a cuando lo hizo t2 = t1;
Si haces lo mismo para Test
que lo hiciste en el segundo caso, obtendrías el mismo resultado (suponiendo que Test
tenga un constructor que tome un número entero):
Test t1 = new Test(5);
Test t2 = t1;
t2 = new Test(1); // Here we are assigning to the variable, just like your 2nd example
System.out.println(t1);
System.out.println(t2);
La gente menciona que String
es inmutable. Pero eso es irrelevante y no hay un concepto de "mutabilidad" en el lenguaje y no hay diferencia entre cómo funcionan las clases "mutables" e "inmutables". Informamos informalmente que una clase es "inmutable" si no tiene ningún campo que pueda establecer o cualquier método que pueda cambiar su contenido interno. Tal es el caso con String
. Pero una clase mutable funcionaría exactamente de la misma manera si simplemente no haces nada para mutarla.
La cadena es un objeto como cualquier otro. Entonces, cualquier variable que les asigne se refiere a la misma instancia del objeto, como lo hace con su objeto de prueba.
Pero tenga en cuenta que String no tiene un campo que pueda establecer como lo hace en Prueba, por lo que básicamente no puede hacer la misma prueba, por lo que no hay forma de transferir el código del objeto Prueba al objeto Cadena.
Obtienes un comportamiento opuesto usando tipos primitivos, tales como long, int, etc. Se asignan a variables "por valor", así que si lo haces
int t1 = 12;
int t2 = t1;
t1=15;
t2 todavía tiene valor 12
Tiene toda la razón, ya que tanto t1 como t2 se refieren al mismo objeto, cualquier chane en el estado del objeto afectará a ambos.
La cadena es un objeto inmutable. Entonces no puede ser modificado en absoluto. mira esto para obtener más información sobre el objeto inmutable en java.
Los objetos de cadena son inmutables .
EDITAR
Test t2 = t1;
¿Por qué tanto t2 como t1 apuntan al mismo objeto o cada uno tiene sus propios objetos?
Sí. Aunque t2
es una referencia nueva, pero apuntará al mismo objeto, porque usted le dijo que lo hiciera. Cree una nueva referencia t2
de tipo Test
y permita que apunte al mismo objeto al que apunta t1
.
Pero, cuando haces esto con String
s y luego haces algo como s1 = "1" ;
estás haciendo punto s1 a otro objeto String. Puedes pensarlo en términos s1 = new String(1);
.
Tienes razón, pero las cadenas son un caso especial; son inmutables y actúan como primitivos en este caso.
@newacct
Cito http://docs.oracle.com/javase/tutorial/java/data/strings.html :
Nota: La clase String es inmutable, por lo que una vez creada, no se puede cambiar un objeto String. La clase String tiene una serie de métodos, algunos de los cuales se analizarán a continuación, que parecen modificar cadenas. Como las cadenas son inmutables, lo que realmente hacen estos métodos es crear y devolver una nueva cadena que contenga el resultado de la operación.
Esto es lo que hace que las cuerdas sean un caso especial. Si no sabe esto, puede esperar que los métodos discutidos en la cita no devuelvan cadenas nuevas, lo que llevaría a resultados inesperados.
@ user1238193
Teniendo en cuenta su siguiente pregunta: "¿Test t2 = t1; hace que tanto t2 como t1 apunten al mismo objeto o que cada uno tenga sus propios objetos? ¿Se aplica esta situación a todos los objetos en Java?"
t1 y t2 apuntarán al mismo objeto. Esto es cierto para cualquier objeto java (objetos inmutables incluidos)