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)
Bueno, el alcance de la misma en C o C++, aún permiten la variable estática dentro de las funciones bien . – doublep
¡Sí! En C++, las variables estáticas/de clase se pueden declarar dentro de un método. –
@doublep: sí, pero Java no es C o C++, no hay ninguna razón por la que debería funcionar igual en Java. – Jesper