elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Duda en paso de valores por referencia de Java
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda en paso de valores por referencia de Java  (Leído 2,727 veces)
arts

Desconectado Desconectado

Mensajes: 103


Ver Perfil
Duda en paso de valores por referencia de Java
« en: 22 Octubre 2013, 17:43 pm »

Muy buenas tengo una duda un poco rara en el paso de valores por referencia, por ejemplo en el siguiente ejemplo:
Button A = new Button();
Button B = new Button();
Button C = B

Hasta aquí tengo 3 espacios de memoria verdad ? A, B y C solo que A apunto a un sitio, B a otro y C apunta al de B verdad?.
Ahora viene mi duda.
¿ Si ahora digo que B = A ?
Estaría haciendo paso por paso que A apunte a su sitio de siempre, B que tenía su espacio de memoria ahora apunte a A, pero en C que está mi duda apuntaba a B, pero al haber cambiado el apuntador de B se supone que ahora esta apunta a A, es decir todos apuntan a A ?. O por el contrario es más simple y seguiría C apuntando a B.


En línea

visualfree

Desconectado Desconectado

Mensajes: 201


Ver Perfil
Re: Duda en paso de valores por referencia de Java
« Respuesta #1 en: 22 Octubre 2013, 17:57 pm »

¿ Si ahora digo que B = A ?
Estaría haciendo paso por paso que A apunte a su sitio de siempre, B que tenía su espacio de memoria ahora apunte a A, pero en C que está mi duda apuntaba a B, pero al haber cambiado el apuntador de B se supone que ahora esta apunta a A, es decir todos apuntan a A ?. O por el contrario es más simple y seguiría C apuntando a B.
A=L ==A Apunta L
B=A ==B Apunta A
C=B ==C C apunta B


Saludos


En línea

arts

Desconectado Desconectado

Mensajes: 103


Ver Perfil
Re: Duda en paso de valores por referencia de Java
« Respuesta #2 en: 22 Octubre 2013, 18:16 pm »

Ok, es mas fácil que los puntero de c++. No se quedan direcciones de memoria guardadas. Al final A apuntab al sitio de siempre, B apunta a A y C a B.
Ok gracias !!  ;D
En línea

arts

Desconectado Desconectado

Mensajes: 103


Ver Perfil
Re: Duda en paso de valores por referencia de Java
« Respuesta #3 en: 23 Octubre 2013, 00:48 am »

Mmm... he realizado una prueba y me ha dado resultados diferentes a los que se indican :/. Al parecer funciona según donde estén apuntando la última vez las instancias.
Dejo el ejemplo que he realizado por curiosidad y ha resultado ser diferente del esperado. Ya he entendido como funciona y no se si es que realmente no he entendido tu explicación o te has equivocado.

Código
  1. package PrimeraClase;
  2. public class Constructores {
  3. boolean valiente = false;
  4. int edad;
  5. String colorPelo;
  6. double altura;
  7.  
  8. public Constructores(boolean valiente, int edad, String colorPelo, double altura ){
  9. this.valiente = valiente;
  10. this.edad = edad;
  11. this.colorPelo = colorPelo;
  12. this.altura = altura;
  13. }
  14.  
  15. public Constructores(){
  16. this.valiente = false;
  17. this.edad = 0;
  18. this.colorPelo = null;
  19. this.altura = 0;
  20. }
  21.  
  22. public static void main (String[] arg)
  23. {
  24. /*
  25. new Persona().getNombre(); y
  26. Persona p = new Persona();
  27. p.getNombre();
  28. Es que en el primero creas una referencia temporal para el objeto que esta creando new e invocas el metodo
  29. y la variable es destruida temporal es destruida despues de esa linea mientras que en la segunda se genera
  30. el objeto en el heap y se guarda esa direccion para que pueda ser usada posteriormente.
  31. la variable p existira hasta que se salga del metodo donde se declaro o del bloque ({..}) donde se creo.
  32. */
  33. // System.out.println(new Constructores().colorPelo = "marron");
  34. Constructores pj = new Constructores(true, 30, "moreno", 1.9f);
  35. Constructores pj1 = new Constructores(false,15,"rubio",1.4f);
  36. Constructores pj2;
  37.  
  38.  
  39. System.out.println("Datos de PJ");
  40. System.out.println("El pj es valiente: "+pj.valiente);
  41. System.out.println("El pj tiene: "+pj.edad+" años");
  42. System.out.println("El pj es: "+pj.colorPelo);
  43. System.out.println("El pj mide: "+pj.altura+" cm");
  44. System.out.println("******************************************************************");
  45. System.out.println("Datos de PJ1");
  46. System.out.println("El pj1 es valiente: "+ pj1.valiente);
  47. System.out.println("El pj1 tiene: "+pj1.edad+" años");
  48. System.out.println("El pj1 es: "+pj1.colorPelo);
  49. System.out.println("El pj1 mide: "+pj1.altura+" cm");
  50. System.out.println("******************************************************************");
  51. System.out.println("******************************************************************");
  52. System.out.println("Ahora en pj1 apunta a pj por lo que debería salir lo mismo que pj");
  53. pj1 = pj;
  54. System.out.println("El pj1 es valiente: "+ pj1.valiente);
  55. System.out.println("El pj1 tiene: "+pj1.edad+" años");
  56. System.out.println("El pj1 es: "+pj1.colorPelo);
  57. System.out.println("El pj1 mide: "+pj1.altura+" cm");
  58. System.out.println("******************************************************************");
  59. System.out.println("******************************************************************");
  60. pj2 = pj1;
  61. System.out.println("Ahora pj2 apunta a pj1 que a su vez pj1 ya estaba apuntando a pj por lo que debería salir lo mismo que pj");
  62. System.out.println("El pj2 es valiente: "+ pj2.valiente);
  63. System.out.println("El pj2 tiene: "+pj2.edad+" años");
  64. System.out.println("El pj2 es: "+pj2.colorPelo);
  65. System.out.println("El pj2 mide: "+pj2.altura+" cm");
  66. }
  67. }

