Foros del Web » Programación para mayores de 30 ;) » Java »

Pasar Objeto Como Valor...

Estas en el tema de Pasar Objeto Como Valor... en el foro de Java en Foros del Web. Hola a todos...! Ojalá no les parezca muy tonta mi pregunta... yo en verdad soy mas C que Java... pero ahora stoy haciendo un programilla ...
  #1 (permalink)  
Antiguo 15/07/2007, 12:07
Avatar de Zeromus  
Fecha de Ingreso: junio-2007
Mensajes: 3
Antigüedad: 17 años, 5 meses
Puntos: 0
Pregunta Pasar Objeto Como Valor...

Hola a todos...!

Ojalá no les parezca muy tonta mi pregunta... yo en verdad soy mas C que Java... pero ahora stoy haciendo un programilla en Java, y tengo unos probemas con la clase Object.
A ver si alguien me puede guiar un poco...

Ocurre lo siguiente:

Tengo 3 clases... la primera contiene el programa principal... la segunda un objeto para manejar con ese programa, y la tercera un objeto que necesita manejar la segunda solamente.
En la segunda clase creo una instancia de un objeto de la tercera, y en un método de la segunda creo datos, y los paso como Object a un método de la tercera clase, para modificar la instancia creada... hasta ahí va todo bien. Pero luego, cuando desde otro método de la primera o la segunda clase intento acceder a los datos de esa instancia, están todos a null.
Averiguando y haciendo testeos de estas clases, tengo entendido que al pasar como Object los datos en la segunda clase, estos se pasan sólo como referencia, entonces se me hace que cuando el método que guarda los datos se termina, es cuando se pierden estos valores.
La idea no es cambiar el código de la tercera clase al tipo de dato ke trabaja la segunda, porke tngo intenciones de ke la tercera clase sea genérica y la pueda usar luego en otras cosas, por eso decidí trabajar con Object.
Mi pregunta es entonces, cómo puedo pasar los datos de tipo Object como valor y no como referencia?... ke no sea con clone(); ...porke no kiero meterle más código... y clone igual es su pega...

Alguien me recomienda algo?.... o estoy entendiendo mal algún concepto de orientación a objetos?...


Saludos!


Y desde ya... muchas gracias...


PD: No adjunto el código porke en realidad son bastantes líneas y no los kiero estresar!
  #2 (permalink)  
Antiguo 16/07/2007, 07:42
 
Fecha de Ingreso: julio-2007
Mensajes: 30
Antigüedad: 17 años, 4 meses
Puntos: 1
Re: Pasar Objeto Como Valor...

Pon el código


Saludos
  #3 (permalink)  
Antiguo 16/07/2007, 11:00
Avatar de stock  
Fecha de Ingreso: junio-2004
Ubicación: Monterrey NL
Mensajes: 2.390
Antigüedad: 20 años, 4 meses
Puntos: 53
Re: Pasar Objeto Como Valor...

la definicion de pasar un parametro por valor, es que se realiza una copia del valor que se esta pasando, en java, todos los objtos son pasados por referencia, por lo tanto, si quieres pasarle un objeto por valor, forzosamente tienes que hacer un obj.clone()

have funnnnnnn
  #4 (permalink)  
Antiguo 17/07/2007, 01:37
 
Fecha de Ingreso: julio-2007
Mensajes: 30
Antigüedad: 17 años, 4 meses
Puntos: 1
Re: Pasar Objeto Como Valor...

Cita:
Iniciado por stock Ver Mensaje
en java, todos los objtos son pasados por referencia, por lo tanto, si quieres pasarle un objeto por valor, forzosamente tienes que hacer un obj.clone()

have funnnnnnn
Todo lo contrario. En java todos los objetos se pasan por valor. Una cosa es que los objetos se pasen por valor y otra que se puedan modificar las propiedades del objeto cuando se pasa como arguemento a algún método. Lo que no puede modificarse es la referencia de ese objeto. No se puede hacer que apunte a un nuevo objeto dentro del método, pq al terminar el método volveria a apuntar al mismo objeto.

Es algo que la gran mayoria de la gente confunde, y no se por qué.

Si lo que se quiere es no poder cambiar las propiedades del objeto que se usa para llamar al método, entonces si, se debe utilizar el método clone.

Saludos
  #5 (permalink)  
Antiguo 30/12/2011, 00:42
 
