Bloque de código Java, bloque de código estático y orden de ejecución del constructor

Hoy de repente recordé una pregunta de una entrevista de Java que encontré hace unos años. El contenido es un poco más simple, así que grabaré la nota aquí. No discutiré principios de nivel profundo.

¿Cuál es el orden de ejecución de bloques de código, bloques de código estático y constructores en Java?

Para resolver este problema, considere la relación de herencia entre la clase principal y la clase secundaria, y considere la secuencia de varios bloques de código. Así que pulsa el código

padre:

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

    {
        System.out.println("父类 - 普通 - 代码块1");
    }

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

    public ParentClass(){
        System.out.println("父类 - 构造函数");
    }

    {
        System.out.println("父类 - 普通 - 代码块2");
    }

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

Subclase:

public class SunClass extends ParentClass{
    static {
        System.out.println("子类 - 静态 - 代码块1");
    }

    {
        System.out.println("子类 - 普通 - 代码块1");
    }

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

    public SunClass() {
        System.out.println("子类 - 构造函数");
    }

    {
        System.out.println("子类 - 普通 - 代码块2");
    }

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

Categoría de prueba:

public class BlockTest {

    public static void main(String[] args){

        new ParentClass();

        new SunClass();
        new SunClass();


    }

}

Resultados de la prueba

1. Primero observe la salida de solo la nueva clase principal:

父类 - 静态 - 代码块1
父类 - 静态 - 代码块2
父类 - 静态 - 代码块3
父类 - 普通 - 代码块1
父类 - 普通 - 代码块2
父类 - 构造函数

2. Vuelva a intentar dos subclases nuevas:

父类 - 静态 - 代码块1
父类 - 静态 - 代码块2
父类 - 静态 - 代码块3
子类 - 静态 - 代码块1
子类 - 静态 - 代码块2
子类 - 静态 - 代码块3
父类 - 普通 - 代码块1
父类 - 普通 - 代码块2
父类 - 构造函数
子类 - 普通 - 代码块1
子类 - 普通 - 代码块2
子类 - 构造函数
父类 - 普通 - 代码块1
父类 - 普通 - 代码块2
父类 - 构造函数
子类 - 普通 - 代码块1
子类 - 普通 - 代码块2
子类 - 构造函数

En conclusión:

Se pueden extraer conclusiones de las dos pruebas anteriores. Cuando un objeto es nuevo, el orden de ejecución del bloque de código, el bloque de código estático y el constructor de la clase entre las clases padre e hijo es:

1、父类 - 静态 - 代码块 (多个同级代码块,按照代码顺序执行;且只在类加载时执行一次)
2、子类 - 静态 - 代码块 (多个同级代码块,按照代码顺序执行;且只在类加载时执行一次)

// 第一次 new 
3、父类 - 普通 - 代码块 (多个同级代码块,按照代码顺序执行;在当前类构造函数之前执行;每次 new 时都会执行)
4、父类 - 构造函数
5、子类 - 普通 - 代码块 (多个同级代码块,按照代码顺序执行;在当前类构造函数之前执行;每次 new 时都会执行)
6、子类 - 构造函数

// 第二次 new
7、父类 - 普通 - 代码块 (多个同级代码块,按照代码顺序执行;在当前类构造函数之前执行;每次 new 时都会执行)
8、父类 - 构造函数
9、子类 - 普通 - 代码块 (多个同级代码块,按照代码顺序执行;在当前类构造函数之前执行;每次 new 时都会执行)
10、子类 - 构造函数

 

 

Supongo que te gusta

Origin blog.csdn.net/fesdgasdgasdg/article/details/88358810
Recomendado
Clasificación