【问题标题】:Why can't i use static variable in java constructor?为什么我不能在 java 构造函数中使用静态变量?
【发布时间】:2015-07-19 17:45:32
【问题描述】:
编译器说illegal modifier for parameter i。
请告诉我我做错了什么。为什么我不能在 Java 构造函数中使用静态变量?
class Student5{
Student5() {
static int i = 0;
System.out.println(i++);
}
public static void main(String args[]){
Student5 c1 = new Student5();
Student5 c2 = new Student5();
Student5 c3 = new Student5();
}
}
【问题讨论】:
标签:
java
constructor
static
static-variables
【解决方案1】:
因为你在哪里声明i:
Student5(){
static int i=0;
System.out.println(i++);
}
编译器将其视为构造函数中的局部变量:
局部变量不能声明为static。有关局部变量允许使用哪些修饰符的详细信息,请参阅Section 14.4 of the Java Language Specification。
从代码似乎试图做的事情来看,您可能希望i 成为Student5 的静态成员,而不是构造函数中的局部变量:
class Student5{
private static int i = 0;
Student5(){
System.out.println(i++);
}
. . .
}
【解决方案2】:
如果你想声明 static 变量然后在构造函数之外声明它,在类级别像这样 -
public class Student5{
private static int i;
}
static 的声明发生在你的构造函数中,它是一个局部变量,并且局部变量不能是 static。这就是为什么你得到 - illegal modifier for parameter i。最后,为了初始化 static 变量,您可以使用静态初始化块(尽管它不是强制性的) -
public class Student5{
private static int i;
static {
i = 5;
}
}
【解决方案3】:
这就是语言的设计方式。如果您想在构造函数中有另一个名为i 的int 字段怎么办?那么应该考虑哪个i?此外,静态字段在调用构造函数之前被初始化,即在类 initilization 阶段。只有在创建新实例时才会调用构造函数。
想象一下如果你加载并初始化一个类而不是创建一个新实例会发生什么(应该发生)。
【解决方案4】:
静态变量是可以在没有类实例的情况下引用的变量。通过定义一个而不是在创建类的实例时调用的构造函数,您自相矛盾。要么在没有实例的情况下定义它(在构造函数之外并且是静态的),要么让它特定于一个实例(在构造函数内部而不是静态的)。
您可能需要重新考虑您实际尝试做的事情以及您是否真的需要静态变量。