一段代码看懂JVM类加载过程


prtyaa
prtyaa 2023-12-30 21:25:22 52945 赞同 0 反对 0
分类: 资源
用一段代码看懂JVM类加载过程
public class Singleton {
    private static int x= 0;
    private static int y;
    private static Singleton instance = new Singleton();
    private Singleton(){
        x++;
        y++;
    }
    private static Singleton getInstance(){
        return instance;
    }

    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
        System.out.println(singleton.x);
        System.out.println(singleton.y);
    }
    
}

这是一段单例模式的代码,声明了两个静态变量x赋值0,y没有赋值,那么打印的结果是什么?

 

在连接的阶段,每个变量都会被赋初始值:

x = 0, y = 0, instance = null

跳过解析过程,在类的初始化阶段,会为每个变量赋予正确的值:

x = 0, y = 0, instance = new Singleton()

y没有手动赋值,所以赋值为0

按照顺序的执行方式,new Singleton()会执行构造方法,x和y自增1

所以输出的结果为 x = 1, y = 1.

 

如果调换代码的顺序会输出什么呢?

private static Singleton instance = new Singleton();
private static int x= 0;
private static int y;

还是一样的连接过程,每个变量赋初始值,只是位置改变了:

instance = null,x = 0, y = 0

 

类的初始化阶段,为每个变量正确赋值,因为代码顺序的改变,首先会执行new Singleton()的构造方法,x和y自己自增

x = 1,y =1;

然后再为x正确赋值,

x = 0

由于y没有给定初始值,y的值就是构造函数中得到的值

最终结果:

x = 0, y = 1

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
prtyaaL2
粉丝 1 资源 1949 + 关注 私信
最近热门资源
银河麒麟桌面操作系统备份用户数据  126
统信桌面专业版【全盘安装UOS系统】介绍  121
银河麒麟桌面操作系统安装佳能打印机驱动方法  114
银河麒麟桌面操作系统 V10-SP1用户密码修改  105
最近下载排行榜
银河麒麟桌面操作系统备份用户数据 0
统信桌面专业版【全盘安装UOS系统】介绍 0
银河麒麟桌面操作系统安装佳能打印机驱动方法 0
银河麒麟桌面操作系统 V10-SP1用户密码修改 0
作者收入月榜
1

prtyaa 收益393.62元

2

zlj141319 收益218元

3

1843880570 收益214.2元

4

IT-feng 收益209.03元

5

风晓 收益208.24元

6

777 收益172.71元

7

Fhawking 收益106.6元

8

信创来了 收益105.84元

9

克里斯蒂亚诺诺 收益91.08元

10

技术-小陈 收益79.5元

请使用微信扫码

加入交流群

请使用微信扫一扫!