美文网首页
Java类的初始化顺序

Java类的初始化顺序

作者: PaulLuv | 来源:发表于2018-05-31 22:41 被阅读35次

Java类的初始化顺序

  1. (静态变量、静态代码块)> 类里的 main()(如果有的话) > (变量、初始化块) > 构造函数。

  2. (父类 静态变量、静态代码块)> (子类 静态变量、静态代码块) > 子类main()(如果有的话) > (父类 变量、初始化块) > 父类构造函数 > (子类 变量、初始化块) > 子类 构造函数 。

其中:

  1. 静态变量与静态代码块 的顺序取决于代码中出现的顺序,变量与初始化块也一样。
  2. 子类加载的时候,如果发现有父类,则优先父类,父类还有父类以此递归,顺序按上面的初始化顺序。

示例代码:

public class JavaClassInitOrder {
    public static String staticField = "静态变量";
    public String field = "变量";
    static {
        System.out.println( staticField );
        System.out.println( "静态初始化块" );
    }
    /* 初始化块 */
    {
        System.out.println( field );
        System.out.println( "初始化块" );
    }
    /* 构造器 */
    public JavaClassInitOrder() {
        System.out.println( "构造器" );
    }
    public static void main( String[] args ) {
        System.out.println( "main1" );
        new JavaClassInitOrder();
        System.out.println( "main2" );
    }
}

输出:

  1. 静态变量
  2. 静态初始化块
  3. main1
  4. 变量
  5. 初始化块
  6. 构造器
  7. main2

继承代码示例:

public class ExtendsClassInitOrder extends Child{
    public static String staticField = "子类-静态变量";
    public String field = "子类-变量";
    static {
        System.out.println( staticField );
        System.out.println( "子类-静态初始化块" );
    }
    /* 初始化块 */
    {
        System.out.println( field );
        System.out.println( "子类-初始化块" );
    }
    /* 构造器 */
    public ExtendsClassInitOrder(){
        System.out.println( "子类-构造器" );
    }

    public static void main(String[] args){
        System.out.println( "子类-main1" );
        new ExtendsClassInitOrder();
        System.out.println( "子类-main2" );
    }
}

class Parent{
    public static String P_staticField = "父父类-静态变量";
    public String P_field = "父父类-变量";
    static {
        System.out.println( P_staticField );
        System.out.println( "父父类-静态初始化块" );
    }
    /* 初始化块 */
    {
        System.out.println( P_field );
        System.out.println( "父父类-初始化块" );
    }
    /* 构造器 */
    public Parent() {
        System.out.println( "父父类-构造器" );
    }
}

class Child extends Parent{
    public static String C_staticField = "父类-静态变量";
    public String C_field = "父类-变量";
    static {
        System.out.println( C_staticField );
        System.out.println( "父类-静态初始化块" );
    }
    /* 初始化块 */
    {
        System.out.println( C_field );
        System.out.println( "父类-初始化块" );
    }
    /* 构造器 */
    public Child() {
        System.out.println( "父类-构造器" );
    }
}

输出:
父父类-静态变量
父父类-静态初始化块
父类-静态变量
父类-静态初始化块
子类-静态变量
子类-静态初始化块
子类-main1
父父类-变量
父父类-初始化块
父父类-构造器
父类-变量
父类-初始化块
父类-构造器
子类-变量
子类-初始化块
子类-构造器
子类-main2

相关文章

  • 类初始化和加载过程

    一、对象的初始化顺序: java类加载器加载类的顺序:http://blog.csdn.net/crazycode...

  • 构造器内部的多态方法的行为

    上一篇 :Java类初始化顺序 上一节我们简单总结了类的初始化顺序。父类(静态变量、静态初始化块)>子类(静态变量...

  • JAVA的类加载顺序

    理解关于java类的加载顺序 首先来捋一捋java类的加载顺序吧 父类静态代码块 》》静态代码初始化,静态属性(带...

  • Java类的初始化顺序

    Java类的初始化顺序 (静态变量、静态代码块)> 类里的 main()(如果有的话) > (变量、初始化块) >...

  • Java类加载与初始化

    今天复习了一下java类加载时的初始化顺序,先记录一下心得,代码后续补上。 类加载时的初始化顺序 1、一般来说,类...

  • Java和Kotlin类的初始化顺序

    Java Java程序初始化的顺序:父类静态变量 -> 父类静态代码块 -> 子类静态变量 -> 子类静态代码块 ...

  • java构造器初始化与清理

    java构造器初始化先后顺序: 若此类继承于某基类,则先初始化基类,以此类推,找到最基本的父类,先对基类进行初始化...

  • 设计模式——工厂,策略,建造者

    Java 类初始化顺序基本分为以下几种:静态块,初始化块,静态方法,构造函数块,静态变量,成员变量对于块顺序,静态...

  • java 类初始化 顺序

    Java 类初始化介绍 java语言在使用过程中最先开始就是初始化,在工作中如果遇到什么问题需 要定位往往到最后也...

  • java类初始化顺序

    1.静态代码块,静态变量,按代码顺序先后执行.2.构造代码块,成员变量,按代码顺序先后执行.3.先执行构造块或成员...

网友评论

      本文标题:Java类的初始化顺序

      本文链接:https://www.haomeiwen.com/subject/uzlcsftx.html