Java 在声明之前分配一个静态变量

Java 在声明之前分配一个静态变量,java,static,Java,Static,我正在学习Java并编写以下简单代码: public class Test { private int a = b; private final static int b = 10; public int getA() { return a; } } public class Hello { public static void main(String[] args) { Test test = new Test

我正在学习Java并编写以下简单代码:

public class Test {

    private int a = b;  
    private final static int b = 10;

    public int getA() {
        return a;
    }
}

public class Hello {

    public static void main(String[] args) {
        Test test = new Test();
        System.out.println(test.getA());
    }

}
结果:10。做得好!它运行成功,没有错误


有人能解释一下为什么我可以在声明静态变量之前分配它吗?

在代码中声明变量的顺序实际上并不重要,因为实际上静态变量将在非静态变量之前初始化。

分配

private int a = b;  

在创建
Test
的新实例时发生(就在调用构造函数之前)

在加载类时,静态变量
b
的声明和初始化在创建实例之前进行


语句的顺序无关紧要,因为静态变量总是先初始化。

静态变量绑定到一个类,当然这个类总是在类的实例之前存在。因此,您可以自由地将其分配给实例字段。

Java变量按以下顺序初始化:

  • 超类的静态变量(如果有)
  • 当前类的静态变量
  • 静态变量和按顺序排列的静态块 宣布
  • 超类的实例变量
  • 当前类的所有实例变量
  • 中的实例变量和实例级初始化块 申报单
  • 因此,“b”在“a”之前被初始化


    希望这有帮助。

    您编写的代码运行良好,因为
    private final static int b=10
    是类变量(静态字段)。首先初始化这些类型的变量

    然后执行该行
    private int a=b
    初始化实例变量(字段)
    a


    简而言之,在代码中声明这些变量的顺序并不重要。类变量总是在实例变量之前声明。

    在创建任何实例之前加载类后,可能重复的静态成员已经初始化。您说的“声明前赋值”是什么意思?“intb”声明,“=10”赋值,所以在赋值之前先声明。或者你的意思是在声明之前使用?”(就在调用构造函数之前)“不完全是这样,字段的初始化被移动到构造函数中,所以更像是“调用构造函数时,但在其隐式或显式的
    super(参数)
    call之后”。你能为我分享一些官方文档吗?我真的很想理解deeply@DatNguyen最正式的文件是JLS。阅读章节和。