类的初始化顺序

233 阅读1分钟

顺序(重点)

  1. 父类中静态成员变量和静态代码块

  2. 子类中静态成员变量和静态代码块

  3. 父类中普通成员变量和代码块,父类的构造函数

  4. 子类中普通成员变量和代码块,子类的构造函数

其中“和”字两端的按照代码先后顺序执行。

例子

package com.sie.tianwei.base.test;

/**
* @author xjx
* @note
*/

/*** 父类初始化<clinit> * 1、j = method() *
* 2、 父类的静态代码块 ** 父类实例化方法: * 1、super()(最前) * 2、i = test() (9) *
* 3、子类的非静态代码块 (3) *
* 4、子类的无参构造(最后)(2) *** 非静态方法前面其实有一个默认的对象this * this在构造器或<init> 他
* 表示的是正在创建的对象,因为咱们这里是正在创建Son对象,
* 所以 * test()执行的就是子类重写的代码(面向对象多态) ** 这里i=test() 执行的就是子类重写的test()方法 *
* @author gcq * @Create 2020-09-25 */
public class Father {
  private int i = test();
  private static int j = method();

  static {
      System.out.println("(1)");
  }

  Father() {
      System.out.println("(2)");
  }

  {
      System.out.println("(3)");
  }

  public int test() {
      System.out.println("(4)");
      return 1;
  }

  public static int method() {
      System.out.println("(5)");
      return 1;
  }





}
package com.sie.tianwei.base.test;

/**
 * @author xjx
 * @date .
 * @note
 */

/*** 子类的初始化<clinit> * 1、j = method() *
 *  2、子类的静态代码块 ** 先初始化父类 (5)(1) * 初始化子类 (10) (6) ** 子类实例化方法: *
 *  1、super()(最前 * 2、i = test() (9) *
 *  3、子类的非静态代码块 (8) *
 *  4、子类的无参构造(最后)(7) *
 *  @author gcq * @Create 2020-09-25 */
public class Son extends Father {
    private int i = test();
    private static int j = method();

    static {
        System.out.println("(6)");
    }

    Son() {
        super();
        System.out.println("(7)");
    }

    {
        System.out.println("(8)");
    }

    @Override
    public int test() {
        System.out.println("(9)");
        return 1;
    }

    public static int method() {
        System.out.println("(10)");
        return 1;
    }

    public static void main(String[] args) {
        Son son = new Son();
        System.out.println();
        Son son1 = new Son();
    }
}