子类静态属性、子类属性赋值、子类构造函数、子类构造代码块、子类静态代码块、父类静态属性、父类构造函数、父类构造代码块、父类静态代码块执行顺序

先看父类构造方法、子类构造方法、子类属性赋值

class Father {
	public Father() {
		System.out.println("父类构造方法");
		show();
	}

	public void show() {
		System.out.println("父类show");
	}
}

class Son extends Father {
	int num = 2;

	public Son() {
		System.out.println("子类构造方法 num=" + num);
	}

	public void show() {
		System.out.println("子类show num=" + num);
	}
}

public class Test {
	public static void main(String[] args) {
		Son s = new Son();
	}
}

子类静态属性、子类属性赋值、子类构造函数、子类构造代码块、子类静态代码块、父类静态属性、父类构造函数、父类构造代码块、父类静态代码块执行顺序_第1张图片
由输出结果可以看出当调用子类构造方法时默认先调用类父类的构造方法,所以父类构造方法优先级高于子类构造方法,但调用show方法时num的值是默认的0,子类构造方法输出时num成功赋值,所以属性的赋值执行顺序应该在父类构造方法之后。

然后在父类、子类中加入构造代码块

{
		System.out.println("父类构造代码块");
}
{
		System.out.println("子类构造代码块 num=" + num);
}

子类静态属性、子类属性赋值、子类构造函数、子类构造代码块、子类静态代码块、父类静态属性、父类构造函数、父类构造代码块、父类静态代码块执行顺序_第2张图片
从结果看出构造代码块执行顺序应该是在构造方法前,属性赋值之后

再把静态代码块加入父类和子类中

static {
		System.out.println("父类静态代码块");
}
static {
		System.out.println("子类静态代码块");
}

子类静态属性、子类属性赋值、子类构造函数、子类构造代码块、子类静态代码块、父类静态属性、父类构造函数、父类构造代码块、父类静态代码块执行顺序_第3张图片
静态代码块随着类的加载执行,这里可以看出是父类应该是先于子类加载的,所以先执行父类静态代码块再执行子类静态代码块

最后将父类加入静态属性,子类的属性改为静态的

父类

static int num = 1;

子类

static int num = 2;
static {
		System.out.println("子类静态代码块 num=" + num);
}

子类静态属性、子类属性赋值、子类构造函数、子类构造代码块、子类静态代码块、父类静态属性、父类构造函数、父类构造代码块、父类静态代码块执行顺序_第4张图片
将子类的属性改为静态之后除子类所有的num的输出结果都变为2,父类的num输出为1,可见静态属性的执行优先级高于静态代码块

执行顺序:父类静态静态属性–>父类静态代码块–>子类静态属性–>子类静态代码块–>父类构代码块–>父类构造方法–>子类属性赋值–>子类构造代码块–>子类构造方法

你可能感兴趣的:(子类静态属性、子类属性赋值、子类构造函数、子类构造代码块、子类静态代码块、父类静态属性、父类构造函数、父类构造代码块、父类静态代码块执行顺序)