2010-05-16 21 views
9

Revisé las variables locales y el concepto de variables de clase.Variables locales en java

Pero había pegado a una duda
"¿Por qué es así que no se puede declarar como local variablesstatic"?

Para
por ejemplo Supongamos que tenemos una función de reproducción():

void play() 
{ 
    static int i=5; 
    System.out.println(i); 
} 

Me da error en Eclipse: Illegal modifier for parameter i;

tenía esta duda a causa de los siguientes conceptos que he leído:

  1. variables dentro de método: es decir ámbito de aplicación es local dentro de ese método.
  2. Cuando la variable se declara como estática, está presente para toda la clase, es decir, no para un objeto particular.

Por favor, podría alguien ayudarme a aclarar el concepto.

Gracias.

Respuesta

7

Porque el alcance de las variables locales está limitado al bloque circundante. Es por eso que no pueden ser referidos (ni estáticamente ni no estáticamente) de otras clases o métodos.

Wikipedia dice sobre static variables locales (en C++ por ejemplo):

variables locales estáticas se declaran dentro de una función, al igual que las variables locales automáticas. Tienen el mismo alcance que las variables locales normales, que difieren solo en "duración de almacenamiento": cualquier valor que la función ponga en variables locales estáticas durante una llamada seguirá presente cuando se vuelva a llamar a la función.

Eso no existe en Java. Y en mi opinión, para mejor.

+0

Bueno, el alcance de la misma en C o C++, aún permiten la variable estática dentro de las funciones bien . – doublep

+0

¡Sí! En C++, las variables estáticas/de clase se pueden declarar dentro de un método. –

+0

@doublep: sí, pero Java no es C o C++, no hay ninguna razón por la que debería funcionar igual en Java. – Jesper

1

Java no tiene variables estáticas como C. En su lugar, dado que cada método tiene una clase (o instancia de una clase) asociada, las variables de ámbito persistente se almacenan mejor en ese nivel (por ejemplo, private o static private campos). La única diferencia real es que otros métodos en la misma clase pueden referirse a ellos; dado que todos esos métodos están limitados a un solo archivo de todos modos, no es un gran problema en la práctica.

1

Los miembros estáticos (variables, funciones, etc.) sirven para permitir que los llamantes de la clase, estén dentro o fuera de la clase, ejecuten funciones y utilicen variables sin referirse a una instancia específica de la clase . Debido a esto, el concepto de "local estático" no tiene sentido, ya que no habría forma de que un llamante fuera de la función haga referencia a la variable (ya que es local para esa función).

Existen algunos lenguajes (VB.NET, por ejemplo) que tienen un concepto de variables locales "estáticas", aunque el término "estático" se usa de manera incoherente en este escenario; Las variables locales estáticas de VB.NET se parecen más a variables de instancia ocultas, donde las llamadas posteriores en la misma instancia tendrán el valor anterior intacto.Por ejemplo

Public Class Foo 
    Public Sub Bar() 
     Static i As Integer 

     i = i + 1 

     Console.WriteLine(i) 
    End Sub 
End Class 

... 

Dim f As New Foo() 
Dim f2 as New Foo() 

f.Bar() // Prints "1" 
f.Bar() // Prints "2" 
f2.Bar() // Prints "1" 

Por lo tanto, como se puede ver, la palabra clave "estática" no se usa en el sentido convencional OO aquí, ya que todavía es específica para un caso particular de Foo.

Dado que este comportamiento puede ser confuso (o, al menos, poco intuitivo), otros lenguajes como Java y C# son menos flexibles cuando se trata de declaraciones de variables. Dependiendo de cómo quiera que se comporte, debe declarar su variable como una variable de instancia o una variable estática/de clase:

Si desea que la variable exista más allá del alcance de la función, pero sea particular a un única instancia de la clase (como VB.NET hace), a continuación, crear una variable de instancia:

public class Foo 
{ 
    private int bar; 

    public void Bar() 
    { 
     bar++; 

     System.out.println(bar); 
    } 
} 

Si usted quiere que sea accesible a todos los instancias de la clase (o incluso sin una instancia), que es static:

public class Foo 
{ 
    private static int bar; 

    public static void Bar() 
    { 
     bar++; 

     System.out.println(bar); 
    } 
} 

(Tenga en cuenta que hice Bar() estática en el último ejemplo, pero no hay razón para que sea)

+0

Refiérase a su nota: Por lo que yo sé, necesita declarar el método Bar() como estático porque los métodos estáticos solo pueden acceder a datos estáticos. –

+0

@Mandar: Eso significa que tengo que declarar la variable 'bar' como estática, no el método' Bar() '; tiene razón en que los métodos estáticos solo pueden acceder a datos estáticos, pero los métodos de instancia también pueden acceder a datos estáticos. –

Cuestiones relacionadas