Статические члены (переменные, функции и т. Д.) Служат для того, чтобы вызывающие классы, независимо от того, находятся они внутри класса или вне класса, выполняли функции и использовали переменные, не обращаясь к конкретному экземпляру класса. Из-за этого концепция «статического локального» не имеет смысла, так как вызывающая сторона вне функции не может ссылаться на переменную (поскольку она локальна для этой функции).
В некоторых языках (например, VB.NET) есть понятие «статические» локальные переменные, хотя термин «статический» непоследовательно используется в этом сценарии; Статические локальные переменные VB.NET больше похожи на скрытые переменные экземпляра, где последующие вызовы в том же экземпляре будут иметь предыдущее значение без изменений. Например
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"
Итак, как вы можете видеть, ключевое слово «static» не используется в обычном ОО-значении здесь, так как оно все еще специфично для конкретного экземпляра Foo
.
Поскольку это поведение может сбивать с толку (или, по крайней мере, не интуитивно понятно), другие языки, такие как Java и C #, менее гибки, когда речь идет о объявлениях переменных. В зависимости от того, как вы хотите, чтобы он вел себя, вы должны объявить вашу переменную либо как переменную экземпляра, либо как статическую переменную / переменную класса:
Если вы хотите, чтобы переменная существовала вне области действия функции, но относилась к одному экземпляру класса (как это делает VB.NET), то создайте переменную экземпляра:
public class Foo
{
private int bar;
public void Bar()
{
bar++;
System.out.println(bar);
}
}
Если вы хотите, чтобы он был доступен для всех экземпляров класса (или даже без экземпляра), сделайте его static
:
public class Foo
{
private static int bar;
public static void Bar()
{
bar++;
System.out.println(bar);
}
}
(Обратите внимание, что я сделал Bar()
статическим в последнем примере, но нет причины, по которому это должно быть.)