编译器说 “参数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();
}
}
4条答案
按热度按时间af7jpaap1#
由于您声明
i
的位置:编译器将其视为构造函数中的局部变量:局部变量不能声明为
static
。有关局部变量允许使用哪些修饰符的详细信息,请参见Java语言规范的第14.4节。从代码的意图来看,您可能希望
i
成为Student5
的静态成员,而不是构造函数中的局部变量:50pmv0ei2#
如果你想声明
static
变量,那么就在构造函数外声明它,在类级别声明,就像这样-你在构造函数中声明了
static
,它是一个局部变量,而局部变量不能是static
,这就是为什么你会得到-illegal modifier for parameter i
.最后,为了初始化static
变量,你可以使用一个静态初始化块(尽管不是强制的)-6vl6ewon3#
这就是该语言的设计方式。如果您希望在构造函数中有另一个名为
i
的int
字段,那么应该考虑哪个i
?此外,静态字段在调用构造函数之前初始化,即在类 * 初始化 * 阶段。构造函数仅在创建新示例时被调用。想象一下,如果你加载并初始化一个类,但没有 * 创建一个新示例 *,会发生什么(应该发生什么)。
j2qf4p5b4#
静态变量是可以在没有类示例的情况下引用的变量。通过定义一个静态变量而不是构造函数(在创建类示例时调用构造函数),您是自相矛盾的。要么使它在没有示例的情况下定义(在构造函数之外且为静态),要么使它特定于示例(在构造函数之内且为非静态)。
您可能需要重新考虑您实际尝试做什么,以及是否真的需要静态变量。