关于静态代码块,构造代码块,构造方法,普通代码块的一些概念和执行顺序

2022-07-27,,,,

关于静态代码块,构造代码块,构造方法和普通代码块的执行顺序

1.静态代码块:在类加载时执行,并且只执行一次,它的优先级高于其他任何代码块和构造函数。
2.构造代码块:用于对象的初始化,在创建对象时调用,每次创建都会调用一次,在构造函数之前执行,它依托于构造函数,如果不实例化对象,构造代码块也不执行。
3.构造函数:每创建一个对象时就会执行一次。同时构造函数是给特定对象进行初始化,而构造代码是给所有对象进行初始化,作用区域不同。
4.普通代码块:存在于方法体中。
new 一个对象的时候总是先执行构造代码,再执行构造函数,但是有一点需要注意构造代码不是在构造函数之前运行的,它是依托构造函数执行的。
综上,执行顺序为:
静态代码块>构造代码块>构造函数>普通代码块

请看如下代码:

public class C extends C0{
    public C(){
        super(100);
        System.out.print(1);
    }
    {
        System.out.print(2);
    }
    static{
        System.out.print(3);
    }
    public C(int age){
        this();
    }
    public static void main(String[] args) {
        new C(100);
        System.out.println();
        new C(120);
    }
}
class C0{
    public C0(){
        System.out.print(6);
    }
    public C0(int age){
        this();
        System.out.print(7);
    }
    static{
        System.out.print(5);
    }
    {
        System.out.print(4);
    }
}

其执行结果为:5346721 46721

反编译代码为:
C0.class:

class C0 {
    public C0() {
        System.out.print(4);
        System.out.print(6);
    }

    public C0(int age) {
        this();
        System.out.print(7);
    }

    static {
        System.out.print(5);
    }
}

C.class:

public class C extends C0 {
    public C() {
        super(100);
        System.out.print(2);
        System.out.print(1);
    }

    public C(int age) {
        this();
    }

    public static void main(String[] args) {
        new C(100);
        System.out.println();
        new C(120);
    }

    static {
        System.out.print(3);
    }
}

在第一次new对象时,静态代码块执行,并且只执行了一次,在第二次new对象时,静态代码块没有执行,而构造代码块在每次创建对象时都会执行。通过反编译的代码可以看出构造代码块在初始化对象时被调用,并且在无参构造之前执行。

本文地址:https://blog.csdn.net/m0_50857829/article/details/109820124

《关于静态代码块,构造代码块,构造方法,普通代码块的一些概念和执行顺序.doc》

下载本文的Word格式文档,以方便收藏与打印。