黑马程序员技术交流社区

标题: 同一个问题,不一样的看法!关于静态代码块和单例 [打印本页]

作者: jsfjb    时间: 2012-10-31 09:24
标题: 同一个问题,不一样的看法!关于静态代码块和单例
  1. class Demo {
  2.         {
  3.                 System.out.println("1.构造块。");// 定义构造块
  4.         }

  5.         static {
  6.                 System.out.println("0.静态代码块。");// 定义静态代码块
  7.         }

  8.         public Demo() {
  9.                 System.out.println("2.构造方法。");// 定义构造方法
  10.         }
  11. }

  12. class CodeDemo {
  13.         static {
  14.                 System.out.println("在main方法中定义的静态代码块。");// 在main方法中定义静态代码块
  15.         }

  16.         public static void main(String[] args) {
  17.                 new Demo();// 实例化对象
  18.                 new Demo();// 实例化对象
  19.                 new Demo();// 实例化对象
  20.         }
  21. }

  22. 这道题是前面的一个同学的题,由他的这道题我先到的新的问题和思考。
  23. 上面代码的运行结果是:
  24. 在main方法中定义的静态代码块。
  25. 0.静态代码块。
  26. 1.构造块。
  27. 2.构造方法。
  28. 1.构造块。
  29. 2.构造方法。
  30. 1.构造块。
  31. 2.构造方法。


  32. 说明先执行静态代码块,再执行构造块,再执行构造方法。
  33. 关键是:<font color="Red">静态代码块只执行一次,这样的话,我们在做单例模式的时候,就可以考虑把初始化单列的代码放在静态代码块中了</font>。这样就可以更加安全,但是我又再想,这个东西和锁有关系吗?并且大家认为,把初始化单例放在静态代码块中好不好?有点小迷惑。


复制代码

作者: 林晓泉    时间: 2012-10-31 09:39
本帖最后由 林晓泉 于 2012-10-31 09:48 编辑
  1. class Demo {

  2.   static Demo d = null;
  3.         {

  4.                 System.out.println("1.构造块。");// 定义构造块
  5.      

  6.         }
  7.   public static Demo getDemo()
  8. {
  9.    return d;
  10. }
  11.          static {

  12.                 System.out.println("0.静态代码块。");// 定义静态代码块
  13.     d = new Demo();
  14.         }
  15.      private Demo() {

  16.                 System.out.println("2.构造方法。");// 定义构造方法

  17.         }
  18.   int x=9;
  19. }
  20. class CodeDemo {

  21.         static {

  22.                 System.out.println("在main方法中定义的静态代码块。");// 在main方法中定义静态代码块

  23.         }
  24.          public static void main(String[] args) {

  25.                 //new Demo();// 实例化对象

  26.                // new Demo();// 实例化对象

  27.                 //new Demo();// 实例化对象
  28.     Demo d = Demo.getDemo();
  29.     Demo d1 = Demo.getDemo();
  30.     Demo d2 = Demo.getDemo();
  31.     Demo d3 = Demo.getDemo();
  32.     System.out.print(d.x+".."+d1.x+".."+d2.x+".."+d3.x+"..");

  33.         }

  34. }
复制代码
可以了,我改的代码 ,不过感觉和饿汉差不多

作者: jsfjb    时间: 2012-10-31 10:02
林晓泉 发表于 2012-10-31 09:39
可以了,我改的代码 ,不过感觉和饿汉差不多

这儿貌似是不要考虑一下锁的问题,和安全性的,问题。考虑多一点。代码就更加健壮一点。哈哈:lol




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