首先去看父类里面有没有静态代码块,如果有,它先去执行父类里面的静态代码块里面的内容;当父类的静态代码块里面的内容执行完毕后,接着去执行子类里面的静态代码块,当子类的静态代码块执行完毕后;
它接着又去查看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕后,接着执行父类的构造方法;父类的构造方法执行完毕后,接着去查看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕后再去执行子类的构造方法。
下面是一个例子进行验证:
package com.adu.test;
abstract class BaseParent{
int a =10;
public BaseParent(){
System.out.println("baseparent constructor ...");
}
static {
System.out.println("Base parent static block");
}
{
System.out.println("Base parent non static block");
}
public abstract void show();
}
class Father extends BaseParent{
int a = 11;
public Father(){
System.out.println("Father constructor ....");
}
static {
System.out.println("Father static block");
}
{
System.out.println("Father non static block ");
}
public void show(){
System.out.println("Father show ...");
}
}
class Child extends Father {
int a =12;
public Child(){
System.out.println("CHild constructor ...");
}
static {
System.out.println("Child static block");
}
{
System.out.println("Child non static block ");
}
public void show(){
System.out.println("Child show ...");
}
}
public class TestExtends {
public static void main(String[] args) {
// TODO Auto-generated method stub
Father father = new Child();
father.show();
}
}
这里输出是:
Base parent static block
Father static上 block
Child static block
Base parent non static block
baseparent constructor ...
Father non static block
Father constructor ....
Child non static block
CHild constructor ...
Child show ...
验证了结论。
main方法里面创建了子类child对象,并将引用返回给了父类,此时再调用重写的方法时,是调用的子类中的对应的方法。
该内容是这两天笔试中的一个题目,当时只记得先执行父类的构造方法,然后再是子类的构造方法。至于静态的程序块,则不确定其顺序,只知道他是在程序加载的时候静态的块就会被执行,因此想静态块肯定是在最前面,然后笔试的那道题应该是猜对了。但是这里还有非静态块的程序,到底是在什么顺序下执行?
经测试,静态块程序执行完毕后,是父类的非静态块,在是父类构造方法;然后是子类的非静态块,再者是子类的构造方法。这样的顺序,学习中啊。