为什么我不能在java构造函数中使用静态变量?

时间:2015-07-19 17:45:33

标签: java constructor static static-variables

编译器说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();
    }
}  

4 个答案:

答案 0 :(得分:6)

因为您要声明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++);  
    }

. . .
}  

答案 1 :(得分: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;
   }

}  

答案 2 :(得分:0)

这就是语言的设计方式。如果你想在构造函数中有另一个名为int的{​​{1}}字段,怎么办呢?那么i应该考虑什么?此外,静态字段在调用构造函数之前初始化,即在类 initilization 阶段。只有在创建新实例时才会调用构造函数。

想象一下,如果你加载并初始化一个类而不是创建一个新实例会发生什么(应该发生)。

答案 3 :(得分:0)

静态变量是可以在没有类实例的情况下引用的变量。通过定义一个而不是在创建类的实例时调用的构造函数,您自相矛盾。要么在没有实例的情况下定义它(在构造函数和静态之外),要么使它特定于实例(在构造函数内部而不是静态)。

您可能想重新考虑一下您实际要做的事情以及您是否真的需要一个静态变量。