类的初始化和代码的执行顺序

package com.siyu.model.others;

/**
 * 类的初始化
 *
 * 1-静态代码块和静态类变量初始化顺序,谁在上面,谁先执行,只执行一次。
 * 2-非静态成员变量和非静态代码块谁在上谁先执行,并且每实例化一次,就执行一次;构造器最后执行,
 * 3-在子类的构造器,一定会调用父类的构造器,有时候省略不写,默认有一个super。子类的初始化会调用父类初始化
 *
 */
public class Father {

    private int i = test();
    private static int j = method();

    static {
        System.out.println("(1) 父类静态代码块");
    }

    public 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;
    }
}

class Son extends Father {

    private int i = test();

    private static int j = method();

    static {
        System.out.println("(6) 子类静态代码块");
    }

    public Son() {
        System.out.println("(7) 子类构造方法");
    }

    {
        System.out.println("(8) 子类非静态代码块");
    }

    public int test() {
        System.out.println("(9) 子类成员方法");
        return 1;
    }

    public static int method() {
        System.out.println("(10) 子类静态方法");
        return 1;
    }

    /**
     * (5) 父类静态方法
     * (1) 父类静态代码块
     * (10) 子类静态方法
     * (6) 子类静态代码块
     * (9) 子类成员方法
     * (3) 父类非静态代码块
     * (2) 我是父类构造方法
     * (9) 子类成员方法
     * (8) 子类非静态代码块
     * (7) 子类构造方法
     *
     * (9) 子类成员方法
     * (3) 父类非静态代码块
     * (2) 我是父类构造方法
     * (9) 子类成员方法
     * (8) 子类非静态代码块
     * (7) 子类构造方法
     * @param args
     */
    public static void main(String[] args) {
        Son s1 = new Son();
        /*
        首先初始化类,然后再初始化对象
        开始初始化类了
        先初始化父类
        类变量和静态代码块初始化的顺序是:谁在上,先初始化谁。所以在本题中,先初始化类变量,执行method(),然后静态代码块,所以打印(5)(1)
        然后初始化子类,打印(10) (6)
        至此,类初始化完成,接下来开始初始化对象了。

        初始化子类对象第一步是先初始化父类,因为子类要继承父类东西
          初始化父类,非静态成员变量和非静态代码块的顺序是,谁在上,先初始化谁,构造器最后,所以父类初始化的顺序是:(9)(3)(2)
          不应该是(4)(3)(2)吗?不是,因为test()方法是子类重写,一个方法父子类都有,子类初始化,所以执行的是子类的test()
          然后初始化子类
          子类是:(9)(8)(7)

         */

        System.out.println();
        // 后面又实例化一个新对象,那就再初始化一边。
        Son s2 = new Son();
    }
}
posted @ 2021-12-18 12:40  姚狗蛋  阅读(33)  评论(0编辑  收藏  举报