2010-05-16 2 views
9

Я прошел через переменные локальных переменных и переменных переменных.Локальные переменные в java

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

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

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

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

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

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

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

Спасибо.

ответ

7

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

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

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

Это не существует на Java. И по-моему - к лучшему.

+0

Ну, область в том же языке на C или C++, но они позволяют статическую переменную внутри функций просто отлично , – doublep

+0

Да! В C++ переменные static/class могут быть объявлены внутри метода. – 2010-05-16 16:12:15

+0

@doublep: да, но Java не является C или C++, нет причин, по которым он должен работать на Java. – Jesper

1

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

1

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

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

+0

Ссылка на примечание: насколько я знаю, вам необходимо объявить метод Bar() статическим, поскольку статические методы могут обращаться к статическим данным. – 2010-05-16 16:19:53

+0

@Mandar: Это означает, что я должен объявить переменную 'bar' как статическую, а не метод' Bar() '; вы правы, что статические методы могут обращаться только к статическим данным, но методы экземпляров также могут обращаться к статическим данным. –

Смежные вопросы