A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jackhai9 中级黑马   /  2014-8-10 21:26  /  1501 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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. }
复制代码




8 个回复

正序浏览
楼主这问题问的太及时了,想过几天面试的,刚看到问题时,我也没搞懂,现在明白了。
回复 使用道具 举报
jackhai9 发表于 2014-8-10 21:57
对,关键是执行顺序!

嗯嗯,用static修饰的,不只是int类型,就是String类型的,只要初始赋值了,然后走完构造,还会执行一次定义变量赋值那块
回复 使用道具 举报
Bule丶 发表于 2014-8-10 21:46
我懂了,这是static的原因,当这个类被加载,静态的a和b就被加载了,然后执行的构造函数,a为1,b为1,然后 ...

对,关键是执行顺序!
回复 使用道具 举报
喂、借个微笑 发表于 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();   
复制代码
回复 使用道具 举报
我懂了,这是static的原因,当这个类被加载,静态的a和b就被加载了,然后执行的构造函数,a为1,b为1,然后,关键在这里,b做赋值运算了,b就被赋值为0,所以 a1 b0
回复 使用道具 举报
public static int b = 0; 改成 public static int b;
回复 使用道具 举报
为什么如果b不给初始值0,就变成1,给了就变成0
回复 使用道具 举报
貌似看懂
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马