静态代码块和构造器的执行顺序

时间:2020-12-15 19:31:22

 这段时间在学习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 已经实例化