服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

一个奇怪的问题


  朋友, 你对java很熟吗? 来看看下面这段代码, 心里运行一次, 看看它的执行结果是什么?
  class singleton
  {
   private static singleton obj = new singleton();
   public static int counter1;
   public static int counter2 = 0;
  
   private singleton()
   {
   counter1++;
   counter2++;
   }
  
   public static singleton getinstance()
   {
   return obj;
   }
  }
  
  // 程序2
  public class mymain
  {
   public static void main(string[] args)
   {
   singleton obj = singleton.getinstance();
   system.out.println("obj.counter1=="+obj.counter1);
   system.out.println("obj.counter2=="+obj.counter2);
   }
  }
  想出来结果了吗? 那你把这段程序编译运行一下, 看看是不是你想的答案?
  
  原理是这样的: java在编译以后, 对静态变量并不马上进行赋值操作, 所以, 当你new一个实例的时候, counter1和counter2都被赋值为1(你用单步跟踪一次就可以知道了), 这时候, 关键的问题在于 private static singleton obj = new singleton(); 这条语句是在counter2的赋值之前. 因此, 当生成singleton类的实例后, 也就是说构造器被执行之后, 才会去执行public static int count2=0, 这时候counter2又被清0了, 所以, 答案就是屏幕上输出:
  obj.counter1==1
  obj.counter2==0

扫描关注微信公众号