Cita:
Iniciado por nomemolestes 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 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 originalpublic class ValorOReferencia {
private int primitivo;
public ValorOReferencia
(String valor,
int primitivo
) { this.valor = valor;
this.primitivo = primitivo;
}
public void setPrimitivo(int primitivo) {
this.primitivo = primitivo;
}
public void setValor
(String valor
) { this.valor = valor;
}
@Override
return "ValorOReferencia{" + "valor=" + valor + ", primitivo=" + primitivo + '}';
}
public static void main
(String[] args
) { ValorOReferencia obj = new ValorOReferencia("xxx", 777);
ValorOReferencia referenceToObj;
referenceToObj = obj;
referenceToObj.setPrimitivo(888);
System.
out.
println("orig:"+obj.
toString()); System.
out.
println("copy:"+referenceToObj.
toString()); ValorOReferencia obj2 = duplicarContenido(obj);
System.
out.
println("orig:"+obj.
toString()); System.
out.
println("copy:"+referenceToObj.
toString()); System.
out.
println("new :"+obj2.
toString()); }
private static ValorOReferencia duplicarContenido(ValorOReferencia referencia) {
referencia.setValor("xxxxxx");
referencia.setPrimitivo(1);
//la siguiente linea PIERDE efecto sobre el objecto CUANDO FINALIZA el método
referencia = new ValorOReferencia("NEW?", 1234);
System.
out.
println("valorTemporal: "+referencia.
toString());
return referencia;
}
}