静态代码块和构造器的执行顺序
这段时间在学习ContentProvider,还是不太明白ContentProvider中数据库是什么时候创建的。经过自己测试,实际上是用户真正插入数据的时候生成的数据库。具体代码见下一篇关于ContentProvider中的数据生成时机的随笔。
现在就说下静态代码块和构造器的执行顺序。实例化一个类A的时候(这里用的是new的方式进行实例化),如果A中有static{},即静态代码块,那么肯定先执行代码块里的代码。然后执行非静态代码块,最后才真正执行构造器里的代码。
实例化一个类A的时候的执行顺序,
即:1 . 先执行代码块里的代码;
2 . 然后执行非静态代码块;
3 .最后才真正执行构造器里的代码。
目录结构:
具体测试代码:
Print.java,
1 package com.testStatic; 2 3 public class Print { 4 static{ 5 System.out.println("Print().static{}.....,肯定先执行到我....,比构造器还先执行到..."); 6 } 7 public Print(){ 8 System.out.println("Print(),空构造器。。。"); 9 } 10 public void PrintW(){ 11 System.out.println("Print.PrintW(),我开始打印了。。。。"); 12 } 13 }
StaticTest.java,
1 package com.testStatic; 2 3 public class StaticTest { 4 public StaticTest(){ 5 System.out.println("StaticTest.的StaticTest()构造器,"); 6 } 7 static{ 8 System.out.println("StaticTest.static{}.......,我应该是第一个执行,"); 9 } 10 { 11 System.out.println("StaticTest.的非静态代码块"); 12 } 13 public void M1(){ 14 Print p = new Print(); 15 if(p!=null){ 16 System.out.println("p 已经实例化"); 17 }else{ 18 System.out.println("p 还没实例化"); 19 } 20 } 21 22 public void M2(){ 23 Print p2 = new Print(); 24 p2.PrintW(); 25 if(p2!=null){ 26 System.out.println("p2 已经实例化"); 27 }else{ 28 System.out.println("p2 还没实例化"); 29 } 30 31 } 32 public static void main(String[] args) { 33 StaticTest s = new StaticTest(); 34 if(s!=null){ 35 System.out.println("s 已经实例化"); 36 }else{ 37 System.out.println("s还没实例化"); 38 } 39 System.out.println("=====main()====="); 40 s.M1(); 41 s.M2(); 42 } 43 }
运行结果:
StaticTest.static{}.......,我应该是第一个执行,
StaticTest.的非静态代码块
StaticTest.的StaticTest()构造器,
s 已经实例化
=====main()=====
Print().static{}.....,肯定先执行到我....,比构造器还先执行到...
Print(),空构造器。。。
p 已经实例化
Print(),空构造器。。。
Print.PrintW(),我开始打印了。。。。
p2 已经实例化