java程序初始化顺序

Posted 贰零一八

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java程序初始化顺序相关的知识,希望对你有一定的参考价值。

 使用场景:  在java程序中,当实例化对象时,对象的所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,

才会调用对象所在类的构造函数创建对象

     初始化的原则

   (1)静态对象优先于非静态对象初始化,静态对象只能初始化一次,但非静态对象可以初始化多次。

   (2)超类优先于派生类初始化。

  (3)按照成员变量定义的顺序来进行初始化,即使变量定义散布于方法定义之中,它们仍然在任何方法(包括构造器)被调用前初始化。

package test;
/*java程序初始化的顺序:超类静态变量 超类静态代码块 子类静态变量 子类静态代码块 
 *  超类非静态变量 超类非静态代码块 超类构造函数  子类非静态代码块  子类非静态代码块
 *  子类构造函数*/

class Base {    
    static {
        System.out.println("父类静态块");//(1)
    }
    {
        System.out.println("父类块");//(3)
    }

    public Base() {
        System.out.println("父类构造方法");//(4)
    }
    
    public static void A() {
        int a;//静态方法中不能有静态常量,因为static方法共享一块内存区域,主要用于累加,如果静态常量的常量话就不能累加了,就冲突了
        System.out.println("父类普通静态方法");
    }
    
}

public class Derived extends Base {
    static int a=1;    
    static int b=2;
    static {
        System.out.println("子类静态块");//(2)
    }
    {
        System.out.println("子类块");//(5)
    }

    public Derived() {
        System.out.println("子类构造器");//(6)
    }

    public static void main(String[] args) {    
        Base.A();        
        new Derived();
        
    }
}
/*
 *public static void main(String[] args) {        
        new Derived();
        Base.A();        
    }
父类静态块
子类静态块
父类块
父类构造方法
子类块
子类构造器
父类普通静态方法
*/

/*
 *public static void main(String[] args) {    
        Base.A();        
        new Derived();
        
    }
 父类静态块
子类静态块
父类普通静态方法
父类块
父类构造方法
子类块
子类构造器
 * */

 

      

以上是关于java程序初始化顺序的主要内容,如果未能解决你的问题,请参考以下文章

java中成员变量代码块构造函数运行顺序

Java基础(Java类的初始化顺序)

Java中程序初始化的顺序

Java的初始化过程

Java类的初始化顺序

如何使用 Swift 使用此代码片段为 iOS 应用程序初始化 SDK?