//类的加载顺序
/*1.在类的加载过程中,类的static成员变量会被初始化,另外如果类中有static语句块,则会先执行static语句块
* static成员变量和static语句块的执行顺序与代码的执行顺序一致。
*2.在java中,类是按需加载,只有当用到这个类的时候才会加载这个类
* */
/*(1) 父类静态对象和静态代码块
(2) 子类静态对象和静态代码块
(3) 父类非静态对象和非静态代码块
(4) 父类构造函数
(5) 子类 非静态对象和非静态代码块
(6) 子类构造函数*/
class Bread {
private static Bread bread=new Bread();//1
//在执行(1)时创建了一个Test对象,在这个过程中会执行非静态代码块和缺省的无参构造函数,在执行非静态代码块时就输出了2,3;
{
System.out.println("父类代码块");//2
}
static {
System.out.println("父类静态代码块");
}
public Bread() {
System.out.println("父类构造方法");//3
}
}
class SmallBread extends Bread{
private static SmallBread smallBread=new SmallBread();
//会先调用父类的构造方法,思路同1,然后再调用自身方法
{
System.out.println("子类代码块");
}
static {
System.out.println("子类静态代码块");
}
public SmallBread() {
System.out.println("子类构造放法");
}
}
public class TestStatic {
public static void main(String[] args) {
new SmallBread();
}
}
运行结果:
父类代码块
父类构造方法
父类静态代码块
父类代码块
父类构造方法
子类代码块
子类构造放法
子类静态代码块
父类代码块
父类构造方法
子类代码块
子类构造放法