测试父类子类静态代码块,普通代码块,构造方法的执行顺序
public class A {
static {
System.out.println("父类静态代码块");
}
public A(){
System.out.println("父类构造方法");
}
{
System.out.println("父类初始化代码块");
}
}
public class B extends A {
static {
System.out.println("子类静态代码块");
}
public B(){
System.out.println("子类构造方法");
}
{
System.out.println("子类初始化代码块");
}
public static void main(String[] args){
new B();
}
}
结果为按父类子类的顺序,先执行静态代码块(加载时最先加载静态代码块),然后执行父类的普通代码块和构造方法,最后执行子类的普通代码块和构造方法
测试静态方法、静态代码块、静态成员变量的执行顺序
public class C {
static int x = 10;
static{
System.out.println("静态方法初始化"+x);
x += 5;
}
public static void main(String[] args){
System.out.println(x);
}
static {
System.out.println("静态方法初始化"+x);
x /= 3;
}
}
/**
* 虚拟机对Java类进行首次加载时,会对静态代码块,静态成员变量,静态方法进行一次初始化加载。
* 三者的执行顺序是:静态成员变量,静态代码块,最后执行静态方法。为什么呢?方法肯定是被调用才执行,这个好说。变量和代码块呢?举例,假如代码块中用到了变量怎么办呢?所以肯定先加载成员变量。
* 调用new方法才会创建类的实例
* 类实例创建过程中,按照父子关系进行初始化。首先是初始化父类静态代码块,然后子类静态代码块。然后依次是
* 父类的初始化代码块,父类构造方法,子类初始化代码块,子类构造方法
* 类实例销毁的时候也是先销毁子类,然后是父类
*
*
*/
结果