Código:
RESULTADOS
Datos de PJ
El pj es valiente: true
El pj tiene: 30 años
El pj es: moreno
El pj mide: 1.899999976158142 cm
******************************************************************
Datos de PJ1
El pj1 es valiente: false
El pj1 tiene: 15 años
El pj1 es: rubio
El pj1 mide: 1.399999976158142 cm
******************************************************************
******************************************************************
Ahora en pj1 apunta a pj por lo que debería salir lo mismo que pj
El pj1 es valiente: true
El pj1 tiene: 30 años
El pj1 es: moreno
El pj1 mide: 1.899999976158142 cm
******************************************************************
******************************************************************
Ahora pj2 apunta a pj1 que a su vez pj1 ya estaba apuntando a pj por lo que debería salir lo mismo que pj
El pj2 es valiente: true
El pj2 tiene: 30 años
El pj2 es: moreno
El pj2 mide: 1.899999976158142 cm
En línea

ThinkByYourself

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Duda en paso de valores por referencia de Java
« Respuesta #4 en: 23 Octubre 2013, 15:12 pm »

En Java no existen los punteros (no de manera explícita, claro). Para saber más, tendrás que averiguar más sobre el garbage collector de Java.
Si buscas encuentras!! Hasta otra!
http://www.youtube.com/watch?v=wATBX_tNyUw
Byeeeee
En línea

No te voy a engañar.
Todos hemos sido programados para normalizar la psicopatía de las élites económicas y políticas, y para realimentar su patrón de ciega codicia.
~ Yoya ~
Wiki

Desconectado Desconectado

Mensajes: 1.125



Ver Perfil
Re: Duda en paso de valores por referencia de Java
« Respuesta #5 en: 25 Octubre 2013, 23:59 pm »

Muy buenas tengo una duda un poco rara en el paso de valores por referencia, por ejemplo en el siguiente ejemplo:
Button A = new Button();
Button B = new Button();
Button C = B

Hasta aquí tengo 3 espacios de memoria verdad ? A, B y C solo que A apunto a un sitio, B a otro y C apunta al de B verdad?.
Ahora viene mi duda.
¿ Si ahora digo que B = A ?
Estaría haciendo paso por paso que A apunte a su sitio de siempre, B que tenía su espacio de memoria ahora apunte a A, pero en C que está mi duda apuntaba a B, pero al haber cambiado el apuntador de B se supone que ahora esta apunta a A, es decir todos apuntan a A ?. O por el contrario es más simple y seguiría C apuntando a B.

En memoria de la maquina virtual de java existen dos espacio, Heap y Stack.
  • En la memoria stack se almacenan las variables declaradas dentro de metodos, y se borrar automaticamente cuando el metodo finaliza su ejecuion.
  • En la memoria Heap, se almacena los objetos creados.

Por lo tanto esto:
Código
  1. Button A = new Button();
Significa 3 cosas:
  • Se crea una variable del Tipo Button en la memoria (stack si fue declarada dentro de un método, si fue declarada fuera de un metodo se crea en la memoria heap)
  • Se crea un objeto Button en la memoria Heap
  • Se le asigna la dirección donde se encuentra Button a la variable A

Eso significa que cuando le re-asignas un valor a una variable, esta cambia nomas la dirección donde se encuentra el nuevo objeto, y el objeto de antes se queda en la memoria heap. Si habia otro objeto apuntando al mismo objeto, este sigue apuntando al mismo objeto...

Si hay un punto en que el objeto no es utilizado por ninguna variable, entonce el objeto es elegible por el Garbage Collector para ser eliminado, pero este elige en que momento podrá ser eliminado o si llegara a eliminarlo.

Saludos.


En línea

Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
paso por referencia de un integer
Java
kasiko 9 14,873 Último mensaje 24 Enero 2011, 06:26 am
por ChavalChavito
[DUDA] paso por valor o por referencia (byval/ byref)
Programación Visual Basic
AlxSpy 8 4,433 Último mensaje 12 Julio 2011, 15:45 pm
por AlxSpy
Paso por referencia
Java
mapers 8 5,096 Último mensaje 27 Julio 2011, 12:27 pm
por [Case]
Tipos de paso por referencia y paso por referencia de tipo apuntador
Programación C/C++
CATBro 3 3,126 Último mensaje 8 Abril 2012, 08:23 am
por Beakman
[Solucionado]Paso de parámetros por referencia
Java
PabloPbl 4 5,008 Último mensaje 25 Octubre 2015, 04:34 am
por PabloPbl
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines