美文网首页
类初始化顺序-静态代码块、代码块、构造函数、静态成员变量、成员变

类初始化顺序-静态代码块、代码块、构造函数、静态成员变量、成员变

作者: 1iangcc | 来源:发表于2018-03-12 09:05 被阅读0次

    参考文章:Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序

    定义:

    静态代码块:用static修饰,仅在jvm加载该类时候执行一次。

    构造代码块:也称普通代码块、代码块,在类中直接用{}定义的代码,当对象被创建时执行一次。


    注意:

    一、构造函数:

    1.调用构造方法时,会创建一个对象(但不是唯一创建对象的方式,详情见tips1)

    2.一般方法可以被对象多次调用,但构造方法只在对象创建时调用一次。

    二、静态代码块:

    1.静态代码块是由类调用的。当类被jvm加载时执行一次,且顺序优先于main函数。

    2.一个类中可以有多个静态代码块。

    3.静态代码块中的变量必须是static变量。

    三、构造代码块:

    1.对象一被建立时会运行构造代码块,顺序优先于构造函数。

    2.构造代码块与构造函数的区别:构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化,因为构造函数可以有N个,不同的构造函数可以初始化出不同的对象。但无论建立哪个对象,都会先执行相同的构造代码块。也就是说,构造代码块中定义的是不同对象共性的初始化内容。

    3.构造代码块和静态代码块的区别:构造代码块是给对象初始化,而静态代码块是给类初始化


    执行顺序:

    一、单独对于一个类而言(不涉及继承):

    1.JVM加载一个类时,执行静态代码块、初始化静态变量。顺序在main函数之前。

    2.创建一个对象时执行顺序:初始化变量、构造代码块>构造函数。

    即:

    (静态代码块、初始化静态变量)>(构造代码块、变量)>构造函数

    二、当涉及继承的情况下:

    1.执行父类的静态代码块,初始化父类静态成员变量

    2.执行子类的静态代码块,初始化子类静态成员变量

    3.执行父类的构造代码块,初始化父类普通成员变量 , 并执行父类的构造函数

    4.执行子类的构造代码块, 初始化子类普通成员变量 ,并执行子类的构造函数

    即:

    (父类静态代码块、静态变量)>(子类静态代码块、静态变量)>(父类构造代码块、变量)>父类构造器> (子类构造代码块、变量)>子类构造器

    初始化顺序图:

    初始化顺序图

    相关文章

      网友评论

          本文标题:类初始化顺序-静态代码块、代码块、构造函数、静态成员变量、成员变

          本文链接:https://www.haomeiwen.com/subject/gzngfftx.html