gpt4 book ai didi

java - 在Java中,main方法之后的那些语句的初始化顺序是什么

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:33:10 25 4
gpt4 key购买 nike

我了解到初始化顺序的原则是:

  1. 父类(super class)优先(在这种情况下不在这里讨论)
  2. 按出现顺序的静态变量声明和静态初始化 block
  3. 按出现顺序的实例变量声明和静态初始化 block
  4. 构造函数

但我仍然对这段代码的输出感到困惑:

public class Test1 {

static {
add(2);
}

static void add (int num) {
System.out.println(num + " ");
}

public Test1() {
add(5);
System.out.println("Constructor!");
}

static {
add(4);
}

{
add(6);
}

static {
new Test1();
}

{
add(8);
}

public static void main(String[] args) {
System.out.println("Main method!");
add(10);
}

{
add(11);
}
static {
add(12);
}
}

结果是:

2 
4
6
8
11
5
Constructor!
12
Main method!
10

如果没有add(10)的语句;添加(11);添加(12);我完全可以理解。您能否解释一下这 3 个语句的初始化顺序?

最佳答案

1) 没有如下名称的 block 称为“Instance Initializer”,只有在创建新对象时才会调用它,例如 DefaultConstructor 或 noArg Constructor。

{
add(11);
}

2) 在上面的代码中,您有静态 block (首先在类加载本身调用)、实例初始化器(在创建对象时调用)、显式 DefaultConstructor(在创建对象时调用但始终记住实例初始化程序优先)和最后一个 Main 方法.

3) 现在让我们分析你的代码,

第一次通话:

static 
{
add(2); //print 2
}

第二次通话:

static {
add(4); // print 4
}

第三次通话:

static {
new Test1();
// Here Object is getting created so all Instance Initialzer will be called first in a sequential manner.
}

第四次调用:

{
add(6); // print 6
}

第 5 次调用:

{
add(8); // print 8
}

第 6 次调用:

{
add(11); // print 11
}

第 7 次调用:在实例初始化器之后,将调用显式默认构造函数。

public Test1() {
add(5); // print 5
System.out.println("Constructor!"); // print Constructor!
}

第 8 次调用:再次调用最后一个静态 block 。

static {
add(12); // print 12
}

第9次调用最后会调用main方法

public static void main(String[] args) {
System.out.println("Main method!"); // print Main method!
add(10); // print 10
}

关于java - 在Java中,main方法之后的那些语句的初始化顺序是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43154736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com