Java类和静态块

Java类和静态块,java,static,Java,Static,在运行上述代码时,输出为100,因为当我调用Hello类时,首先执行静态块,将b的值设置为100并显示它。 但当我写这段代码时: class Hello12 { static int b = 10; static { b = 100; } } class sample { public static void main(String args[]) { System.out.println(Hello12.b); } }

在运行上述代码时,输出为100,因为当我调用Hello类时,首先执行静态块,将b的值设置为100并显示它。 但当我写这段代码时:

class Hello12 {
    static int b = 10;
    static {
        b = 100;
    }
}

class sample {
    public static void main(String args[]) {
        System.out.println(Hello12.b);
    }
}
这里的输出是10。我希望答案是100,因为一旦静态块被执行,它给b的值是100。因此,在main()中,我调用了Hello.b它应该指向b(=100)。在这两个代码中,内存是如何分配给b的?

在类的“详细初始化过程”中,说明:

接下来,按照文本顺序执行类的类变量初始值设定项和静态初始值设定项,或者执行接口的字段初始值设定项,,就像它们是单个块一样

这意味着第一个例子是:

class Hello12 {
    static {
         b = 100;
    }
    static int b = 10;
}

class sample {
    public static void main(String args[]) {
        System.out.println(Hello12.b);
    }
}
b = 10;
b = 100;
第二个例子是:

class Hello12 {
    static {
         b = 100;
    }
    static int b = 10;
}

class sample {
    public static void main(String args[]) {
        System.out.println(Hello12.b);
    }
}
b = 10;
b = 100;

最后一个赋值“wins”,解释您的输出。

静态按照它们在程序中出现的顺序进行计算。

静态块和静态变量按照它们在源代码中出现的顺序进行初始化。如果您的代码是:

b = 100;
b = 10;

结果是100。

除了回答代码如何以什么顺序执行的问题外,我猜您还想知道为什么静态块可以引用尚未以文本方式声明/执行的静态变量


虽然解释了静态块和静态变量是按照它们出现的文本顺序执行的,但解释了何时可以引用什么,并且您可以看到
使用的条件不在赋值的左侧失败,允许第二个示例中的静态块引用尚未按文本顺序声明/执行的静态变量。

+1。实际上,使用
final
@kocko没关系。让我们帮他拿到徽章。不幸的是,这意味着被接受的答案需要有10个向上投票…如果它以“文本顺序”运行,为什么要编译?当然
b
在静态块中设置时没有被声明?因为编译器总是将变量声明与赋值分开。就像在过去的好日子里一样,每个变量都是首先声明的,在任何赋值之前,都会在内存中找到一个很好的位置并让它变得舒适;-)