Fecha de Ingreso: diciembre-2011
Mensajes: 1
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Pasar Objeto Como Valor...

Gracias por el aporte!


Uno empezando...
  #6 (permalink)  
Antiguo 30/12/2011, 02:29
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Pasar Objeto Como Valor...

Y según qué objeto, el clone() por defecto no te vale, tienes que implementarlo tú mismo.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #7 (permalink)  
Antiguo 30/12/2011, 05:15
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 6 meses
Puntos: 344
Respuesta: Pasar Objeto Como Valor...

Realmente se pasa la referencia al objeto por valor, no el objeto en sí, por eso es que se pueden modificar los atributos del objeto y estos se conservarán al salir del método y, por eso, no se puede modificar la referencia dentro de un método.

En términos prácticos es como si se pasase el objeto por referencia y todo lo que habéis dicho es válido.
  #8 (permalink)  
Antiguo 30/12/2011, 11:39
Avatar de FiruzzZ  
Fecha de Ingreso: diciembre-2007
Ubicación: en casa
Mensajes: 470
Antigüedad: 16 años, 11 meses
Puntos: 41
Respuesta: Re: Pasar Objeto Como Valor...

Cita:
Iniciado por nomemolestes Ver Mensaje
En java todos los objetos se pasan por valor
Equivocado, es por referencia (todo lo demás que escribiste está bien). Esto es muy fácil de demostrar, es cuestión de escribir 20 lineas de código.

Cita:
Iniciado por nomemolestes Ver Mensaje
Si lo que se quiere es no poder cambiar las propiedades del objeto que se usa para llamar al método, entonces si, se debe utilizar el método clone.
Para esto existe la palabra final, no todos los objetos soporta clone(), y no todos tiene el efecto esperado.




Por si queda alguna duda y "no tiene tiempo de escribir 20 lineas", acá está la prueba definitiva.




Código Java:
Ver original
  1. public class ValorOReferencia {
  2.  
  3.     private String valor;
  4.     private int primitivo;
  5.  
  6.     public ValorOReferencia(String valor, int primitivo) {
  7.         this.valor = valor;
  8.         this.primitivo = primitivo;
  9.     }
  10.  
  11.     public void setPrimitivo(int primitivo) {
  12.         this.primitivo = primitivo;
  13.     }
  14.  
  15.     public void setValor(String valor) {
  16.         this.valor = valor;
  17.     }
  18.  
  19.     @Override
  20.     public String toString() {
  21.         return "ValorOReferencia{" + "valor=" + valor + ", primitivo=" + primitivo + '}';
  22.     }
  23.  
  24.     public static void main(String[] args) {
  25.         ValorOReferencia obj = new ValorOReferencia("xxx", 777);
  26.                 ValorOReferencia referenceToObj;
  27.         referenceToObj = obj;
  28.         referenceToObj.setPrimitivo(888);
  29.         System.out.println("orig:"+obj.toString());
  30.         System.out.println("copy:"+referenceToObj.toString());
  31.         ValorOReferencia obj2 = duplicarContenido(obj);
  32.         System.out.println("orig:"+obj.toString());
  33.         System.out.println("copy:"+referenceToObj.toString());
  34.         System.out.println("new :"+obj2.toString());        
  35.     }
  36.  
  37.     private static ValorOReferencia duplicarContenido(ValorOReferencia referencia) {
  38.          
  39.         referencia.setValor("xxxxxx");
  40.         referencia.setPrimitivo(1);
  41.          //la siguiente linea PIERDE efecto sobre el objecto CUANDO FINALIZA el método
  42.          referencia = new ValorOReferencia("NEW?", 1234);
  43. System.out.println("valorTemporal: "+referencia.toString());
  44.  
  45.           return referencia;
  46.     }
  47. }
__________________
BadProgrammerException!

Última edición por FiruzzZ; 30/12/2011 a las 11:52
  #9 (permalink)  
Antiguo 30/12/2011, 18:47
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: Pasar Objeto Como Valor...

Hola,

Agregando mas información aunque el tema originalmente es del año 2007. Los parámetros que se pasan a los métodos se pasan por valor en todos los casos; aunque es muy complicado explicarlo, así que me tome la libertad de realizar un gráfico que expone el tema un poco mas claro.

http://img717.imageshack.us/img717/4426/valref.jpg

Cualquier duda y si me equivoque en algo no duden en comentarlo,

Saludos,
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:46.