shin8085 2020-09-21 12:30 采纳率: 50%
浏览 149
已采纳

关于静态代码块、构造代码块和构造函数的执行顺序

为什么下面两段代码中静态代码块、构造代码块和构造函数的执行顺序完全不一样呢?

public class test3 {
    public static test3 t1=new test3();
    public test3(){
        System.out.println("A");
    }
    {
        System.out.println("B");
    }
    static
    {
        System.out.println("C");
    }
    public static void main(String [] args){
        //test3 t2=new test3();
    }
}

图片说明

public class test3 {
    //public static test3 t1=new test3();
    public test3(){
        System.out.println("A");
    }
    {
        System.out.println("B");
    }
    static
    {
        System.out.println("C");
    }
    public static void main(String [] args){
        test3 t2=new test3();
    }
}

图片说明

  • 写回答

2条回答 默认 最新

  • 王二小丷 2020-09-21 15:17
    关注

    总体来说

    1.静态成员跟随类一起加载且只加载一遍,普通成员在创建对象时执行,所以静态的优先于普通的,无论是变量还是方法块
    2.同类看书写先后顺序
    3.构造代码块优先于构造方法执行(如果你反编译class文件可以发现构造代码块是被合并到构造方法里并位于最前面的)
    

    所以第一个大致顺序如下

    1.JVM加载类,同时存在静态变量和静态代码块,但静态变量 t1写在前面优先执行,即执行创建新对象操作
    2.创建新对象,存在构造代码块,执行,打印 B
    3.执行构造方法,打印 A
    4.静态变量赋值操作完成,执行静态代码块,打印 C
    

    第二个大致顺序如下

    1.加载类,存在静态代码块,执行,打印 C
    2.执行main方法,创建新对象,存在构造代码块,执行,打印 B
    3.执行构造方法,执行,打印 A
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已采纳回答 5月23日

悬赏问题

  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大
  • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端