Java的初始化顺序

2019-10-20  本文已影响0人  慌张而黑糖

这里主要介绍静态代码块(static initialization block)、非静态代码块(initialization block)和构造函数(constrouctor)。

当他们在同一个类中同时出现时(不包含继承的情况),初始化的顺序为:

静态代码块>非静态代码块>构造函数

举个例子:

public class A {
    private String name;
    {
        System.out.println("A的非静态代码块");
    }
    static {
        System.out.println("A的静态代码块");
    }
    A(){
        System.out.println("A的构造函数");
    }
    A(String name){
        this.name = name;
        System.out.println("A的有参构造函数,name ="+this.name);
    }
    public static void main(String[] args) {
        new A();
        new A("lili");
    }
}

结果为:

A的静态代码块
A的非静态代码块
A的构造函数
A的非静态代码块
A的有参构造函数,name =lili

并且上面我故意将非静态代码块放到静态代码块之前,但是依然不能改变静态代码块先执行的结果。其中静态代码块在程序运行时只执行一次。

当出现继承情况时

public class B extends A{
    {
        System.out.println("B的非静态代码块");
    }
    static {
        System.out.println("B的静态代码块");
    }
    B(){
        System.out.println("B的构造函数");
    }
    public static void main(String[] args) {
        new B();
    }
}

这里B继承的是上面的A,其结果为:

A的静态代码块
B的静态代码块
A的非静态代码块
A的构造函数
B的非静态代码块
B的构造函数

上一篇 下一篇

猜你喜欢

热点阅读