Статические элементы (переменные, функции и т. Д.) Позволяют разрешать вызывающим абонентам класса, независимо от того, находятся они в классе или вне класса, выполнять функции и использовать переменные без обращения к определенному экземпляру класса , Из-за этого понятие «статический локальный» не имеет смысла, так как не было бы способа, чтобы вызывающий объект вне функции ссылался на переменную (поскольку она локальна для этой функции).
Есть несколько языков (например, 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"
Итак, как вы можете видеть, ключевое слово «статический» не используется в общепринятом значении OO здесь, как это по-прежнему относится к конкретному экземпляру Foo
.
Поскольку это поведение может сбивать с толку (или, по крайней мере, неинтуитивно), другие языки, такие как Java и C#, менее гибки, когда речь заходит о объявлениях переменных. В зависимости от того, как вы себя ведете, вы должны объявить свою переменную либо как переменную экземпляра, либо переменную static/class:
Если вы хотите, чтобы переменная существовала за пределами функции, но была бы особой один экземпляр класса (как 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()
статический в последнем примере, но нет причин, чтобы он был.)
Ну, область в том же языке на C или C++, но они позволяют статическую переменную внутри функций просто отлично , – doublep
Да! В C++ переменные static/class могут быть объявлены внутри метода. – 2010-05-16 16:12:15
@doublep: да, но Java не является C или C++, нет причин, по которым он должен работать на Java. – Jesper