您的位置:首页 > 职场人生

Java面试题之JVM相关

2016-08-04 21:52 337 查看
提出问题
一道很坑的面试题,但是对理解JVM很有帮助???

解决问题
例一:

package com.evada.de;

class Singleton{

    private static Singleton singleton = new Singleton();
    public static int counter1;
    public static long counter2 = 0;

    private Singleton(){
        counter1 ++;
        counter2 ++;
    }

    public static Singleton getInstance(){
        return singleton;
    }
}

/**
* Created by Ay on 2016/5/24.
*/
public class LambdaTest {

    public static void main(String[] args) throws Exception{
        Singleton singleton = Singleton.getInstance();
        System.out.println("counter1 :" + Singleton.counter1);
        System.out.println("counter2 :" + Singleton.counter2);
    }
}
运行结果:

counter1 :1
counter2 :0
解释:

从main函数开始,根据JVM对类的加载机制,Singleton.getInstance()主动使用,会触发类的加载,首先会为类的静态变量赋予初始值(程序从上到下执行),
即:Singleton singleton = null,counter1 = 0,counter2 = 0.

然后会进行类的初始化,即singleton = new Singleton(),会触发构造函数,执行:
    counter1 ++;
    counter2 ++;

    counter1 = 1,
    counter2 = 1

最后,类在初始化后,为类的静态变量赋予正确的初始值,为用户赋予的正确值(从上到下)
即:

    public static int counter1;//无用户赋值
    public static long counter2 = 0;//用户赋予初始值0
最终结果:
    counter1 :1
    counter2 :0
例二:

package com.evada.de;

class Singleton{

    public static int counter1;
    public static long counter2 = 0;
    private static Singleton singleton = new Singleton();

    private Singleton(){
        counter1 ++;
        counter2 ++;
    }

    public static Singleton getInstance(){
        return singleton;
    }
}

/**
* Created by Ay on 2016/5/24.
*/
public class LambdaTest {

    public static void main(String[] args) throws Exception{
        Singleton singleton = Singleton.getInstance();
        System.out.println("counter1 :" + Singleton.counter1);
        System.out.println("counter2 :" + Singleton.counter2);
    }
}
运行结果

counter1 :1
counter2 :1
解释:

从main函数开始,根据JVM对类的加载机制,Singleton.getInstance()主动使用,会触发类的加载,首先会为类的静态变量赋予初始值(程序从上到下执行),
即:Singleton singleton = null,counter1 = 0,counter2 = 0.

然后会进行类的初始化,即
    public static int counter1;//无用户赋值
    public static long counter2 = 0;//用户赋予初始值0

    counter1 = 0,
    counter2 = 0    

singleton = new
Singleton(),会触发构造函数,执行:
counter1 ++;
counter2 ++;

最终结果:
    counter1 :1
    counter2 :1

转载自:http://bbs.jointforce.com/topic/17882
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jvm