Java 在静态成员中是否有任何要执行的命令?

Java 在静态成员中是否有任何要执行的命令?,java,static,Java,Static,我执行了下面的代码,看到结果后感到很奇怪 public class Example3 { //section 01 static int a =checker(); //section 02 static{ System.out.println("inside the block"); } //section 03 public static int checker(){ System.out.pri

我执行了下面的代码,看到结果后感到很奇怪

 public class Example3 {

    //section 01
    static int a =checker();

    //section 02
    static{
        System.out.println("inside the block");
    }

    //section 03
    public static int checker(){
        System.out.println("from checker");
        return 20;
    }

    //section 04
    public static void main(String[] args) {
        System.out.println(a);
        System.out.println("from main");
    }
}
预期产出

from checker
20
from main
from checker
inside the block
20
from main
实际产出

from checker
20
from main
from checker
inside the block
20
from main
我将代码分成4个部分,如第01节…等来解释这个问题

当我们启动java程序时,我们从主方法开始。所以在主要方法中有以下几种

System.out.println(a);  //step 01
System.out.println("from main"); //step 02
在主要方法中有两个步骤。我将在下面解释我的想法

步骤01

  • 转到第01节
  • 然后进入检查方法(第03节)
  • 然后打印“来自检查器”
  • 然后,现在“a”将获取检查器的返回值 方法(a=20)
  • 现在,步骤01已完成

    步骤02

  • 将从主屏幕打印
  • 我的问题是如何在块内额外打印

    当我们启动java程序时,我们从主方法开始

    不,我们不是。包含
    main
    函数的类仍然是Java类。因此,它必须首先由类加载器加载和初始化,因此流为:

  • 在内存中加载该类
  • 按照静态初始化在文件中发生的顺序处理静态初始化,因此:

  • a
    变量=>从检查器打印
  • 静态块=>在块内部打印
  • 将控件传递给main函数,实际打印最后2个字符串

  • 当我们启动java程序时,我们从主方法开始

    不,我们不是。包含
    main
    函数的类仍然是Java类。因此,它必须首先由类加载器加载和初始化,因此流为:

  • 在内存中加载该类
  • 按照静态初始化在文件中发生的顺序处理静态初始化,因此:

  • a
    变量=>从检查器打印
  • 静态块=>在块内部打印
  • 将控件传递给main函数,实际打印最后2个字符串


  • 阅读这里的第一个答案:-如果这不能回答您的问题,请澄清它。您有一个静态初始值设定项块,它打印出一些内容(“在块内”)。你为什么不期待这个结果?它必须在某处某时打印出来!关于电话的顺序。。。请看@ernest_k的链接问题。@Seelenvirtuose上述代码的流程如何?如果你能给我一个答案,这对我会很有帮助。这能回答你的问题吗?阅读这里的第一个答案:-如果这不能回答您的问题,请澄清它。您有一个静态初始值设定项块,它打印出一些内容(“在块内”)。你为什么不期待这个结果?它必须在某处某时打印出来!关于电话的顺序。。。请看@ernest_k的链接问题。@Seelenvirtuose上述代码的流程如何?如果你能给我一个答案,这对我会很有帮助。这能回答你的问题吗?