丁丁啦 2020-12-05 07:59 采纳率: 25%
浏览 22
已结题

类加载的时候静态代码块和构造函数执行顺序,附代码,求看看

public class SingletonTest {
    public static void main(String[] args) {
        SingletonT1.getInstance();
        SingletonT2.getInstance();
    }
}

class SingletonT1 {
    private static SingletonT1 instance = new SingletonT1();

    static {
        System.out.println("静态代码块1");
    }

    private SingletonT1 () {
        System.out.println("构造方法1");
    }

    public static SingletonT1 getInstance() {
        System.out.println("创建方法1");
        return instance;
    }
}

class SingletonT2 {
    private static SingletonT2 instance;
    static {
        System.out.println("静态代码块2");
        instance = new SingletonT2();
    }

    private SingletonT2() {
        System.out.println("构造函数2");
    }

    public static SingletonT2 getInstance() {
        System.out.println("创建方法2");
        return instance;
    }
}
构造方法1
静态代码块1
创建方法1
静态代码块2
构造函数2
创建方法2

以上是代码以及输出,不是说静态代码块是在构造函数之前执行的吗,为什么Singleton1是反的,小白,勿喷,真心求解

  • 写回答

5条回答 默认 最新

  • 胖到没有朋友 2020-12-05 10:17
    关注

    我觉得执行顺序是对的,也并不代表是反的,java初始化的时候先初始化静态变量,你静态变量需要去创建一个对象,难道我还应该不给你创建这个对象,先去执行这个类的静态代码块吗?万一你等下要用怎么办?你的SingletonT2里面,把创建和打印的语句顺序调换一下打印的也是先打印构造方法2.你难道说先执行的就是构造方法吗?这不是你在静态代码中调用的创建对象的。翻过来看SingletonT1 你也是先创建的对象啊。如果真的严格按照你说的那个顺序,那是不是就意味着你静态代码块中就已经不能使用这个类了?

     

    评论

报告相同问题?

悬赏问题

  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决