黑马程序员技术交流社区

标题: 静态初始化 [打印本页]

作者: 肖博    时间: 2013-8-11 19:51
标题: 静态初始化
本帖最后由 肖博 于 2013-8-12 12:54 编辑

今天看了下静态初始化的帖子,有些疑问?
class StaticDemo {
        public static void main(String[] args) {
               
                Demo1 d = Demo1.getInstance();

                System.out.println(d.count1+"......."+d.count2);
        }

}
class Demo1{
            private static Demo1 d = new Demo1();
        public static int count1=5;
        public static int count2=6;
        private Demo1(){
                System.out.println(count1+"...构造函数前..."+count2);
                count1++;
                count2++;
                System.out.println(count1+"...构造函数后..."+count2);
        }
               
        static{
                System.out.println(count1+"...静态代码块前..."+count2);
                count1++;
                count2++;
                System.out.println(count1+"...静态代码块后..."+count2);
        }
        private static Demo1 h = new Demo1();
        
        public static Demo1 getInstance(){               
                                return d ;
        }
}
结果为
0...构造函数前...0
1...构造函数后...1
5...静态代码块前...6
6...静态代码块后...7
6...构造函数前...7
7...构造函数后...8
7.......8



为什么创建对象位置不同,初始化方式也不同?
作者: 神之梦    时间: 2013-8-11 20:37
今天这是神马情况,这么多问静态的,jvm加载的时候对静态的顺序有关系
作者: 李江    时间: 2013-8-11 21:20
  1. /*
  2. Java静态变量初始化遵循以下规则:
  3. 静态变量会按照声明的顺序先依次声明并设置为该类型的默认值,但不赋值为初始化的值.
  4. 声明完毕后,再按声明的顺序依次设置为初始化的值,如果没有初始化的值就跳过.
  5. */
  6. class StaticDemo {
  7.         public static void main(String[] args) {
  8.                
  9.                 Demo1 d = Demo1.getInstance();

  10.                 System.out.println(d.count1+"......."+d.count2);
  11.         }

  12. }
  13. class Demo1{
  14.         //private static Demo1 d = new Demo1();  
  15.                 /*在此处,new Demo1,有规则知,内存在还没有对count1,count2初始化,所以默认值为0;
  16.                         所以:打印:
  17.                         0...构造函数前...0
  18.                         1...构造函数后...1
  19.                 接着初始化count1和count2为5和6
  20.                 执行static
  21.                 {
  22.                 }中的代码打印出
  23.                         5...静态代码块前...6
  24.                         6...静态代码块后...7
  25.                 然后在执行new Demo1  打印出
  26.                         6...构造函数前...7
  27.                         7...构造函数后...8
  28.                 最后执行main函数中的getInstance()并打印得到结果:
  29.                         7.......8

  30.                 */
  31.         public static int count1=5;
  32.         public static int count2=6;
  33.                 //private static Demo1 d = new Demo1();
  34.                 /*
  35.                 初始化语句在此处
  36.                 此时:
  37.                 count1 count2先初始化 为5 和 6
  38.                 然后 d 初始化
  39.                         5...构造函数前...6
  40.                         6...构造函数后...7
  41.                 执行static区代码
  42.                         6...静态代码块前...7
  43.                         7...静态代码块后...8
  44.                 h初始化
  45.                         7...构造函数前...8
  46.                         8...构造函数后...9
  47.                 最后main方法中的代码执行
  48.                         8.......9
  49.                 */
  50.                
  51.         private Demo1(){
  52.                 System.out.println(count1+"...构造函数前..."+count2);
  53.                 count1++;
  54.                 count2++;
  55.                 System.out.println(count1+"...构造函数后..."+count2);
  56.         }
  57.                
  58.         static{
  59.                 System.out.println(count1+"...静态代码块前..."+count2);
  60.                 count1++;
  61.                 count2++;
  62.                 System.out.println(count1+"...静态代码块后..."+count2);
  63.         }
  64.         private static Demo1 h = new Demo1();
  65.         
  66.         public static Demo1 getInstance(){               
  67.                                 return d ;
  68.         }
  69. }
复制代码
你试着看分析其他情况,希望能帮到你。
作者: ☆今☆    时间: 2013-8-12 00:16
jvm加载静态的时候,有多个跟静态有关的变量,对象,静态代码块时,是按代码的顺序执行的。对象创建在前,就先初始化静态对象,并调用构造函数。在后面就后初始化。
作者: 肖博    时间: 2013-8-12 16:36
感谢啊{:soso_e113:},继续奋斗啊




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