2011-01-17 11 views
5

¡Quiero usar referencia en Java pero no sé cómo! por ejemplo en C++ escribimos:¿Cómo usar las referencias en Java?

void sum(int& x) 
{ 
    ... 
} 

pero en Java & signo es un error de compilación! por favor ayúdame a entender las referencias en Java.

+1

@skaffman: Es por eso que tenemos poderes de moderador, supongo. – Esko

+0

@Esko, excepto que no debe editar las publicaciones únicamente para realizar correcciones estéticas menores (como corregir un error tipográfico). Me resulta deprimente que @skaffman publicó su comentario en ese "tono" y que 6 personas más lo votaron como útil. –

+0

@Tim: De hecho, recuerdo haber leído todo lo contrario de lo que acaba de decir en el blog oficial y meta varias veces. Tal como lo veo, la corrección de los errores tipográficos y la gramática está respaldada, ya que a veces hace que la comprensión de la pregunta en sí sea mucho más fácil para los demás. – Esko

Respuesta

6

objetos se pasan por referencia por defecto Los objetos son visitada por referencia, pero no hay manera de crear una referencia a un valor simple (byte, short, int, long). Debe crear un objeto para envolver el entero o usar una única matriz de elementos.

public void sum(int[] i){ 
    i[0] = ...; 
} 

o

public void sum(MyInt i){ 
    i.value = ...; 
} 
public class MyInt{ 
    public int value; 
} 

por su ejemplo podría funcionar algo como lo siguiente

public int sum(int v){ 
    return ...; 
} 

o

public int sum(){ 
    return ...; 
} 

Actualización:

adicional Mejor Descripción/de referencias a objetos:

objetos Java siempre se accede por una referencia. Al igual que los tipos primitivos, esta referencia se pasa por valor (por ejemplo, copiada). Como todo lo que un programador puede acceder en java se pasa copiándolo (referencias, primitivas) y no hay forma de crear una referencia a un tipo primitivo, cualquier modificación de un parámetro de método (referencias, primitivas) solo afecta la copia local dentro del método. Los objetos se pueden modificar dentro de un método dado que ambas copias de la referencia (local y otra) aún apuntan a la misma instancia de objeto.

ejemplo:

modificar una primitiva dentro de método, esto sólo afecta a la copia interna de i y no el valor pasado.

void primitive(int i){ 
    i = 0; 
} 

Modificar una referencia dentro del método, esto solo afecta a la copia interna de ref y no al valor pasado.

void reference(Object ref){ 
    ref = new Object();//points to new Object() only within this method 
} 

modificar un objeto, visible a nivel mundial

void object(List l){ 
    l.add(new Object());//modifies the object instead of the reference 
} 

Tanto la matriz y myInt anteriores se basan en la modificación de un objeto.

+3

"Los objetos se pasan por referencia de forma predeterminada" - Eso es incorrecto. Todo es pass-by-value en Java. Donde se vuelve confuso es que ** referencias ** (variables no primitivas) también se pasan ** por valor **. Tenga en cuenta que pasar una referencia por valor no es lo mismo que pasar un objeto por referencia. – Jesper

+0

@Jesper no está completamente mal, los objetos siempre se pasan por referencia en java. Que la referencia en sí misma se pasa por valor también es cierta. – josefx

+1

No puede pasar objetos directamente. Las variables de tipos no primitivos son referencias; no son los objetos en sí, como en C++. Hablar de "pasar objetos" es una terminología imprecisa cuando se habla de Java. – Jesper

6

Un parámetro de Java normal ya está más cerca de una referencia de C++ que de C++ paso por valor o pase por puntero. Entonces, todos tus métodos Java ya son así.

int y otras primitivas son especiales en Java, sin embargo; lo anterior es cierto para referencias de objetos.


Editar: Con más precisión, como se dijo @fatih, todas las invocaciones de Java tienen un valor porcentual. Sin embargo, cuando pasas un objeto estás pasando una referencia por valor. Entonces, como primera aproximación, la declaración anterior es correcta: un parámetro de Java ordinario es más similar a una referencia de C++ que a C++ paso por valor o pase por puntero.

3

lectura obligatoria en la comprensión de la semántica paso por valor de Java:

http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html http://javadude.com/articles/passbyvalue.htm http://javachannel.net/wiki/pmwiki.php/FAQ/PassingVariables (enlaces a otras páginas)

eliminar por completo la noción de su cabeza que Java puede tener algo pasado por referencia. Veamos un ejemplo, ¿de acuerdo?

public class App 
{ 
    public static void main(String[] args) 
    { 
     Foo f1 = new Foo(); 
     doSomethingToFoo(f1); 
     System.out.println(f1.bar); //Hey guess what, f1.bar is still 0 because JAVA IS PASS BY VALUE!!! 
    } 

    static void doSomethingToFoo(Foo f) { 
     f = new Foo(); 
     f.bar = 99; 
    } 

    static class Foo { 
     int bar = 0; 
    } 
} 
+1

¿Qué ocurre si elimina la línea que dice 'f = new Foo()'? Supongo que obtendrás 99 impresos, no 0. – xryl669

Cuestiones relacionadas