Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的执行顺序_Java_Order Of Execution - Fatal编程技术网

Java中的执行顺序

Java中的执行顺序,java,order-of-execution,Java,Order Of Execution,我试图理解: 正如我从Java语言规范中了解到的,执行顺序从加载包含main方法的类开始。然后必须初始化该类的所有静态变量和成员变量(在此之前,必须初始化超类的所有成员变量,尽管在这种情况下没有这些变量) 所以我认为b,c,l将在main开始执行之前初始化。但从输出来看,情况似乎并非如此。我遗漏了什么吗?不,b和c是实例变量 没有包含main的类的自动实例化。只初始化静态变量。就好像有个外线电话的人写道: Sandwich.main(args); 所以当你写的时候: 然后必须初始化该类的所有静

我试图理解:

正如我从Java语言规范中了解到的,执行顺序从加载包含main方法的类开始。然后必须初始化该类的所有静态变量和成员变量(在此之前,必须初始化超类的所有成员变量,尽管在这种情况下没有这些变量)


所以我认为
b
c
l
将在
main
开始执行之前初始化。但从输出来看,情况似乎并非如此。我遗漏了什么吗?

不,
b
c
是实例变量

没有包含
main
的类的自动实例化。只初始化静态变量。就好像有个外线电话的人写道:

Sandwich.main(args);
所以当你写的时候:

然后必须初始化该类的所有静态变量和成员变量


。。。那是错误的。仅初始化静态变量-与正常情况一样。

示例输出是正确的。以下是重要的规则:

  • 创建类时,必须首先调用超类的构造函数。这会冒泡到
    对象

  • 在调用构造函数之前,将调用成员变量初始化

本例中不涉及任何
静态
s,除了技术
监视器

类或接口类型T将在第一次出现以下任一情况之前立即初始化:

  • T是一个类,并且创建了T的一个实例
  • T是一个类,调用由T声明的静态方法
  • 分配了一个由T声明的静态字段
  • 使用由T声明的静态字段,该字段不是常量 变量(§4.12.4)
  • T是顶级类(§7.6)和断言语句(§14.10) 执行T(§8.1.3)中的词汇嵌套

每当创建一个新的类实例时,都会为其分配内存空间,并为该类类型中声明的所有实例变量和该类类型的每个超类中声明的所有实例变量留出空间,包括所有可能隐藏的实例变量(§8.3)


谢谢乔恩的回答。这就是我在JLS中读到的内容(它说所有的类变量都是初始化的,而不仅仅是静态的):在我们接下来的示例中,Java虚拟机仍在尝试执行类测试的main方法。仅当类已初始化(§12.4.1)时才允许这样做。初始化包括按文本顺序执行任何类变量初始值设定项和类测试的静态初始值设定项。但在初始化测试之前,必须递归地初始化它的直接超类,以及它的直接超类的直接超类,以此类推。请参阅“类变量是在类声明(§8.3.1.1)中使用关键字static声明的字段,或在接口声明(§9.3)中使用或不使用关键字static声明的字段。”抱歉,我感到困惑。如果“class variable”==“static variable”,为什么会说“class variable initializer and static initializer”?甚至在本书的前面,作者说“变量在任何方法都可以被调用之前就被初始化了,甚至在构造函数调用之前”,这里的示例中没有静态:@Jin:这是在调用构造函数的上下文中。
Sandwich.main(args);