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