号称是世界上所有的Java程序员都会犯的错误

来源:互联网 发布:乐知英语在哪里 编辑:程序博客网 时间:2024/04/30 08:07
package test01;          class Singleton {              public static Singleton singleton = new Singleton();         public static int a;         public static int b = 0;              private Singleton() {             super();             a++;             b++;         }              public static Singleton GetInstence() {             return singleton;         }          }          public class MyTest {              /**         * @param args         */       public static void main(String[] args) {             Singleton mysingleton = Singleton.GetInstence();             System.out.println(mysingleton.a);             System.out.println(mysingleton.b);         }          }

一般不假思索的结论就是,a=1,b=1。给出的原因是:a、b都是静态变量,在构造函数调用的时候已经对a和b都加1了。答案就都是1。但是运行完后答案却是a=1,b=0。

如果稍稍调整下代码的位置如下:

    public static int a;         public static int b = 0;
<pre name="code" class="java" style="color: rgb(68, 68, 68); font-size: 14px; line-height: 28px;"> public static Singleton singleton = new Singleton(); 

效果就是刚才预期的a=1,b=1。

为什么呢,这3句无非就是静态变量的声明、初始化,值的变化和声明的顺序还有关系吗?Java不是面向对象的吗?怎么和结构化的语言似地,顺序还有关系。这个就是和Java虚拟机JVM加载类的原理有着直接的关系。

详细原因讲解猛戳我的博文http://blog.csdn.net/jdfkldjlkjdl/article/details/41623295


0 0