隔壁王健喜儿 2023-05-05 16:01 采纳率: 96%
浏览 10
已结题

关于Java静态变量初始化的问题

源代码:

class Bowl {
    Bowl(int i) {
        System.out.println("Bowl(" + i + ")");
    }  //构造器

    void f1(int i) {
        System.out.println("f1(" + i + ")");
    }
}

class Table {
    static Bowl bowl1 = new Bowl(1);  //2、加载Bowl类

    Table() {
        System.out.println("Table()");
        bowl2.f1(1);
    }

    void f2(int i) {
        System.out.println("f2(" + i + ")");
    }

    static Bowl bowl2 = new Bowl(2);
}

class Cupboard {
    Bowl bowl3 = new Bowl(3);
    static Bowl bowl4 = new Bowl(4);

    Cupboard() {
        System.out.println("Cupboard()");
        bowl4.f1(2);
    }

    void f3(int i) {
        System.out.println("f3(" + i + ")");
    }

    static Bowl bowl5 = new Bowl(5);
}

public class StaticInitialization {
    public static void main(String[] args) {
        System.out.println("new Cupboard() in main");
        new Cupboard();
        System.out.println("new Cupboard() in main");
        new Cupboard();   // 创建Cupboard()实例,不进行类加载(每个类只加载一次
        table.f2(1);
        cupboard.f3(1);
    }

    static Table table = new Table();  // 1、创建对象实例,加载Table类,对静态变量进行初始化
    static Cupboard cupboard = new Cupboard();
}

输出:

Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f1(2)
new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
f2(1)
f3(1)

请问代码的执行顺序是什么?

  • 写回答

3条回答 默认 最新

  • zhang_Kylin 2023-05-05 16:16
    关注

    根据静态初始化和实例初始化的规则,代码的执行顺序如下:

    1. 加载 StaticInitialization 类,对 static Table table = new Table();static Cupboard cupboard = new Cupboard(); 进行初始化
    2. 加载 Table 类,对 static Bowl bowl1 = new Bowl(1);static Bowl bowl2 = new Bowl(2); 进行初始化
    3. 加载 Cupboard 类,对 static Bowl bowl4 = new Bowl(4);static Bowl bowl5 = new Bowl(5); 进行初始化
    4. 执行 main 方法

    根据上述执行顺序和每个类中的构造函数和静态变量的初始化顺序,可以解释输出内容如下:

    1. 执行 static Bowl bowl1 = new Bowl(1);,输出 Bowl(1)
    2. 执行 static Bowl bowl2 = new Bowl(2);,输出 Bowl(2)
    3. 执行 static Table table = new Table();,输出 Table()f1(1),因为 Table 的构造函数中有对 bowl2.f1(1) 的调用
    4. 执行 static Bowl bowl4 = new Bowl(4);,输出 Bowl(4)
    5. 执行 static Bowl bowl5 = new Bowl(5);,输出 Bowl(5)
    6. 执行 Bowl bowl3 = new Bowl(3);,输出 Bowl(3)
    7. 执行 Cupboard(),输出 Cupboard()f1(2),因为 Cupboard 的构造函数中有对 bowl4.f1(2) 的调用
    8. 执行 new Cupboard(),输出 Bowl(3)Cupboard()f1(2),因为此时 Cupboard 已经被加载过了,直接创建实例,不会再次加载类
    9. 执行 new Cupboard(),输出 Bowl(3)Cupboard()f1(2),同理
    10. 执行 table.f2(1),输出 f2(1)
    11. 执行 cupboard.f3(1),输出 f3(1)

    因此,最终输出的内容应该是:

    Bowl(1)
    Bowl(2)
    Table()
    f1(1)
    Bowl(4)
    Bowl(5)
    Bowl(3)
    Cupboard()
    f1(2)
    new Cupboard() in main
    Bowl(3)
    Cupboard()
    f1(2)
    new Cupboard() in main
    Bowl(3)
    Cupboard()
    f1(2)
    f2(1)
    f3(1)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月13日
  • 已采纳回答 5月5日
  • 创建了问题 5月5日

悬赏问题

  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计