黑马程序员技术交流社区

标题: 有点诡异的代码。。。 [打印本页]

作者: jackhai9    时间: 2014-8-10 21:26
标题: 有点诡异的代码。。。
本帖最后由 jackhai9 于 2014-8-10 22:01 编辑

大神帮忙分析下这个代码,为什么结果是a=1,b=0?  如果我想输出a=1,b=1,应该怎么改动下?
  1. class Singleton {     
  2.    
  3.     public static Singleton singleton = new Singleton();     
  4.     public static int a;     
  5.     public static int b = 0;     
  6.    
  7.     private Singleton() {     
  8.         super();     
  9.         a++;     
  10.         b++;     
  11.     }     
  12.    
  13.     public static Singleton GetInstence() {     
  14.         return singleton;     
  15.     }         

  16. }     
  17.    
  18. public class MyTest {   
  19.     public static void main(String[] args) {     
  20.         Singleton mysingleton = Singleton.GetInstence();     
  21.         System.out.println(mysingleton.a);     
  22.         System.out.println(mysingleton.b);     
  23.     }     
  24. }
复制代码





作者: そ花痕ゐ蝶梦    时间: 2014-8-10 21:34
貌似看懂
作者: Bule丶    时间: 2014-8-10 21:34
为什么如果b不给初始值0,就变成1,给了就变成0
作者: 喂、借个微笑    时间: 2014-8-10 21:40
public static int b = 0; 改成 public static int b;
作者: Bule丶    时间: 2014-8-10 21:46
我懂了,这是static的原因,当这个类被加载,静态的a和b就被加载了,然后执行的构造函数,a为1,b为1,然后,关键在这里,b做赋值运算了,b就被赋值为0,所以 a1 b0
作者: jackhai9    时间: 2014-8-10 21:52
喂、借个微笑 发表于 2014-8-10 21:40
public static int b = 0; 改成 public static int b;

恩,不过有趣的是
  1. public static Singleton singleton = new Singleton();     
  2.     public static int a;     
  3.     public static int b = 0;
复制代码

变成
  1.     public static int a;     
  2.     public static int b = 0;
  3. public static Singleton singleton = new Singleton();   
复制代码

作者: jackhai9    时间: 2014-8-10 21:57
Bule丶 发表于 2014-8-10 21:46
我懂了,这是static的原因,当这个类被加载,静态的a和b就被加载了,然后执行的构造函数,a为1,b为1,然后 ...

对,关键是执行顺序!
作者: Bule丶    时间: 2014-8-10 22:03
jackhai9 发表于 2014-8-10 21:57
对,关键是执行顺序!

嗯嗯,用static修饰的,不只是int类型,就是String类型的,只要初始赋值了,然后走完构造,还会执行一次定义变量赋值那块
作者: 复仇者联盟    时间: 2014-8-10 22:31
楼主这问题问的太及时了,想过几天面试的,刚看到问题时,我也没搞懂,现在明白了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2