Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.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 JVM执行代码以构建对象的顺序_Java - Fatal编程技术网

Java JVM执行代码以构建对象的顺序

Java JVM执行代码以构建对象的顺序,java,Java,我正在学习Oracle的OCA 8认证。在我的研究中,我遇到了一个问题,它让我对Java对象静态块、构造函数、变量初始化的顺序产生了一些疑问。。。。问题如下: 公共类初始化测试{ 静态串s1=sM1a{ s1=sM1b; } 静止的{ s1=sM1c; } 公共静态字符串参数[]{ InitTest it=新的InitTest; } 私有静态字符串sM1String s{ System.out.printlns;返回s; } } 我的问题是对象每个部分的启动顺序: 1{…} 2静态{…} 3初始

我正在学习Oracle的OCA 8认证。在我的研究中,我遇到了一个问题,它让我对Java对象静态块、构造函数、变量初始化的顺序产生了一些疑问。。。。问题如下:

公共类初始化测试{ 静态串s1=sM1a{ s1=sM1b; } 静止的{ s1=sM1c; } 公共静态字符串参数[]{ InitTest it=新的InitTest; } 私有静态字符串sM1String s{ System.out.printlns;返回s; } } 我的问题是对象每个部分的启动顺序:

1{…}

2静态{…}

3初始化测试{…}

4静态串s1=sM1a

你能解释一下吗?

首先:s1=sM1b的部分格式与s1定义的一部分相同,但完全是分开的

static{…}和static String s1=sM1a都是静态的,这意味着它们在JVM加载类时运行,在主代码中的任何代码之前。它们是按写的顺序执行的

{…}和InitTest{…}不是静态的,它们仅在创建InitTest实例时运行。 {…}在构造函数之前运行。

首先:s1=sM1b的部分格式化为s1定义的一部分,但它是完全独立的

static{…}和static String s1=sM1a都是静态的,这意味着它们在JVM加载类时运行,在主代码中的任何代码之前。它们是按写的顺序执行的

{…}和InitTest{…}不是静态的,它们仅在创建InitTest实例时运行。
{…}并在构造函数之前运行。

任何静态的内容都会首先得到处理,因为没有任何对象可用性的理由,类中可能的静态内容是, 静态实例变量 静态代码块 c.静态方法
虽然静态方法的顺序并不重要,但它们的计算顺序是相同的。因此,在您的例子中,首先计算s1=SM1a,这将导致调用SM1a方法。接下来执行静态代码块,生成sM1c,最后使用sM1b执行实例代码块。如果该类中碰巧有一个无参数构造函数,那么它将作为对象可用之前的最后一步被调用。

由于没有对象可用性的理由,因此首先处理任何静态内容,类中可能的静态内容包括:, 静态实例变量 静态代码块 c.静态方法 虽然静态方法的顺序并不重要,但它们的计算顺序是相同的。因此,在您的例子中,首先计算s1=SM1a,这将导致调用SM1a方法。接下来执行静态代码块,生成sM1c,最后使用sM1b执行实例代码块。如果该类中碰巧有一个无参数构造函数,那么它将作为对象可用之前的最后一步被调用。

初始化顺序始终如下所示:

递归初始化超类与所讨论的示例无关,因为它没有超类 静态字段和静态初始值设定项 实例字段和实例初始值设定项 建设者 因此,示例中的初始化顺序为:

1个静态串s1=sM1a;-静态初始化块和静态字段成员是首先要处理的,这发生在类加载器加载类之后,然后才开始使用该类或创建对象。如果有更多的初始值设定项或静态成员声明,则会按照写入顺序执行它们。这就是为什么这个静态字段将在静态初始值设定项块之前初始化

2静态{…}-在第1点中解释。静态初始化器位于静态变量s1的声明之前,这就是为什么它是按这样的顺序处理的:两个都具有相同的优先级,但在这里,如果两个都具有相同的优先级,则类内部的顺序获胜

3{…}-在静态初始值设定项和静态字段之后,初始化实例初始值设定项和实例字段,因此实例初始值设定项位于静态初始值设定项和静态字段s1之后。当使用构造函数创建新对象时,它们是第一个被处理的对象,而这发生在构造函数实际执行之前

四,。InitTest{…}-在初始化所有初始化块和字段初始化之后调用构造函数

有关类和对象初始化顺序的更多详细信息,请参见Java语言规范:, 初始化顺序始终如下所示:

递归初始化超类与所讨论的示例无关,因为它没有超类 静态字段和静态初始值设定项 实例字段和实例初始值设定项 建设者 因此,示例中的初始化顺序 e将是:

1个静态串s1=sM1a;-静态初始化块和静态字段成员是首先要处理的,这发生在类加载器加载类之后,然后才开始使用该类或创建对象。如果有更多的初始值设定项或静态成员声明,则会按照写入顺序执行它们。这就是为什么这个静态字段将在静态初始值设定项块之前初始化

2静态{…}-在第1点中解释。静态初始化器位于静态变量s1的声明之前,这就是为什么它是按这样的顺序处理的:两个都具有相同的优先级,但在这里,如果两个都具有相同的优先级,则类内部的顺序获胜

3{…}-在静态初始值设定项和静态字段之后,初始化实例初始值设定项和实例字段,因此实例初始值设定项位于静态初始值设定项和静态字段s1之后。当使用构造函数创建新对象时,它们是第一个被处理的对象,而这发生在构造函数实际执行之前

四,。InitTest{…}-在初始化所有初始化块和字段初始化之后调用构造函数

有关类和对象初始化顺序的更多详细信息,请参见Java语言规范:,

您不清楚什么?你需要澄清什么?一个附带问题:编译器错误会在静态字符串处出现吗?@reporter我不这么认为,这是一个有效的代码。无法找到确切的重复,但请查看Java语言规范,然后。第三点指的是什么?看起来您是在引用类本身,还是在调用构造函数时?如果您指的是该类,那么顺序应该是3、4、2、1-解释见Mena提供的JLS链接。您不清楚什么?你需要澄清什么?一个附带问题:编译器错误会在静态字符串处出现吗?@reporter我不这么认为,这是一个有效的代码。无法找到确切的重复,但请查看Java语言规范,然后。第三点指的是什么?看起来您是在引用类本身,还是在调用构造函数时?如果您引用的是该类,那么顺序应该是3、4、2、1-解释见Mena提供的JLS链接。