为什么不能在Java构造函数中声明静态变量?

rkue9o1l  于 2023-03-06  发布在  Java
关注(0)|答案(4)|浏览(160)

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

af7jpaap1#

由于您声明i的位置:

Student5(){  
    static int i=0;
    System.out.println(i++);  
}

编译器将其视为构造函数中的局部变量:局部变量不能声明为static。有关局部变量允许使用哪些修饰符的详细信息,请参见Java语言规范的第14.4节。
从代码的意图来看,您可能希望i成为Student5的静态成员,而不是构造函数中的局部变量:

class Student5{
    private static int i = 0;

    Student5(){  
        System.out.println(i++);  
    }

. . .
}
50pmv0ei

50pmv0ei2#

如果你想声明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;
   }

}
6vl6ewon

6vl6ewon3#

这就是该语言的设计方式。如果您希望在构造函数中有另一个名为iint字段,那么应该考虑哪个i?此外,静态字段在调用构造函数之前初始化,即在类 * 初始化 * 阶段。构造函数仅在创建新示例时被调用。
想象一下,如果你加载并初始化一个类,但没有 * 创建一个新示例 *,会发生什么(应该发生什么)。

j2qf4p5b

j2qf4p5b4#

静态变量是可以在没有类示例的情况下引用的变量。通过定义一个静态变量而不是构造函数(在创建类示例时调用构造函数),您是自相矛盾的。要么使它在没有示例的情况下定义(在构造函数之外且为静态),要么使它特定于示例(在构造函数之内且为非静态)。
您可能需要重新考虑您实际尝试做什么,以及是否真的需要静态变量。

相关问题