class A{
int a=10;
{
System.out.println("A构造代码块");
}
static{
System.out.println("A的静态代码块");
}
A(){
System.out.println("A的构造方法");
}
}
class B extends A{
int a=10;
{
System.out.println("B构造代码块");
}
static{
System.out.println("B的静态代码块");
}
B(){
System.out.println("B的构造方法");
}
}
class Text{
public static void main(String[] args){
B b=new B();
}
}
首先把Text 中的main方法加载到栈中,当执行第一句话时B b=new B();不认识B那么他就要把类(字节码)加载到方法区中,由于B要继承A,所以要先把A的字节码加载到方法区中。然而静态代码块随着类的加载而执行,所以先执行A的静态代码块;接着就要把B的字节码加载到方法区中,静态代码块随着类的加载而执行,所以先执行B的静态代码块。
创建B类对象要先对A类进行初始化:按照A的显示初始化、构造代码块、构造方法初始化的顺序进行。执行完A的初始化再执行B的初始化按照B的显示初始化、构造代码块、构造方法初始化的顺序进行
为什么创建B类的对象要对A先进行初始化:因为A类的一些属性可能会在初始化时填充数据,后续B可能用到这些数据,或修改这些数据。总之要先初始化父类的属性值
在B创建对象时是否创建了A的对象?不然A怎么会执行构造方法?:没有生成A类的对象,因为构造方法不是创建对象用的,而是初始化用的。