Vous êtes sur la page 1sur 12

Llamado de valores por

referencia y por valor.


Prof. Bengi Obando Umaa.
Por valor o por referencia?
Esta es una pregunta existencial para todo
programador Java. Cada uno encuentra
una respuesta satisfactoria.
Variables por valor
Entendemos como asignacin de
variables por valor cuando se
haceuna copia del valorde una
variable a otra.
Esto lo vemos as:
public static void main(String[] args) {
int a = 10; //es una variable
int b = 20; //es otra variable
int c = a; //la variable "c" tiene la copia del valor de "a"
a = 30; //"a" tiene otro valor
System.out.format("a=%d, b=%d, c=%d", a, b, c); //imprime a=30,
b=20, c=10
}
Esta asignacin tambin aplica para los parmetros de
publicclassPruebaParametrosValorApp{ funciones.

publicstaticvoidmain(String[]args){
inta=10, b=20, c=30;//declaro y asigno valores
System.out.println("Valores antes de cambiar");
System.out.format("a=%d, b=%d, c=%d\n", a, b, c);//imprime a=10, b=20, c=30
cambiandoValores(a, b, c);//cambia de valores

System.out.println("Valores despus de cambiar");


System.out.format("a=%d, b=%d, c=%d\n", a, b, c);//imprime a=10,Valores antes
de cambiar
b=20, c=30
} a=10, b=20, c=30
Valores cambiados en el
privatestaticvoidcambiandoValores(inta,intb,intc){ mtodo
a=100; a=100, b=200, c=300
b=200; Valores despus de
c=300; cambiar
System.out.println("Valores cambiados en el mtodo"); a=10, b=20, c=30
System.out.format("a=%d, b=%d, c=%d\n", a, b, c);//imprime a=20, b=30, c=10
}
}
Entonces, estamos claros que,si se asigna
otro valor a las variables desde dentro
de un mtodo, estos nuevos valores no
afectan a las variables
originalescierto? Por tanto, estamos casi
asegurando de que los parmetros son
pasados por valor.
Variable por referencia
El paso de parmetros por referencia
consiste en proporcionar a la subrutina
a la que se le quiere pasar el
argumento la direccin de memoria del
dato.
Revisemos este cdigo:

Qu pasa con los objetos?


publicclassPruebaParametrosReferenciaApp{

publicstaticvoidmain(String[]args){
Persona p=newPersona();//creamos un objeto
p.setNombre("Diego");//le asignamos un valor
System.out.println("El nombre antes del mtodo es:"+p.getNombre());//mostramos el valor
cambiarNombre(p);//llamamos a un mtodo para que cambie de valor
System.out.println("El nombre despus del mtodo es:"+p.getNombre());//mostramos el nuevo valor
}

privatestaticvoidcambiarNombre(Persona p){
p.setNombre("Santiago");//aqui tendr otro valor
}
}

classPersona{

privateStringnombre;

publicStringgetNombre(){
returnnombre;
}

publicvoidsetNombre(Stringnombre){
this.nombre=nombre;
}

Entonces... podemos concluir quecuando son objetos, los parmetros son por
referencia.. porque hemos demostrado que cuando se cambia el valor desde
dentro de un mtodo afecta a la variable original.
En el primer ejemplo, se cambi el valor de la variable directamente.. es decir:
private static void cambiandoValores(int a, int b, int c) {
a = 100; //se le asigna un nuevo valor...
b = 200; //... aqu tambien se le asigna un nuevo valor
c = 300; //... idem... notemos que es a la misma variable
//....
Por tanto, si fuera con objetos... y para ser ms justos... deberamos cambiar directamente a la variable:
//...
private static void cambiarNombre(Persona p) {
p=new Persona(); //aqui se le est asignado un nuevo valor (objeto) al mismo parmetro recibido
p.setNombre("Santiago"); //y...aqui tendr otro valor
}
//...


Entonces, otra sera la historia. Probemos este ltim
publicclassPruebaParametrosObjetosApp{

publicstaticvoidmain(String[]args){ cdigo completo:


Persona p=newPersona();//creamos un objeto
p.setNombre("Diego");//le asignamos un valor
System.out.println("El nombre antes del mtodo es:"+p.getNombre());//mostramos el valor
cambiarNombre(p);//llamamos a un mtodo para que cambie de valor
System.out.println("El nombre despus del mtodo es:"+p.getNombre());//mostramos el nuevo valor
}

privatestaticvoidcambiarNombre(Persona p){
p=newPersona();//nuevo valor al mismo parametro... como era a=100;
p.setNombre("Santiago");//aqui tendr otro valor
System.out.println("El nombre en el mtodo es:"+p.getNombre());
}
}

classPersona{

privateStringnombre;

publicStringgetNombre(){
returnnombre;
}

publicvoidsetNombre(Stringnombre){
this.nombre=nombre;
}
El resultado ser:
El nombre antes del mtodo es:Diego
El nombre en el mtodo es:Santiago
El nombre despus del mtodo es:Diego

Vous aimerez peut-être aussi