2010-03-24 22 views
5

En C++, si necesita modificar 2 objetos, puede pasar por referencia. ¿Cómo se logra esto en Java? Supongamos que los 2 objetos son tipos primitivos como int.Pasando por referencia en Java?

+0

Este es un duplicado de http://stackoverflow.com/questions/589919/doe s-java-pass-by-reference – Zxaos

Respuesta

12

No puede. Java no admite el paso de referencias a variables. Todo se pasa por valor.

Por supuesto, cuando una referencia a un objeto se pasa por valor, apuntará al mismo objeto, pero esto no está llamando por referencia.

0

Usando genéricos puede crear una clase de puntero que lo haría al menos algo menos doloroso. Usted pasa el objeto, cambia su propiedad de valor y cuando la función sale de su objeto contendrá el nuevo valor.

MyPointerClass<int> PointerClass = new MyPointerClass<int>(5); 
myFunction(PointerClass); 
System.out.println(PointerClass.Value.toString()); 

// ... 

void myFunction(myPointerClass<int> SomeValue) 
{ 
    SomeValue.Value = 10; 
} 
1

Java no tiene pase por referencia, pero todavía se puede mutar objetos a partir de esas referencias (que a su vez se pasan por valor).

Como se puede ver, aún puedes modificar objetos (si no son inmutables); simplemente no puede modificar referencias o primitivas pasándolas a una función.

Por supuesto, puede convertirlos en campos de un objeto y pasar esos objetos alrededor y configurarlos para lo que desee. Pero eso aún no pasa por referencia.

2

Envuélvalos en un objeto y luego pase ese objeto como un parámetro al método.

Por ejemplo, el siguiente código C++:

bool divmod(double a, double b, double & dividend, double & remainder) { 
    if(b == 0) return false; 
    dividend = a/b; 
    remainder = a % b; 
    return true; 
} 

puede reescribirse en Java como:

class DivRem { 
    double dividend; 
    double remainder; 
} 

boolean divmod(double a, double b, DivRem c) { 
    if(b == 0) return false; 
    c.dividend = a/b; 
    c.remainder = a % b; 
    return true; 
} 

Aunque estilo más idiomática en Java sería crear y devolver este objeto desde el método en lugar de aceptarlo como parámetro:

class DivRem { 
    double dividend; 
    double remainder; 
} 

DivRem divmod(double a, double b) { 
    if(b == 0) throw new ArithmeticException("Divide by zero"); 
    DivRem c = new DivRem(); 
    c.dividend = a/b; 
    c.remainder = a % b; 
    return c; 
}