• Java类的初始化顺序


    Java类的初始化顺序

    多说无益,以下是本人亲自试验的代码,一目了然:

     1 package test1;
     2 
     3 public class Test {
     4     public static void main(String[] argc) {
     5         new Child();
     6         System.out.println("================================");
     7         new Child();
     8     }
     9 }
    10 
    11 class Child extends Parent{
    12     private static String staticField = getStaticField();
    13     static {
    14         System.out.println("child静态方法块初始化");
    15     }
    16     private String field = getField();
    17     {
    18         System.out.println("child普通方法块初始化");
    19     }
    20 
    21     public Child() {
    22         System.out.println("child构造函数初始化");
    23     }
    24 
    25     public static String getStaticField() {
    26         System.out.println("child静态属性初始化");
    27         return "staticField";
    28     }
    29 
    30     public static String getField() {
    31         System.out.println("child普通属性初始化");
    32         return "field";
    33     }
    34 }
    35 
    36 class Parent {
    37     private static String staticField = getStaticField();
    38     static {
    39         System.out.println("parent静态方法块初始化");
    40     }
    41     private String field = getField();
    42     {
    43         System.out.println("parent普通方法块初始化");
    44     }
    45 
    46     public Parent() {
    47         System.out.println("parent构造函数初始化");
    48     }
    49 
    50     public static String getStaticField() {
    51         System.out.println("parent静态属性初始化");
    52         return "staticField";
    53     }
    54 
    55     public static String getField() {
    56         System.out.println("parent普通属性初始化");
    57         return "field";
    58     }
    59 }

    打印结果:

     1 parent静态属性初始化
     2 parent静态方法块初始化
     3 child静态属性初始化
     4 child静态方法块初始化
     5 parent普通属性初始化
     6 parent普通方法块初始化
     7 parent构造函数初始化
     8 child普通属性初始化
     9 child普通方法块初始化
    10 child构造函数初始化
    11 ================================
    12 parent普通属性初始化
    13 parent普通方法块初始化
    14 parent构造函数初始化
    15 child普通属性初始化
    16 child普通方法块初始化
    17 child构造函数初始化

     经过替换静态属性和静态初始化块的声明顺序发现静态属性和静态初始化块的初始化顺序和声明顺序有关,同理,普通属性和普通初始化块的的初始化顺序和声明顺序有关

    总结:

    1. 当某一个类满足初始化的条件时(以后的博客中会有总结),先会初始化父类(从顶级父类Object依次向下初始化),然后初始化子类;
    2. 初始化该类时,最先初始化静态属性和静态初始化块(和声明顺序有关),从顶级父类Object依次向下初始化;
    3. 通过new创建对象时,先初始化普通属性和普通初始化块(和声明顺序有关),再调用构造方法,同样从顶级父类Object依次向下执行;
    4. 静态属性和静态初始化块只会初始化一次,类初始化后,再次通过new创建对象,只会重复执行第三步。

      接下来引用Java编程思想的一句话:

    在类的内部,变量定义的先后顺序决定了初始化的顺序,即使变量定义散布于方法定义之间,它们仍旧会在任何方法(包括构造器)被调用之前得到初始化。

    参考:Java编程思想中文版第四版第5章

      及 https://www.cnblogs.com/fly-piglet/p/8766226.html

  • 相关阅读:
    096_mulesoft with salesforce _01
    c++ 内存分区模型 引用 函数提高
    c++ 基础入门
    重点算法题
    密码常识测试
    【dubbo3.x trace组件分享】
    国产操作系统deepin安装与配置NodeRED环境
    pytest框架简介
    pytest添加日志
    斯特林数
  • 原文地址:https://www.cnblogs.com/xiaohang123/p/12019542.html
Copyright © 2020-2023  润新知