现在的位置: 首页 > 综合 > 正文

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

2018年05月19日 ⁄ 综合 ⁄ 共 840字 ⁄ 字号 评论关闭
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


抱歉!评论已关闭.