java中的局部变量

时间:2010-05-16 15:55:42

标签: java variables

我经历了局部变量和类变量的概念。

但我一直怀疑 “为什么我们不能将local variables声明为static”?

例如 假设我们有一个play()函数:

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

它让我在日食中出错: Illegal modifier for parameter i ;

我怀疑这是因为我读过以下概念:

  1. 方法内部的变量:范围是本地的,即在该方法中。
  2. 当变量声明为static时,它存在于整个类中,而不是特定对象。
  3. 请有人帮助我澄清这个概念。

    感谢。

3 个答案:

答案 0 :(得分:7)

因为局部变量的范围仅限于周围的块。这就是为什么不能从其他类或方法中引用它们(既不是静态的,也不是非静态的)。

维基百科关于static局部变量(例如C ++):

  

静态局部变量在函数内声明,就像自动局部变量一样。它们与普通局部变量具有相同的范围,仅在“存储持续时间”方面不同:在一次调用期间,当函数再次被调用时,函数放入静态局部变量的任何值仍然存在。

Java中不存在。在我看来 - 为了更好。

答案 1 :(得分:1)

Java没有像C这样的静态变量。相反,由于每个方法都有一个与之关联的类(或类的实例),因此持久范围的变量最好存储在该级别(例如,{{1} }或private字段)。唯一真正的区别是同一个类中的其他方法可以引用它们;因为无论如何所有这些方法都被限制在一个文件中,这在实践中并不是一个大问题。

答案 2 :(得分: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"

因此,正如您所看到的,关键字“static”在此处的常规OO中未使用,因为它仍然特定于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()设为静态,但没有必要这样做。)