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


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

  • 相关阅读:
    大神的文章
    分布式锁
    分布式事务
    事务两三事
    spring框架笔记
    三个缓存数据库Redis、Memcache、MongoDB
    面向对象面试题
    SSM面试
    单例模式
    Spring Cloud面试题
  • 原文地址:https://www.cnblogs.com/Sunnor/p/4793227.html
Copyright © 2020-2023  润新知