Java类的加载顺序
父类静态字段 → 父类静态代码块 → 子类静态字段 → 子类静态代码块 → 父类成员变量 → 父类非静态代码块 → 父类非静态构造方法 → 子类成员变量 → 子类非静态代码块 → 子类构造方法
package HelloWorld;
//父类静态 > 子类静态 > 父类非静态 > 父类构造方法 > 子类非静态 > 子类构造方法
class A {
private static int numA;
private int numA2;
//1
static {
System.out.println("A的静态字段 : " + numA);
System.out.println("A的静态代码块");
}
//3
{
System.out.println("A的成员变量 : " + numA2);
System.out.println("A的非静态代码块");
}
//4
public A() {
System.out.println("A的构造器");
}
}
class B extends A {
private static int numB;
private int numB2;
//2
static {
System.out.println("B的静态字段 : " + numB);
System.out.println("B的静态代码块");
}
//5 //7
{
System.out.println("B的成员变量 : " + numB2);
System.out.println("B的非静态代码块");
}
//6 //8
public B() {
System.out.println("B的构造器");
}
}
public class Father {
public static void main(String[] args) {
A ab = new B();
System.out.println("---");
ab = new B();
}
}
结果如下
A的静态字段 : 0
A的静态代码块
B的静态字段 : 0
B的静态代码块
A的成员变量 : 0
A的非静态代码块
A的构造器
B的成员变量 : 0
B的非静态代码块
B的构造器
---
A的成员变量 : 0
A的非静态代码块
A的构造器
B的成员变量 : 0
B的非静态代码块
B的构造器
有参构造的执行情况
//有参构造函数执行情况:
// 父类静态 > 子类静态 > 父类非静态 > 父类无参 > 子类非静态 > 子类有参
class A {
private static int numA;
private int numA2;
static {
System.out.println("A的静态字段 : " + numA);
System.out.println("A的静态代码块");
}
{
System.out.println("A的成员变量 : " + numA2);
System.out.println("A的非静态代码块");
}
public A() {
System.out.println("A的构造器");
}
public A(int n) {
System.out.println("A的有参构造");
this.numA2 = n;
}
}
class B extends A {
private static int numB;
private int numB2;
static {
System.out.println("B的静态字段 : " + numB);
System.out.println("B的静态代码块");
}
{
System.out.println("B的成员变量 : " + numB2);
System.out.println("B的非静态代码块");
}
public B() {
System.out.println("B的构造器");
}
public B(int n) {
System.out.println("B的有参构造");
this.numB2 = n;
}
}
public class Father {
public static void main(String[] args) {
B anotherB = new B(1);
}
}
结果为:
A的静态字段 : 0
A的静态代码块
B的静态字段 : 0
B的静态代码块
A的成员变量 : 0
A的非静态代码块
A的构造器
B的成员变量 : 0
B的非静态代码块
B的有参构造
有参构造函数执行情况:
父类静态 > 子类静态 > 父类非静态 > 父类无参 > 子类非静态 > 子类有参
可以看到,当为参构造时,父类执行的是无参构造,子类进行的是有参构造。也就是说如果子类构造器中未显示指定父类构造器,那么将会默认执行父类的无参构造。那么如果此时你将无参构造去掉,会发现报出编译错误。所以,如果你重载了一个父类的有参构造,子类必须要指定无参构造。