Java 在静态初始化器之后声明静态变量

Java 在静态初始化器之后声明静态变量,java,static,instance,declaration,instantiation,Java,Static,Instance,Declaration,Instantiation,以下代码编译成功。根据我的理解,在使用变量之前必须声明变量,那么这里到底发生了什么 class A { static { y=20; z=10; } static int z; static int y=30; { w=10; } int w; public static void main(String args[]){ System.out.println(y); } } 阅读评论后修改了问题。 这里的输出是30。 因此,首先进行变量声明,然后按照出现顺序

以下代码编译成功。根据我的理解,在使用变量之前必须声明变量,那么这里到底发生了什么

class A {
static {
    y=20;
    z=10;
}
static int z;
static int y=30;
{
    w=10;
}
int w;
public static void main(String args[]){
     System.out.println(y);
}
}
阅读评论后修改了问题。 这里的输出是30。
因此,首先进行变量声明,然后按照出现顺序执行所有初始化语句

类加载器在加载类时声明变量


静态块将在第一次访问类时进行求值,以便在此期间声明成员变量,因此顺序实际上并不重要

类加载器在加载类时声明变量

静态块将在第一次访问该类时进行求值,以便在此期间声明成员变量,因此顺序实际上并不重要

在使用变量之前必须声明它们

这只是部分正确。如果您在某个方法中,并且执行了以下操作:

System.out.println(i);
int i = 0;
显然它不会编译

但是,当您在类级别声明变量时,此规则不起作用。在您的代码中,仅仅因为
w
的声明在使用后写了几行(
w=10;
),并不意味着行
int w
w=10行之后执行

可以这样想:编译器将首先看到所有静态字段的声明(类级变量),然后是所有非静态字段,然后是类中的代码块(构造函数、方法等)。在代码中:

class A {
    static {
        z=10;
    }
    static int z;
    {
        w=10;
    }
    int w;
}
编译器首先查看
z
,然后查看
w
。然后,假设您第一次在代码的其他部分访问
A
。现在执行静态块(
z=10;
)。让我们再次假设您实际上正在创建一个
a
的新实例,现在
w=10将被执行

在使用变量之前必须声明它们

这只是部分正确。如果您在某个方法中,并且执行了以下操作:

System.out.println(i);
int i = 0;
显然它不会编译

但是,当您在类级别声明变量时,此规则不起作用。在您的代码中,仅仅因为
w
的声明在使用后写了几行(
w=10;
),并不意味着行
int w
w=10行之后执行

可以这样想:编译器将首先看到所有静态字段的声明(类级变量),然后是所有非静态字段,然后是类中的代码块(构造函数、方法等)。在代码中:

class A {
    static {
        z=10;
    }
    static int z;
    {
        w=10;
    }
    int w;
}

编译器首先查看
z
,然后查看
w
。然后,假设您第一次在代码的其他部分访问
A
。现在执行静态块(
z=10;
)。让我们再次假设您实际上正在创建一个
a
的新实例,现在
w=10将被执行。

“据我所知,在使用之前必须声明变量”,为什么您认为块和变量的位置在这里很重要?必须在首次使用之前声明局部变量。字段,不太多……这两个链接都不起作用,但它们(隐含地)表示字段的位置可能会有所不同://修改了问题以涵盖其他场景中的示例看起来很有启发性。“根据我的理解,在使用前必须声明变量”为什么你认为块和变量的位置在这里很重要?在第一次使用之前必须声明局部变量。字段,不太多…这两个链接都不起作用,但它们(隐含地)表示字段的位置可能会有所不同://修改问题以涵盖其他场景中的示例看起来很有启发性。修改问题的目的是completeness@wib您遇到的行为是因为
inty=30在静态块之后执行。因此编译器首先看到声明,然后运行静态块,然后执行
y=30
部分completeness@wib您遇到的行为是因为
inty=30在静态块之后执行。因此编译器首先看到声明,然后运行静态块,然后执行
y=30
部分。修改了问题。在一个语句中声明和初始化变量时会发生什么?修改了问题。在一个语句中声明和初始化变量时会发生什么?