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

Why can't i use static variable in java constructor?

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

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

想象一下,如果您加载并初始化一个 class 而不是 创建一个新实例 会发生(应该发生)的情况。

因为你在哪里声明 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++);  
    }

. . .
}  

如果你想声明 static 变量然后在构造函数之外声明它,在 class 级别像这样 -

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;
   }

}  

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

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