学而不思则罔,思而不学则殆
结论
顺序如下:
- 父类静态代码块,父类静态成员变量(同级,按代码顺序执行)
- 子类静态代码块,子类静态成员变量(同级,按代码顺序执行)
- 父类普通代码块,父类普通成员变量(同级,按代码顺序执行)
- 父类构造方法
- 子类普通代码块,子类普通成员变量(同级,按代码顺序执行)
- 子类构造方法
注意点:
- 静态内容只在类加载时执行一次,之后不再执行。
- 默认调用父类的无参构造方法,可以在子类构造方法中利用super指定调用父类的哪个构造方法。
测试
父类:
public class Parent {
{
System.out.println("父类普通代码块1");
}
static {
System.out.println("父类静态代码块1");
}
private static int a = Helper.getParent1();
static {
System.out.println("父类静态代码块2");
}
private static int b = Helper.getParent2();
{
System.out.println("父类普通代码块2");
}
private int c = Helper.getParent3();
private int d = Helper.getParent4();
public Parent() {
System.out.println("父类构造函数");
}
}
子类:
public class Child extends Parent {
{
System.out.println("子类普通代码块1");
}
static {
System.out.println("子类静态代码块1");
}
private static int a = Helper.getChild1();
static {
System.out.println("子类静态代码块2");
}
private static int b = Helper.getChild2();
{
System.out.println("子类普通代码块2");
}
private int c = Helper.getChild3();
private int d = Helper.getChild4();
public Child() {
super();
System.out.println("子类构造函数");
}
}
帮助类:
public class Helper {
public static int getParent1() {
System.out.println("父类静态成员变量1");
return 1;
}
public static int getParent2() {
System.out.println("父类静态成员变量2");
return 2;
}
public static int getParent3() {
System.out.println("父类普通成员变量1");
return 1;
}
public static int getParent4() {
System.out.println("父类普通成员变量2");
return 2;
}
public static int getChild1() {
System.out.println("子类静态成员变量1");
return 3;
}
public static int getChild2() {
System.out.println("子类静态成员变量2");
return 4;
}
public static int getChild3() {
System.out.println("子类普通成员变量1");
return 3;
}
public static int getChild4() {
System.out.println("子类普通成员变量2");
return 4;
}
}
执行结果:
public static void main(String[] args) {
Child child1 = new Child();
System.out.println("---------------------------------------");
Child child2 = new Child();
}
父类静态代码块1
父类静态成员变量1
父类静态代码块2
父类静态成员变量2
子类静态成员变量1
子类静态代码块2
子类静态成员变量2
子类静态代码块1
父类普通代码块1
父类普通代码块2
父类普通成员变量1
父类普通成员变量2
父类构造函数
子类普通代码块1
子类普通成员变量1
子类普通成员变量2
子类普通代码块2
子类构造函数
---------------------------------------
父类普通代码块1
父类普通代码块2
父类普通成员变量1
父类普通成员变量2
父类构造函数
子类普通代码块1
子类普通成员变量1
子类普通成员变量2
子类普通代码块2
子类构造函数
静态代码块和静态成员变量只会执行一次(内部按照代码顺序执行)
执行顺序是先父类,后子类
普通代码块和普通成员变量每次新建对象的时候都会执行(内部按照代码顺序执行)
构造方法最后执行