在java中初始化静态变量

在java中初始化静态变量,java,static,initialization,Java,Static,Initialization,“加载类时初始化静态变量”的确切含义是什么?我在网上读了很多讨论,但我还是很困惑。步骤2是初始化步骤,对吗?那么在第1步“加载类时”会发生什么 公共类NewClass{ 静态int[]arr;//步骤1 新类(){ arr=new int[10];//步骤2 例如(int i=0;i初始化构造函数中的静态成员会违背静态成员的目的,因为它们不属于任何实例,并且您将创建的每个新实例都将覆盖静态数组的值 您应该在声明静态变量时或在静态初始化块中初始化静态变量 static int[] arr = ne

“加载类时初始化静态变量”的确切含义是什么?我在网上读了很多讨论,但我还是很困惑。步骤2是初始化步骤,对吗?那么在第1步“加载类时”会发生什么

公共类NewClass{
静态int[]arr;//步骤1
新类(){
arr=new int[10];//步骤2

例如(int i=0;i初始化构造函数中的静态成员会违背静态成员的目的,因为它们不属于任何实例,并且您将创建的每个新实例都将覆盖静态数组的值

您应该在声明静态变量时或在静态初始化块中初始化静态变量

static int[] arr = new int[10];


初始化(即,静态声明和静态初始化块的执行)将在加载类时发生,这发生在应用程序首次访问任何成员(构造函数、静态方法、静态变量)时如果要在加载类时对其进行初始化,则应使用
静态
初始值设定项:

public class NewClass {
    static int[] arr; //Step 1

    static {
        arr = new int[10]; //Step 2
        for(int i= 0;i<10;i++){
            arr[i] = i;
        }
    }
}
公共类NewClass{
静态int[]arr;//步骤1
静止的{
arr=new int[10];//步骤2
对于(int i=0;i
步骤2是初始化步骤,对吗

不,这叫做数组的构造。数组的初始化意味着在第2步之后将要做的事情放入数组中

那么在第1步“加载类时”会发生什么

当类被加载时,所有静态变量都会用它们的默认值初始化。在
对象
的情况下,它的默认值是
null
,或者你可以说是一个不指向任何内容的引用。此时数组没有分配内存

在第二步之前会发生什么

当使用关键字
new
创建类型为
NewClass
的对象时,此时将调用构造函数并构造数组,并为堆中的10个int值分配内存,默认值为全零(直到步骤2)

第二步之后会发生什么

在第2步之后,您实际上正在初始化数组,即将值放入其中



如果您想了解更多信息,请阅读本书

当类加载器加载该类时,链接器的工作将启动。链接器验证Java代码,是否按照Java语言和JVM中给出的规范编写。如果找到有效的Java代码,则开始为字段、方法、接口等分配内存。创建引用将引用分配给内存位置后,所有字段变量、方法、接口等都将初始化为默认值(如果未明确指定)。否则,它将分配任何设置为初始值的值。

加载类时!=实例化类时。那么“加载”是什么意思.
arr=new int[10];
initialization@Bishal“loaded”指的是我在最后一句中写的内容。@Eran我刚刚签出它,所有内容都与您写的一样,但有一点-“当您的应用程序第一次访问任何成员(构造函数、静态方法、静态变量)时会发生这种情况”.我的类中有一个
final static
变量,当我访问它时,我的静态块没有运行(其中有
System.out.println
)。当我删除
final
关键字时,
static
块确实按预期运行了-您有什么解释吗?@MichałSchielmann如果您定义一个final静态变量,编译器可能会在访问它的地方用它的常量值替换它,因此在访问它时不会加载该类。@Eran-thanks,这是有道理的,但这也意味着,如果我在一个我从未使用过的类中有一个健壮的(某些大数据数组)最终静态字段,它将从应用程序过程的开始到结束存储在内存中——这有点可怕;)
static {
    arr = new int[10];
}
public class NewClass {
    static int[] arr; //Step 1

    static {
        arr = new int[10]; //Step 2
        for(int i= 0;i<10;i++){
            arr[i] = i;
        }
    }
}
static int[] arr;   // declaration

arr = new int[10];  // construction

arr[i] = i;         // initialization