2012-05-18 20 views
12

Me pregunto, ¿todas las variables locales se vuelven estáticas si las declaramos en un método estático?¿Las variables locales en métodos estáticos también son estáticas?

por ejemplo:

public static void A(){ 
     int x [] = {3,2}; 
     changeX(x); 

     for (int i = 0; i< x.length; i++){ 
      System.out.println(x[i]); // this will print -1 and 1 
     } 
    } 
    private static void changeX(int[] x){ 
     x[0] = -1; 
     x[1] = 1; 
    } 

Por lo que yo entiendo que Java es siempre paso por valor, pero ¿por qué el estado de X ha cambiado después de haber hecho el CambiarX llamar? ¿Alguien puede explicar eso por favor? y ¿alguien puede explicar cómo maneja Java las variables estáticas en términos de asignación de memoria? y qué pasa si pasamos una variable estática a una función como parámetro (sé que las personas normalmente no lo harán)

+1

Esto no tiene sentido ya que la estática no tiene significado para las variables locales. Son locales, de período, ya sea que estén en un método estático o en un método de instancia. –

+0

Es una variable local o temporal. Una vez que la función finaliza, no tiene alcance. – Subs

+0

Array es un objeto en Java. La referencia de la matriz se pasa a changeX cuando se invoca, por lo que sus elementos en la matriz se pueden cambiar dentro de changeX. –

Respuesta

18

La respuesta a la mayoría de sus preguntas es "igual que cualquier otra variable".

Las variables locales en métodos estáticos son solo variables locales en un método estático. No son estáticos, y no son especiales de ninguna manera.

Static variables se mantienen en la memoria unida a los objetos correspondientes Class; cualquier objeto referenciado por variables de referencia estáticas solo vive en el montón normal.

Cuando pasa una variable estática a un método como argumento ... no sucede absolutamente nada interesante.

cuanto a la escena en el código:

  1. Imagine que tiene un globo de juguete en una cadena (el globo es su objeto de matriz, y la cadena es la referencia a ella declaró en A()).
  2. Ahora ata otro enganche al globo y dele la cuerda a un amigo (eso es exactamente lo que ocurre cuando llama al método changeX(): la cadena es el parámetro del método y apunta al mismo objeto).)
  3. A continuación, su amigo tira de la cadena, toma un marcador negro y dibuja una cara en el globo (esto es como el método changeX() que modifica la matriz).
  4. Entonces su amigo desata su cadena, dejando sólo su cuerda atada al globo (el método retorna, y la variable local en changeX() sale del ámbito.)
  5. Por último, el carrete en la cadena y mirar el globo: por supuesto, ves la cara (tu rutina A() ve la matriz modificada).

¡Es realmente así de simple!

+0

¿Puede explicar el código anterior por qué el estado de X cambió después de esa llamada de función? – peter

+1

@ user1389813: eso no tiene nada que ver con * static * y todo tiene que ver con entender las variables de referencia. Por favor, lea lo que Java-ranch tiene para decir sobre las variables. –

+0

pero creo que java siempre pasa por valor – peter

2

Como han señalado otros, las variables que son locales para un MÉTODO son las mismas que cualquier otra variable declarada dentro de cualquier otro método: se asignan dinámicamente y pueden liberarse cuando el método devuelve que la variable ya no es visible.

Sin embargo, si necesita variables estáticas, deberá declararlas fuera de los métodos, como variables estáticas ordinarias para una clase. Si, por convención, los deja en paz, excepto cuando están dentro de ese método en particular, tienen el mismo efecto que si fueran estáticos y locales para el método. Solo asegúrate de agregar comentarios a ese efecto.

1

Las variables estáticas se almacenan en un área especial del montón denominada "generación permanente".

Las variables locales extraídas en un método estático no hacen ninguna diferencia con las declaradas en un método no estático. Las referencias a objetos y las variables primitivas se colocan en la pila. Cada vez que creas un objeto, el almacenamiento se asigna en el montón cuando se ejecuta ese código.

Cuestiones relacionadas