Comportamiento de objetos de clases tipo envoltorio

Saludos estimados,
Quisiera su apoyo ante una duda que se me ha presentado, estoy iniciando en el mundo de la OOP así como en Java.
Entiendo que al crear un objeto lo que se crea en realidad es una referencia (posición de memoria) del objeto en si, y que este es accedido a través de dicha referencia, por lo que al realizar una asignación de un objeto a otro, lo que se pasa es el valor de la referencia a la nueva referencia. Ok eso está claro; mi consulta es si este comportamiento es igual para todo tipo de clases? Pregunto esto porque cuando creo un objeto de cualquier clase de tipo envoltorio, este no se comporta de tal manera, sino como un valor de tipo primitivo, osea que el valor se guarda directamente en la posición de memoria y no en una referencia, por lo que cada referencia sigue siendo independiente.

Pongo un ejemplo para ser mas claro.

public class Prueba {
public static void main(String args[])
{
String otx1, otx2;
otx1 = new String("Cadena");
otx2 = otx1;
otx1 = "Otra Cadena";
System.out.println(otx2);
}
}

Resultado: Cadena

Creo dos referencias (otx1 y otx2) de tipo String
Asigno a otx1 el objeto "cadena"
Asigno una referencia a otra ( otx2 = otx1 )
Altero el objeto ( otx1 = "Otra Cadena" )

Y esperaba que al imprimir otx2 me imprimiera el valor de otx1, porque entiendo que ambos apuntan a la misma referencia.

Muy agradecidos.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de naiky

Uy no me decepcionen... nadie

Uy no me decepcionen... nadie tiene la respuesta ante esta duda.

Imagen de paranoid_android

Salvo lo que opinen los Gurus Javeros

Hola el tema de Strings en java es punto y aparte.

Salvo que me corrijan los gurus javeros:

Pensando como programador en C/C++
Cuando haces
otx2 = otx1;
mueves el apuntador a la posicion donde comienza "Cadena"

 
otx1 cambia de posición a donde comienza "Otra Cadena", pero en ningun momento has actualizado la posición de otx2 que continua apuntando a la posición de "Cadena".
En Java cambia la manera que lo hace y clases entre las versiones de JVM.

Imagen de ingscjoshua

mal uso

Estas usando mal la clase String eso no se ace de esa froma lo que tu esta haceindo es paso por valor y no por referencia por eso no te da lo que buscas ademas de hacerlo de la forma incorrecta revisa el API de java

Imagen de Cid

Creacion de objetos String

Hola que tal bueno por lo que he visto en tu planteamiento del problema tu imaginas que la asignación que estas haciendo es por referencia como comenta ingscjoshua, pero no lo es, y el motivo es porque Java te permite crear objetos de tipo String de dos formas:

 

de igual forma lo puedes crear asi:

 

Ambas formas de crear un objeto son validas y en ambas tienes una referencia que apunta al objeto en cuestión, tal vez por eso te confundes y piensas que al no utilizar el operador new no estas creando un objeto si no cambiandole el valor y esto no es así.

Por último las clases envoltorio, operan de forma parecida en algo que se le llama boxing y autoboxing

1.- boxing

 

2.- autoboxing

 

En ambos casos estas creando un objeto de tipo Integer aun cuando no utilices el operador new lo haces (al igual que en la clase String), con ello espero haber resuelto tu duda y no confundirte más.

Imagen de ingscjoshua

lo que preguntas lo explican aca

Imagen de ingscjoshua

y aqui

Imagen de beto.bateria

Voy a asignar los valores de

Voy a asignar los valores de memoria (imaginarios) de las variables que usas, esperemos que asi te puedas dar una idea:

Antes que nada:
"Cadena" = 305 (valor imaginario en memoria)
"Otra Cadena" = 400 (valor imaginario en memoria)

 

Como el valor de otx2 nunca lo cambias, entonces sigue direccionado a "Cadena".

Imagen de paranoid_android

Ejemplo usando hashCode

Algo "similar" a la posición de memoria es el hashCode.
Tomando el ejemplo del Sr negativo.

 

Objetos anonimos
 
Si quieres saber mas tambien te recomidendo que veas optimización de Strings

Imagen de naiky

CONCEPTO DE INMUTABILIDAD

Gracias a todos por sus comentarios y tiempo valioso utilizado para resolver esta duda que la verdad no me permitía continuar, y creo que debía de tenerla clara para ir entendiendo mejor todo la estructura principal de Java que es la Programación Orientada a Objetos. Gracias a sus ejemplos y comentarios me hicieron indagar mas en la web y encontrar mucho material sobre este tema, lo cual quiero compartir con ustedes
Estamos en contacto.

CONCEPTO DE INMUTABILIDAD

Veamos el significado de inmutable, que no es precisamente sencillo de explicar. Consideremos que un objeto ocupa un espacio de memoria. Ahora diremos que hay dos tipos de objetos:

a) Objetos mutables: son aquellos cuyo espacio de memoria puede ser reemplazado por un contenido definido con posterioridad a la creación del objeto. En este caso, cuando usamos métodos modificadores es el objeto original el que sufre el cambio.

b) Objetos inmutables: son aquellos cuyo espacio de memoria permanece ocupado con el objeto tal y como se creó inicialmente. ¿Significa esto que no podemos usar métodos modificadores? No, no significa eso. Significa que cuando usamos métodos modificadores en vez de redefinirse el objeto original, la variable apuntadora pasa a apuntar a un nuevo objeto que se crea, permaneciendo el original en su espacio de memoria, podemos decir que en algunos casos “inaccesible”, pero estando.

En Java, la mayoría de los objetos "esenciales" son inmutables: Long, Integer, Boolean, String, , etc. Un objeto se considera inmutable si su estado no puede cambiarse luego de ser construido. Este comportamiento está ampliamente aceptado como una estrategia robusta para crear código simple y confiable. La inmutabilidad se considera efectiva en aplicaciones concurrentes (hablamos de concurrencia para referirnos a dos tareas que transcurren durante el mismo intervalo de tiempo) donde la mutabilidad (cambiar los objetos su estado), podría dar lugar a que los objetos se corrompieran o llegaran a tener un estado inconsistente.

Nosotros en principio no debemos preocuparnos por el costo de crear nuevos objetos frente a actualizar el mismo objeto. En general usar objetos inmutables es eficiente y solo en casos muy específicos tendríamos que preocuparnos por soluciones que ahorraran la multiplicación de objetos.

Aunque no “nos preocupemos” por ella, sí es deseable que tengamos el concepto de inmutabilidad claro.

Imagen de naiky

Gracias!!!

Muchas gracias paranoid_android.

Imagen de paranoid_android

Que te aproveche

De nada. :D