Java 在声明之前,我可以访问静态块中的静态字段吗?

Java 在声明之前,我可以访问静态块中的静态字段吗?,java,static,static-block,Java,Static,Static Block,我对下面的代码感到困惑,我希望它会给出一个错误或答案是10,但它会给出20,如何 public class test { public static void main(String[] args) { System.out.println(x); } static{ x=10; } static int x=20; } 在静态中,如果某个值更改一次,则会影响整个输出。 所以你得到了20分 如果你这样写 public

我对下面的代码感到困惑,我希望它会给出一个错误或答案是10,但它会给出20,如何

public class test {
    public static void main(String[] args) {
        System.out.println(x);
    }

    static{
        x=10;
    }

    static int x=20;
}

在静态中,如果某个值更改一次,则会影响整个输出。 所以你得到了20分

如果你这样写

public class test {
      static int x=20;

 public static void main(String[] args) {
 System.out.println(x);
            }
static{
x=10;
 }
  }

然后,它将以静态方式打印10。

如果某个值更改一次,则会影响输出。 所以你得到了20分

如果你这样写

public class test {
      static int x=20;

 public static void main(String[] args) {
 System.out.println(x);
            }
static{
x=10;
 }
  }
然后它将打印10。

它在中指定,其中给出了类初始化的详细信息:

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

变量初始值设定项(
x=20
)出现在程序文本中静态初始值设定项(包含
x=10
的块)之后。因此,初始化结束时的值为20

如果您交换顺序,使变量初始值设定项先出现,您将看到10

我强烈建议您尽可能避免编写依赖于文本顺序的代码

编辑:变量仍然可以在静态初始值设定项中使用,因为它在作用域中-就像您可以在声明早于变量的方法中使用实例变量一样。但是,在这方面有一些限制:

仅当成员是类或接口C的实例(分别为静态)字段且满足以下所有条件时,成员声明才需要在使用前以文本形式出现:

  • 该用法出现在C的实例(分别为静态)变量初始值设定项或C的实例(分别为静态)初始值设定项中

  • 用法不在作业的左侧

  • 用法是通过一个简单的名称

  • C是包含用法的最内层类或接口

如果以上四个要求中的任何一个未得到满足,则是编译时错误

因此,如果将静态初始值设定项更改为:

static {
    System.out.println(x);
}
然后你会得到一个错误

您现有的静态初始值设定项以符合所有限制的方式使用
x

中指定了它,其中提供了类初始化的详细信息:

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

变量初始值设定项(
x=20
)出现在程序文本中静态初始值设定项(包含
x=10
的块)之后。因此,初始化结束时的值为20

如果您交换顺序,使变量初始值设定项先出现,您将看到10

我强烈建议您尽可能避免编写依赖于文本顺序的代码

编辑:变量仍然可以在静态初始值设定项中使用,因为它在作用域中-就像您可以在声明早于变量的方法中使用实例变量一样。但是,在这方面有一些限制:

仅当成员是类或接口C的实例(分别为静态)字段且满足以下所有条件时,成员声明才需要在使用前以文本形式出现:

  • 该用法出现在C的实例(分别为静态)变量初始值设定项或C的实例(分别为静态)初始值设定项中

  • 用法不在作业的左侧

  • 用法是通过一个简单的名称

  • C是包含用法的最内层类或接口

如果以上四个要求中的任何一个未得到满足,则是编译时错误

因此,如果将静态初始值设定项更改为:

static {
    System.out.println(x);
}
然后你会得到一个错误


您现有的静态初始值设定项以符合所有限制的方式使用
x
,但是。

首先执行哪一行。如果是静态块,则应给出错误bcoz x未声明首先执行哪一行。如果是静态块,则应给出错误bcoz x未声明。我猜OP甚至在声明静态块字段之前就对如何访问该字段感到困惑。如果需要,你可以把我的答案合并成这个。我会删除我的。:)@RohitJain:哎呀,我在编辑的时候没有看到你的评论。但我采取了一种稍微不同的方法,展示了一个它无效的示例。我猜OP甚至在声明静态块之前就对如何访问静态块中的字段感到困惑。如果您愿意,可以将我的答案合并到这个示例中。我会删除我的。:)@RohitJain:哎呀,我在编辑的时候没有看到你的评论。但我采取了一种稍微不同的方法,给出了一个它无效的例子。