非静态属性、静态属性、静态代码块、普通代码块、构造函数执行顺序

知识点

  1. 静态属性和静态代码块
    按代码中定义先后顺序执行
    这两者优于其他顺序
    都只是在类初始化的时候,加载一次
  2. 非静态属性普通代码块
    按代码中定义先后顺序执行
    在构造函数之前执行
    每次新建对象的时候,都会执行
  3. 构造函数

总结:

  • 静态属性和静态方法,是在类初始化阶段执行的,属于 “类”这个级别的,只加载一次
  • 非静态属性、普通代码块和构造函数,属于“对象”级别的,每次新建对象都会加载一次

例子:

public class Test {

    public static void main(String[] args) {

        Zi z1 = new Zi();

        System.out.println("----------------------------");

        Zi z2 = new Zi();
    }
}
class Fu{
    private static Fu f1 = new Fu(); //Fu的静态属性
    private Other other = new Other(); //Fu的非静态属性

    public Fu(){
        System.out.println("Fu的构造函数");
    }

    static{
        System.out.println("Fu的静态代码块");
    }

    {
        System.out.println("Fu的普通代码块");
    }
}

class Zi extends Fu{
    private static Zi z1 = new Zi(); //Zi的静态属性

    public Zi(){
        System.out.println("Zi的构造函数");
    }

    static{
        System.out.println("Zi的静态代码块");
    }

    {
        System.out.println("Zi的普通代码块");
    }
}

class Other{
    public Other(){
        System.out.println("Other构造函数");
    }
}

结果:

Other构造函数
Fu的普通代码块
Fu的构造函数
Fu的静态代码块
Other构造函数
Fu的普通代码块
Fu的构造函数
Zi的普通代码块
Zi的构造函数
Zi的静态代码块
Other构造函数
Fu的普通代码块
Fu的构造函数
Zi的普通代码块
Zi的构造函数
----------------------------
Other构造函数
Fu的普通代码块
Fu的构造函数
Zi的普通代码块
Zi的构造函数

结果分析:
非静态属性、静态属性、静态代码块、普通代码块、构造函数执行顺序_第1张图片

你可能感兴趣的:(java)