加载器第一次加载某一个类时,执行顺序如下:
- 先执行父类的静态变量和静态代码块,如果有初值为其赋值,没有就赋值默认初始值
- 执行当前类的静态变量和静态代码块,如果有初值为其赋值,没有就赋值默认初始值
- 执行当前类成员的默认赋值,int-0, boolean - false等
- 执行当前类的构造方法,显示或者掩式调用父类的构造方法,如果构造方法代码块中有this,则在父类构造中就表示调用父类的属性,子类中就是调用子类的属性;如果父类还有父类的话,会调用它的父类构造方法
- 执行父类的非静态成员赋默认的初始值, int -0 boolean-false等
- 如果父类成员有显示赋值,则为其赋值
- 执行父类构造方法的其他代码块
- 如果子类成员有显示赋值,则为其赋值
- 执行子类构造方法其他代码块
出个题考考:
public class Test extends father{
int i = 222;
public Test(){
super();
display();
this.display();
}
public void display(){
System.out.println(i+"--");
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new Test();
}
}
class father{
private int i = 2;
public father(){
System.out.println(this.i);
display();
this.display();
}
public void display(){
System.out.println(i + "88");
}
}
先自己思考思考
答案在这儿:
2
0--
0--
222--
222--
总结:
- 静态变量先父类后子类
- 这儿精简重点:
public father(){
// 当前类成员默认赋初值
// i =0
//掩式或者显示调用父类构造方法,父类的构造方法也是如下步骤的
super();
// 当前类成员显示赋值,如果存在的话
i = 2;
//其他代码块
display();
}
搞定,如有不对请指正