在单一类中:
执行顺序为:(静态变量、静态代码块)(同声明的先后顺序有关)-->(非静态变量、非静态代码块)(同声明的先后顺序有关)--> 构造方法
在有继承关系的子父类中
执行顺序为:(父类静态变量、父类静态代码块)(同声明的先后顺序有关)-->(子类静态变量、子类静态代码块)(同声明的先后顺序有关)-->(父类非静态变量、父类非静态代码块)(同声明的先后顺序有关)-->(父类构造方法)-->(子类非静态变量、子类非静态代码块)(同声明的先后顺序有关)-->(子类构造方法)
代码部分
package com.atguigu.java;
//静态变量和静态代码块、成员变量和普通代码块、构造器加载顺序总结
public class StaticDemo {
public static String s = "父类静态变量";
static {
System.out.println(s);
String ss = "父类静态代码块";
System.out.println(ss);
}
public StaticDemo(){
System.out.println("父类构造器");
}
public String sss = "父类非静态变量";
{
System.out.println(sss);
String ssss = "父类普通代码块";
System.out.println(ssss);
}
}
class StaticDemo1 extends StaticDemo{
public static String m = "子类静态变量";
static{
System.out.println(m);
String mm = "子类静态代码块";
System.out.println(mm);
}
public StaticDemo1(){
System.out.println("子类构造器");
}
public String mmm = "子类非静态变量";
{
System.out.println(mmm);
String mmmm = "子类普通代码块";
System.out.println(mmmm);
}
}
测试部分
package com.atguigu.java;
public class StaticTest1 {
public static void main(String[] args){
StaticDemo1 sd = new StaticDemo1();
}
}
结果
父类静态变量 父类静态代码块 子类静态变量 子类静态代码块 父类非静态变量 父类普通代码块 父类构造器 子类非静态变量 子类普通代码块 子类构造器
对上面的代码块和变量顺序稍作修改,就会发现结果会变得不同。



