Java中继承时静态块,构造块,构造函数的执行顺序
public class Father { static { System.out.println("Father静态块"); } { System.out.println("Father构造块"); } public Father() { System.out.println("Father构造函数"); } void func1() { System.out.println("Father方法 1"); } public static void main(String[] args) { Father father = new Son(); father.func1(); // 测试1 ((Son) father).func2(); // 测试2 // father.func2(); // 测试3 } } class Son extends Father { static{ System.out.println("Son静态块"); } { System.out.println("Son构造块"); } public Son() { System.out.println("Son构造函数"); } @Override void func1() { System.out.println("Son方法 1"); } void func2() { System.out.println("Son方法 2"); } }
结果:
父类静态块 -> 子类静态块 -> 父类构造块 -> 父类构造函数 -> 子类构造块 -> 子类构造函数
在main方法中:
测试1:father对象指向的是new 出来的Son对象,且Son对象继承Father对象并且重写(覆盖)了父类的func1() 方法,即这样的话,子类对象赋给父类对象,父类对象调用父类中被子类重写的方法时,实际是调用了子类中已经重写过的方法,即:
Father f = new Son(); f.func1();
Son s = new Son(); s.func1();
两者都是一样的,都是指向new 出来的Son 对象。
测试2:因为father对象指向new 出来的Son 对象,所以可以将father对象强制转换成 Son对象,这样就可以调用 Son对象的func2()方法,因为两者在内存上就是一样的存在。
测试3:错误,father对象不存在func2() 方法,只能强制转换成 Son对象,即可调用。