这个问题可能每个小伙伴学习Java的时候都遇到过,但恐怕很多时候都没重视。举个栗子来讲解,栗子有一部分copy了别人的代码。。
父类:
package test;
public class Father {
public Father() {
System.out.println("Father Constructor is running");
}
public Father(int a) {
System.out.println("Father Constructor is running with a=" + a);
}
}
测试类:
package test;
public class Shunxu extends Father {
//静态变量
static int a = 0;
//非静态代码块
{
System.out.println("B.scope is running");
a = 10 ;
}
//静态代码块
static {
System.out.println("B.static scope is running");
a = 20;
}
//构造函数
public Shunxu() {
// super(10);
System.out.println("B.Constructor is running");
}
public static void main(String arg[]) {
System.out.println(Shunxu.a);//证明非静态代码块在类加载时未执行
Shunxu b1 = new Shunxu();
System.out.println(b1.a);
Shunxu b2 = new Shunxu();//非静态代码块每次都执行
System.out.println(Shunxu.a);
/*
* 静态代码块->父类构造方法->非静态代码块->本身构造方法
*/
}
}
执行结果:
B.static scope is running
20
Father Constructor is running
B.scope is running
B.Constructor is running
10
Father Constructor is running
B.scope is running
B.Constructor is running
10
做个总结:(其实都在注释里了)
1.顺序:静态代码块->父类构造方法->非静态代码块->本身构造方法。
2.非静态代码块每次构造对象实例时都执行,静态代码块只在加载类的时候执行一次。