/*
代码块:又称初始块,是类成员的一部分。类似于方法,将语句用{}包起来
代码块没有名字 基本语法如下
***【修饰符】 {代码……}; 修饰符可有可无,要写的话,只能写static。***‘;’可以省略
不需要创建对象或通过类的显式调用 来调用。
***当加载类时、或者创建对象时被隐式调用
使用场景
如果多个构造器中都有重复的语句,可抽取到初始代码块中,提高代码重用性。相当于对构造器的补充机制,
***因此代码块的调用顺序会先于构造器
*/
//代码块细节分析
/*
1.static代码块又叫静态代码块,只会随着类被加载时执行,并且只会执行一次
普通代码块是在创建对象时调用的,创建一次就调用一次。
2.类在是么时候被加载
Ⅰ. 创建对象前(new)会加载类;
*****不同老韩Ⅱ. 创建子类对象时,会优先加载父类,再加载子类.
前提是父类代码块用static修饰,若没有修饰,则还是会先执行子类代码块,再执行父类代码块,
有修饰,则按照父类到子类顺序执行代码块
Ⅲ.调用静态成员时,static方法、static属性。
下面例子说明
3.在创建对象时,在一个类中的调用顺序
Ⅰ.只有静态代码块和静态属性初始化存在时,二者优先级相同,调用时按二者定义的顺序进行
Ⅱ.只有普通代码块和普通属性初始化存在时,二者优先级相同,调用时按二者定义顺序进行
Ⅲ.既有静态又有普通时,静态优先执行,在执行普通。
Ⅳ.代码块和属性初始化(静态和非静态)执行完后,才会调用构造器。
{构造器的最前面其实隐藏了super()和调用普通代码块两个语句}
4.创建子类时(继承关系),静态代码块、静态属性初始化、
普通代码块、普通属性初始化、构造方法的调用顺序。(该顺序遵循上3的顺序)
Ⅰ.父类的静态代码块和静态属性(优先级一样)
Ⅱ.子类的静态代码块和静态属性(优先级一样)
Ⅲ.父类的普通代码块和普通属性初始化(优先级一样)
Ⅳ.父类的构造方法
Ⅴ.子类的普通代码块和普通属性初始化
Ⅵ.子类的构造方法
*/