2.子类静态代毕尘慎码块;
3.父类非静态代码块;
4.父类构造函数;
5.子类非静态代码块;
6.子类构造函数;
举例:
public class ExA {
static {
System.out.println("父类静态代手敬码块。")
}
public ExA() {
System.out.println("父类构造函数。")
}
{
System.out.println("父类非静态代码块。")
}
public static void main(String[] args) {
new ExB()
}
}
class ExB extends ExA {
static {
System.out.println("子类静态代码块。")
}
{
System.out.println("子类非静态代码块。")
}
public ExB() {
System.out.println("子类构造函数。")
}
}
执行结果:父类静态代码块。子类静态代码块。父类非静态代码块。父类构造函数。子类非静态代码块。兄陪子类构造函数。
记住 3 条原则:1、父类优先于子类
2、属性优先于代码块优先于构造方法
3、静态优先于非静态
因此,类加载顺序为竖旦:
父类静态变量->父类静态语句块->子类静态变量->子类静态语句块->父类普通成员变量->父类动态语句块->父类构造器->子类普通成员变量->子逗枯类动态语句块->子类构造器余指扰
基本都对,只有一个凳段闷地方不完全,如果p是继承f类,f也有默认的构造的话,那么顺序应该是这样的,f的构造运行,p的普通构造代燃清码块,加载p的构造函数简单的说普通初始化代码块是紧跟super()后运行,之后再运行构造枣弯函数其他代码
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)