Java 打印没有类名的静态变量会导致错误

Java 打印没有类名的静态变量会导致错误,java,static,modifier,Java,Static,Modifier,我的想法是,第7行和第8行将给出相同的输出,但事实并非如此 我的问题 我不明白的是,当我们能够在第6行没有类名的情况下初始化静态变量时,但是为什么我们不能在第8行没有类名的情况下打印它 您复制/粘贴的两条规则是错误的,您应该只考虑: 中考虑了静态声明和静态块初始化 它们在源文件中的显示顺序 因此,您可以修复问题,更改声明顺序和静态初始化块: public class ClearingDoubtsAboutStatic { static { System.out.

我的想法是,
第7行和第8行将给出相同的输出,但事实并非如此

我的问题
我不明白的是,当我们能够在
第6行
没有类名的情况下初始化静态变量时,但是
为什么我们不能在
第8行
没有类名的情况下打印它

您复制/粘贴的两条规则是错误的,您应该只考虑:

中考虑了静态声明和静态块初始化 它们在源文件中的显示顺序

因此,您可以修复问题,更改声明顺序和静态初始化块:

public class ClearingDoubtsAboutStatic {

    static
    {
        System.out.println("Static Block1 Output: "+ClearingDoubtsAboutStatic.statVar);  //------Line 5
        statVar=20;  //-----Line 6
        System.out.println("Static Block1 Output: "+ClearingDoubtsAboutStatic.statVar); //------Line 7
        System.out.println("Static Block1 Output: "+statVar); //---Line 8

    }

    static int statVar=30;

    public static void main(String[] args) {

    }
}

我不太确定您的情况,但在我的IntelliJ中,当我尝试您的代码时,我得到了以下信息:

static int statVar=30;

static
{
    System.out.println("Static Block1 Output: "+ statVar);  //------Line 5
    statVar=20;  //-----Line 6
    System.out.println("Static Block1 Output: "+ statVar); //------Line 7
    System.out.println("Static Block1 Output: "+statVar); //---Line 8

}

嗯,我不确定,但我会和你分享我的猜测。初始化首先对类中的所有静态对象启动(按定义的顺序)。因此,您的
static{…}
将首先初始化,然后
statVar
将接收其值。第一次打印应显示0,因为这是默认的int值。它之所以能够工作,是因为您正在按类名引用它,而静态变量也应该这样引用。类有一个静态变量,而不是对象。当您尝试在没有类名的情况下引用它时,您将其视为类中的某个字段,并且在定义这些字段之前不应尝试引用它们。所以编译器不允许这样做。

我完全明白了,我的问题完全不同。我不想修改我的代码,我只是想了解为什么会发生这种情况。我需要回答问题的最后一段是的,但我需要背后的原因。我真的不理解逻辑“你可以在没有类名的情况下修改静态变量,但是你不能打印它”。那么你怎么可以在不使用第6行的类名的情况下修改静态变量的值呢?我猜这是因为你只是给了它一些起始值,初始化它。当您在带有
+
运算符的
System.out.println
中使用它时,它必须与字符串连接,因此需要进行一些转换。有人能回答这个问题吗?
Error:(9, 55) java: illegal forward reference