一、初始化
一般来说:初始化分为
- 默认初始化:用户未定义初始化时,整型浮点型默认为0,布尔型默认为false,字符型默认为’\0000’,引用类型默认为null;
- 就地初始化:Y y =new Y();
- 代码块中初始化;
- 构造方法中初始化。
二、初始化的顺序
- 就地执行初始化与执行代码块的初始化优先级一致;
- 但就地初始化和代码块初始化优先级均高于构造方法。
创建一个子类实例的时候,都会产生一个父类实例(包含了父类所有的public的属性和方法),并且先调用父类的参数和构造方法,再之后对子类方法属性进行调用
而此时我们就需要知道这些属性方法初始化时的优先级顺序
代码解释
public class X {
public X(){
System.out.print("X");//第五步构造方法,优先级低,执行完后父类X以及调用完毕,回到子类
}
{
System.out.print("代码块1");//第二步代码块初始化
}
Y y=new Y();//第三步就地初始化,就地初始化和代码块的执行顺序没有优先级,但是都优先于构造方法
{
System.out.print("代码块2");//第四步,代码块2初始化
}
}
class Y{
public Y(){
System.out.print("Y");//第七步
}
}
class Z extends X{//创建子类对象时都先创建一个父类实例,所以先访问X
Y y=new Y();//第六步,就地初始化优先于构造方法
public Z(){
System.out.print("Z");第八步,最后进行访问子类的构造方法
}
public static void main(String[] args) {
new Z();//第一步,对Z进行创建对象也就是对Z实例化,但是但是都优先于构造方法
}
}
此时的输出结果为: