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.
- Inicie sesión o regístrese para enviar comentarios
Uy no me decepcionen... nadie
Uy no me decepcionen... nadie tiene la respuesta ante esta duda.
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 = "Otra Cadena";
// Equivale a
otx1 = new String("Otra 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.
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
Creacion de objetos String
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.
lo que preguntas lo explican aca
http://cafelojano.wordpress.com/2007/06/27/en-java-el-paso-de-parametros...
y aqui
http://www.javamexico.org/blogs/windoctor/paso_de_parametros_en_java
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)
//otx1 = null, otx2 = null;
otx1 = new String("Cadena");
//otx1=305
otx2 = otx1;
//otx2 = 305
otx1 = "Otra Cadena";
//otx1=400
System.out.println(otx2);
//otx2=305
Como el valor de otx2 nunca lo cambias, entonces sigue direccionado a "Cadena".
Ejemplo usando hashCode
Algo "similar" a la posición de memoria es el hashCode.
Tomando el ejemplo del Sr negativo.
public static void main(String args[]){
String otx1, otx2;
//otx1 = null, otx2 = null;
otx1 = new String("Cadena");
//otx1=hashCode
System.out.println("otx1=" + otx1 + " (hashCode) "+ otx1.hashCode());
otx2 = otx1;
//otx2 = hashCode
System.out.println("otx2=" + otx2 + " (hashCode) "+ otx2.hashCode());
otx1 = "Otra Cadena";
//otx1=hashCode
System.out.println("otx1=" + otx1 + " (hashCode) "+ otx1.hashCode());
//otx2=305
System.out.println("otx2=" + otx2 + " (hashCode) "+ otx2.hashCode());
}
}
Objetos anonimos
System.out.println(" Esto ");
// equivale a
System.out.println(new String(" Esto "));
// Concatenando
// esto
System.out.println("A" + " " + "B");
// equivale a
System.out.println(new String("A") + new String(" ") + new String("B"));
Si quieres saber mas tambien te recomidendo que veas optimización de Strings
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.
http://www.aprenderaprogramar.com/index.php?option=com_content&view=arti...
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.
http://www.javamexico.org/blogs/043h68/cosas_del_core_de_java_que_debes_...
Gracias!!!
Muchas gracias paranoid_android.
Que te aproveche
De nada. :D