Onelong

分享知识,与你一起进步......
RSS icon Home icon
  • java类加载原理探究

    post by onelong / 2011-11-14 0:23 Monday [java]

    以下是我改动过的代码:大家想一想:下面的代码输出的结果是什么呢?1,1?0,0?

    class Singleton

    {

    public static Singleton singleton = new Singleton();

    public static int a;

    public static int b = 0;

    private Singleton()

    {

    a++;

    b++;

    System.out.println(a+" "+b);

    }

     

    public static Singleton GetInstence()

    {

    return singleton;

    }

    }

    public class MyTest

    {

    public static void main(String[] args)

    {

    Singleton mysingleton = Singleton.GetInstence();

    System.out.println(Singleton.a+" "+Singleton.b);

    }

    }

    运行结果是:

    点击查看原图

    看到这个结果,大家也许会想,jvm有bug?其实不然的。看看加粗的字段,留意他们的顺序!

    再改动一下代码啦:

     

    class Singleton

    {

    public static int a;

    public static int b = 0;

    public static Singleton singleton = new Singleton();

     

    private Singleton()

    {

    a++;

    b++;

    System.out.println(a+" "+b);

    }

     

    public static Singleton GetInstence()

    {

    return singleton;

    }

    }

     

    public class MyTest

    {

    public static void main(String[] args)

    {

    Singleton mysingleton = Singleton.GetInstence();

    System.out.println(Singleton.a+" "+Singleton.b);

    }

    }

    运行结果是:

    点击查看原图

    为什么会这样呢?如果你了解过类加载原理的话,估计你很容易在这个现象找到你要答案的!具体原因不解释了!看下面提到的网址吧!

     

    最近在看《深入理解java虚拟机》时,无意中浏览了一个网页!网址:http://webservices.ctocio.com.cn/389/12081889.shtml

    具体的内存我就不复制了!里面对java类加载的探究方法很多意思!

    通过这篇文章,我们可以知道java各种成员初始化的时机。对此我还专门装了一个flash builder 4来测试一下avm,结果发现,都是一样的结果。由此可见jvm和avm的类加载机制是差不多的!我在c#的是不是也是这样的呢?最后还是没去试一试,谁有空就去试一试吧!

    到此,其实我想传递的信息不是jvm的类加载原理,而是走出java去了解语言。带着探究的思维去编程,也许IT民工也可以很快乐!

    多言了!欢迎提出不同见解啦!!

    标签: 虚拟机 java
    引用地址:
     

    我要评论