Локальные переменные в Java - PullRequest
9 голосов
/ 16 мая 2010

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

Но я застрял в сомнении
«Почему мы не можем объявить local variables как static»?

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

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

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

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

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

Пожалуйста, кто-нибудь может мне помочь прояснить эту концепцию.

Спасибо.

Ответы [ 3 ]

7 голосов
/ 16 мая 2010

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

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

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

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

1 голос
/ 16 мая 2010

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

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

1 голос
/ 16 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...