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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  [Solucionado]Paso de parámetros por referencia
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Solucionado]Paso de parámetros por referencia  (Leído 5,392 veces)
PabloPbl

Desconectado Desconectado

Mensajes: 188


Ver Perfil
[Solucionado]Paso de parámetros por referencia
« en: 21 Octubre 2015, 06:07 am »

Estoy muy enredado con esto del paso de parámetros en Java, si es por valor o por referencia  :-\

Estuve leyendo un par de artículos por internet y según dicen que los pasos por parámetros en Java, son por valor y no por referencia.

Pero lo que no me entra en la cabeza, es cuando le paso un objeto como parámetro a un método, este supuestamente si fuera por valor, el método debería tomar una copia del objeto, pero no al contrario, el método efectúa los cambios en el objeto original que le pase  :-\ , Varios artículos que he leído afirman que Java es 100% paso de parámetros por valor, pero cuando se trata de pasar objetos por parámetros, los métodos hacen los cambios en el objeto original que le pase, es decir que no hacen una copia de dicho objeto, al contrario con los datos primitivos(int, long, short, String) que si lo hace.

¿Entonces Java es por valor y por referencia?  :-\
Java es raro :¬¬ es compilado e interpretado también  :-[ jaja pero eso no viene al caso.

¿Alguien sabe por que sucede esto, o que entendí mal?  :-\

Muchas gracias desde ya.


« Última modificación: 25 Octubre 2015, 04:35 am por PabloPbl » En línea

kondrag_X1

Desconectado Desconectado

Mensajes: 157


Ver Perfil
Re: [Duda]Paso de parámetros por referencia
« Respuesta #1 en: 21 Octubre 2015, 15:45 pm »

JAJAJAJA ami me paso lo mismo hace tiempo en al universidad me enseñaron que en java se pasaba por valor y punto.

pero más tarde trabajando de freelance me di cuenta que con los objetos no pasaba y buscando buscando llegué a la misma conclusión.

En java se pasan por valor los tipos básicos como int,byte,short,long etc... pero los objetos si se pasan por referencia.

échale un ojo.
https://cafelojano.wordpress.com/2007/06/27/en-java-el-paso-de-parametros-es-por-valor/


En línea

DarK_FirefoX


Desconectado Desconectado

Mensajes: 1.263


Be the change you wanna see in te world


Ver Perfil
Re: [Duda]Paso de parámetros por referencia
« Respuesta #2 en: 21 Octubre 2015, 19:53 pm »

En java se pasa todo por valor, lo que hay que entender es que pasa los objetos por referencia, y esas referencias se pasan por valor.

Lee esto: http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value

Salu2s
En línea

PabloPbl

Desconectado Desconectado

Mensajes: 188


Ver Perfil
Re: [Duda]Paso de parámetros por referencia
« Respuesta #3 en: 21 Octubre 2015, 20:49 pm »

Muchas gracias por sus respuestas  ;-)

He leído ambos artículos, y también he llegado a la misma conclusión que kondrag_X1  :-\
No hay caso de que entienda esto:

Citar
En java se pasa todo por valor, lo que hay que entender es que pasa los objetos por referencia, y esas referencias se pasan por valor.

He leído el articulo, el que me paso DarK_FirefoX, pero no logre entenderlo  :huh:

Entonces esto seria lo mismo que por referencia?  :-\

He hecho mas pruebas para indagar un poco mas y esto es lo que paso:

Tengo 3 clases:

Clase con el main
Código
  1. public class PruebaParametros {
  2.  
  3.    public static void main(String[] args) {
  4.        Perro perro = new Perro("Boby");
  5.        System.out.println(perro.nombre);
  6.  
  7.        EditorPerro editorPerro = new EditorPerro(perro);
  8.        System.out.println(perro.nombre);
  9.    }
  10. }
  11.  
  12.  

Clase perro
Código
  1. public class Perro {
  2.  
  3.    String nombre;
  4.  
  5.    public Perro(String nombre) {
  6.        this.nombre = nombre;
  7.    }
  8. }
  9.  
  10.  

Clase que modifica los atributos del perro, en este caso solo el nombre (EditorPerro)
Código
  1. public class EditorPerro {
  2.    private Perro perro;
  3.  
  4.    public EditorPerro(Perro perro) {
  5.        this.perro = perro;
  6.        this.perro.nombre = "Nombre cambiado";
  7.    }
  8. }
  9.  


En el main instancio un objeto de la clase perro y le paso por parámetro el nombre del perro, y luego imprimo el valor de la variable "nombre" del objeto perro para corroborar el cambio. Hasta ahí todo perfecto.

Ahora instancio un objeto de la clase EditorPerro y le paso como parámetro la instancia del objeto perro anteriormente creado, y lo que hace este método de la clase EditorPerro, es:
Hace que la variable "perro" de clase tome el valor de lo que le pase por parámetro, y aquí viene la parte extraña  :-\ , lo que hago es modificar el valor de la variable "nombre" PERO de la clase, la que esta como privada, y lo que hago es cambiar el nombre a "Nombre cambiado", como se puede ver en el código.

