Java 类初始化顺序

xiaoxiao2021-02-28  15

java中继承类创建时,初始化顺序如下:

父类的静态初始化块 子类的静态初始化块 父类的初始化块 父类的构造函数 子类的初始化块 子类的构造函数

初始化块主要用于对象的初始化操作,在创建对象时调用,可以用于完成初始化属性值、加载其他的类的功能。初始化块和构造方法功能类似,可以再创建对象的时候完成一些初始化的操作,一般的情况下,构造方法初始化和初始化块初始化可以通用。

构造方法在初始化的时候可以通过参数传值,但是初始化块不能,初始化块的初始化在构造方法之前执行,如果多次重载,此时可以考虑构造方法中共通的代码放到初始化块中进行初始化。

静态初始化块和非静态初始化块的区别? 非静态初始化块主要是用于对象的初始化操作,在每次创建对象的时都要调用一次,其执行顺序在构造方法之前。 在初始化块之前有static修饰,则为静态初始化块。由于非静态成员不能再静态方法中使用,同样也不能在静态初始化块中,因此,静态初始化块主要用于初始化静态变量和静态方法,静态初始化块只调用一次,是在类的第一次加载到内存时,并非一定要创建对象才执行。 静态初始化块比非静态初始化块先执行。

public class Main { static { System.out.println("Static init Main.");//静态初始化块并非要实例化才能执行 } public static void main(String[] args) { Son s = new Son(); } } class Parent{ { System.out.println("parent中的初始化块"); } static{ System.out.println("parent中static初始化块"); } public Parent(){ System.out.println("parent构造方法"); } } class Son extends Parent{ { System.out.println("son中的初始化块"); } static{ System.out.println("son中的static初始化块"); } public Son(){ System.out.println("son构造方法"); }

输出结果

Static init Main. parent中static初始化块 son中的static初始化块 parent中的初始化块 parent构造方法 son中的初始化块 son构造方法

总结: 1. 静态初始化块的优先级最高,也就是最先执行,并且仅在类第一次被加载时执行; 2. 非静态初始化块和构造函数后执行,并且在每次生成对象时执行一次; 3. 非静态初始化块的代码会在类构造函数之前执行。因此若要使用,应当养成把初始化块写在构造函数之前的习惯,便于调试; 4. 静态初始化块既可以用于初始化静态成员变量,也可以执行初始化代码; 5. 非静态初始化块可以针对多个重载构造函数进行代码复用。

Reference: https://www.cnblogs.com/BlackStorm/p/5699965.html http://blog.csdn.net/lgfeng218/article/details/7606735

转载请注明原文地址: https://www.6miu.com/read-1900064.html

最新回复(0)