Локальные переменные в Java

Я прошел понятие локальных переменных и переменных класса.

Но я упорно продолжил сомнение
"Почему это так, чтобы мы не могли объявить local variables как static " ?

Для, например,
Предположим, что у нас есть игра () функция:

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

Это дает мне ошибку в затмении: Illegal modifier for parameter i;

У меня было это сомнение из-за следующих понятий, которые я считал:

  1. Переменные в методе: объем локален т.е. в рамках того метода.
  2. Когда переменная объявляется как статичная, она присутствует для всего класса т.е. не к конкретному объекту.

Мог любой выручать меня для разъяснения понятия.

Спасибо.

9
задан 16 May 2010 в 16:03
поделиться

3 ответа

Потому что область действия локальных переменных ограничена окружающим блоком. Поэтому на них нельзя ссылаться (ни статически, ни нестатически) из других классов или методов.

В Википедии говорится о статических локальных переменных (например, в C ++):

Статические локальные переменные объявляются внутри функции, как автоматические локальные переменные. Они имеют ту же область видимости, что и обычные локальные переменные, но отличаются только «продолжительностью хранения»: какие бы значения функция ни помещала в статические локальные переменные во время одного вызова, они все равно будут присутствовать при повторном вызове функции.

Этого не существует в Java. И на мой взгляд - в лучшую сторону.

7
ответ дан 4 December 2019 в 21:48
поделиться

В Java нет статических переменных, таких как C. Вместо этого, поскольку каждый метод имеет связанный с ним класс (или экземпляр класса), постоянные переменные с ограниченной областью видимости лучше всего хранить на этом уровне (например, как поля private или static private ). Единственное реальное отличие состоит в том, что на них могут ссылаться другие методы того же класса; поскольку все эти методы в любом случае ограничены одним файлом, на практике это не представляет большой проблемы.

1
ответ дан 4 December 2019 в 21:48
поделиться

Статические члены (переменные, функции и т.д.) служат для того, чтобы позволить вызывающим класс лицам, будь они внутри класса или вне его, выполнять функции и использовать переменные, не обращаясь к конкретному экземпляру класса. Из-за этого понятие "статическая локальная" не имеет смысла, так как у вызывающей стороны вне функции не будет возможности обратиться к переменной (поскольку она локальна для этой функции).

В некоторых языках (например, 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() статической, но нет причин, почему она должна быть статической)

.
1
ответ дан 4 December 2019 в 21:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: