一条经典的JVM类加载的面试题class Singleton{ static Singleton instance = new Singleton() ; private Singleton(){}

导读:本篇文章讲解 一条经典的JVM类加载的面试题class Singleton{ static Singleton instance = new Singleton() ; private Singleton(){},希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一、题目

几乎同样的代码,有这样两种情况:

情况一:new SingleTon()在后面,得到的结果是:count1 = 1和count2 = 1

一条经典的JVM类加载的面试题class Singleton{ static Singleton instance = new Singleton() ; private Singleton(){}

情况二:new SingleTon()在前面,得到的结果是:count1 = 1和count2 = 0

一条经典的JVM类加载的面试题class Singleton{ static Singleton instance = new Singleton() ; private Singleton(){}

 【问】请简述一下,这两种情况的输出结果为什么会不同?

二、分析

这里主要涉及到的知识是,JVM的类加载机制。

1、类的生命周期:加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载,而验证,准备和解析又可以归为连接阶段。

2、当调用类中的静态方法getSingleTon()时,会触发类的初始化。

(1)对于情况一:

一条经典的JVM类加载的面试题class Singleton{ static Singleton instance = new Singleton() ; private Singleton(){}

1) 连接阶段,会为静态变量赋初始值,这时count1=0,count2=0;

2)然后初始化阶段,代码从上到下执行,赋值操作和静态代码块,这时count1=0,count2=0;

创建对象SingleTon后,对count1和count2进行++,最后count1=1,count2=1。

(2)对于情况二:

一条经典的JVM类加载的面试题class Singleton{ static Singleton instance = new Singleton() ; private Singleton(){}

1)连接阶段,同样是静态变量赋初始值,这时同样count1=0,count2=0;

2)初始化阶段,从上而下执行代码,先创建对象,对count1和count2进行++,这时count1=1,count2=1;然后 public static int  count1对count1是没赋值的,这时count1还是等于1,但是count2赋值了0,这时count2=0,所以最后的输出结果count1=1,count2=0


【代码】

class SingleTon{
    private static SingleTon singleTon = new SingleTon();
    public static int  count1;
    public static int  count2 = 0;

    private SingleTon(){
        count1++;
        count2++;
    }
    public static  SingleTon getSingleTon(){
        return singleTon;
    }
}

public class ClassLoaderTest {
    public static void main(String[] args) {
        SingleTon.getSingleTon();
        System.out.println("count1 = "+ SingleTon.count1);
        System.out.println("count2 = "+ SingleTon.count2);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/117648.html

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!