Ahora vuelvo al main, e imprimo nuevamente la variable nombre, del objeto Perro, y adivinen que?  :-\ :-\ :-\
Tomo el valor "nombre cambiado"   :P

Osea que cuando el método modifico el objeto de la clase, me modifico también el original y eso que era otro objeto, y que si fuera paso de parámetros por valor, no debería hacer eso.

Debería resignarme a pensar de esta manera? tendré problemas en un futuro si sigo pensando así?  :-\
En línea

PabloPbl

Desconectado Desconectado

Mensajes: 188


Ver Perfil
Re: [Duda]Paso de parámetros por referencia
« Respuesta #4 en: 25 Octubre 2015, 04:34 am »

Después de investigar bastante, he logrado entender por fin el paso de parámetros en Java  ;-)
Bueno al menos eso creo yo  :P

Intentare explicar lo que entendí:

En muchos artículos leía esto:

En java se pasa todo por valor, lo que hay que entender es que pasa los objetos por referencia, y esas referencias se pasan por valor.

Pero nunca lograba entenderlo del todo. Hasta ahora:

Esta frase significa que los objetos que se pasan por parámetros se pasan por referencia, pero por un valor, y no el objeto en tal como se haría en C/C++. Ese valor es como una especie de apuntador a la memoria en donde se encuentra dicho objeto.

Muestro un ejemplo:

Cuando nosotros creamos un objeto en Java:

Código
  1. Perro perro1 = new Perro("Bobby");

Estamos reservando espacio en memoria para un nuevo objeto, y lo que hacemos es apuntar con la variable perro1 a ese objeto que acabamos de crear.
Podemos tener mas de 1 variable apuntando a un mismo objeto, por ejemplo:

Código
  1. Perro perro1 = new Perro("Bobby");
  2. Perro perro2 = perro1;
  3.  

Como ven las variables perro1, y perro2 están apuntando al mismo objeto. Ahora bien, que pasaría si hago lo siguiente:

Código
  1. Perro perro1 = new Perro("Bobby");
  2. Perro perro2 = perro1;
  3.  
  4. perro1 = new Perro("Lobito");
  5.  

¿Que pasaría con la variable perro2? Pues nada, la variable perro2, seguiría estando igual, seguiría apuntando al mismo objeto de siempre, lo único que paso fue que la variable perro1 esta apuntando a otro objeto nuevo, eso es lo único que paso.

Ahora otro ejemplo pero con métodos, que es lo que me confundía, pero teniendo claro la información anterior, logre entender esto de los pasos por parámetros ;D  :

Tenemos una clase común y corriente, con sus respectivos get y set:

Código
  1. public class Perro {
  2.     private name;
  3.  
  4.     public Perro(String name) {
  5.          this.name = name;
  6.     }
  7.  
  8.     public void setName(String name) {
  9.          this.name = name;
  10.     }
  11.  
  12.     public String getName() {
  13.          return this.name;
  14.     }
  15. }

Y tenemos la clase Main:

Código
  1. public class Main {
  2.  
  3.     pubic Main() {
  4.          Perro perro1 = new Perro("Bobby");
  5.          modificar(perro);
  6.     }    
  7.  
  8.     public void modificar(Perro perro) {
  9.          Perro perro2 = new Perro();
  10.          perro = perro2;
  11.     }
  12.  
  13.     public static void main(String[] args) {
  14.          new Main();
  15.     }
  16. }


Bien, en el constructor de la clase Main, creamos un objeto y la variable que lo esta apuntando es perro1.
Después llamamos al método modificar y le pasamos como parámetro el objeto perro1, PERO... en realidad no le estamos pasando el objeto, si no que le estamos pasando la referencia como un valor a ese objeto, por lo que en el método modificar, la variable perro también esta apuntando al mismo objeto.
Dentro del método modificar creamos otro objeto perro y la variable que lo esta apuntando es perro2, ahora prestemos atención en esta parte:

Cuando hacemos lo siguiente, ¿que creen que pasara?:
Código
  1. perro = perro2;

Lo que pasara es que la variable perro solo apuntara a lo mismo que esta apuntando perro2. En ningún momento estaríamos modificando la variable perro1 que anteriormente creamos. :laugh:

ADVERTENCIA: No estoy 100% seguro de que esta idea sea 100% certera, por favor corrijanme si me equivoco.
Agradecería si me dijeran si mi idea es correcta, así me quito una carga muy pesada de encima  :-\

Un articulo que me ayudo a entender esto: http://www.iteramos.com/pregunta/1043/java-es-por-referencia-o-paso-por-valor

Espero que sirva de ayuda, un saludo  ;)
« Última modificación: 25 Octubre 2015, 04:38 am por PabloPbl » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines