类加载和实例化顺序
类实例化, 先成员变量默认初始化, 成员变量显式初始化, 执行构造函数
有父子关系的类实例化, 成员变量默认初始化, 执行父类构造函数, 成员变量显式初始化, 执行子类构造函数
class Fu
{
Fu()
{
super();
show(); //通过结果可以看出,子父类有同名show方法,调用的是子类show方法。
return;
}
void show()
{
System.out.println("fu show");
}
}
class Zi extends Fu
{
int num = 8;
Zi()
{
super();
//-->通过super初始化父类内容时,子类的成员变量并未显示初始化。等super()父类初始化完毕后,
//才进行子类的成员变量显示初始化。
System.out.println("zi cons run...."+num);
return;
}
void show()
{
System.out.println("zi show..."+num);
}
}
class ExtendsDemo5
{
public static void main(String[] args)
{
Zi z = new Zi();
z.show();
}
}
输出:
zi show...0
zi cons run....8
zi show...8
类的加载和实例化顺序
1) 在堆内存中生成class对象, 把静态变量和静态方法加载到方法区, 这个堆内存中的class对象是方法区数据的入口
2) 静态变量默认初始化
3) 静态变量显式初始化
4) 执行静态代码块
5) 成员变量默认初始化, 显示初始化
6) 执行构造函数

浙公网安备 33010602011771号