我经历了局部变量和类变量的概念。
但我一直怀疑
“为什么我们不能将local variables
声明为static
”?
例如 假设我们有一个play()函数:
void play( )
{
static int i=5;
System.out.println(i);
}
它让我在日食中出错: Illegal modifier for parameter i
;
我怀疑这是因为我读过以下概念:
请有人帮助我澄清这个概念。
感谢。
答案 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()
设为静态,但没有必要这样做。)