最近总会遇到关于子类以及父类中的构造方法执行顺序的问题,以前也没仔细的注意过,于是就上网查了一些相关的资料并自己做了一个简单的测试,在这里做一下总结
如果在一个类中包含了静态代码块
,主方法
,构造代码块
,有参构造函数
,父类的方法
那么当运行主函数之后,执行的顺序为
静态代码块
>主方法
>构造代码块
>有参构造函数
>父类的方法
//父类的静态代码块
static{
System.out.println("父类的静态代码块");
}
//父类的主方法
public static void main(String[] args) {
System.out.println("父类的主方法");
FatherTest fatherTest = new FatherTest("父类的名称");
fatherTest.testMethod();
}
//构造代码块
{
System.out.println("父类的构造代码块");
}
//有参构造方法
FatherTest(String name){
this.name=name;
System.out.println("父类的有参构造方法"+name);
}
//父类的方法
public void testMethod(){
System.out.println("父类的方法");
}
静态代码块
静态代码块是在项目加载时候就会执行的,所以是第一个会被执行的,不需要类被实例化,所以如果需要项目在启动时,加载某些配置文件,可以将方法加到静态的代码块中去。所以静态代码块就不能写到方法中去。只能写在类中。
主方法
其实就是运行的一个方法,这也没什么可讲的吗,因为需要用方法来进行实例化 所以主方法是在静态代码块中第二个执行的。
构造代码块
构造代码块是依赖于构造函数生存的,一个一个类可以有不同参数的构造方法。所以不同的构造方法执行的代码都是不同的。但是构造代码块中的内容 在每一次实例化的时候 都会执行 。不在乎你是什么参数的构造函数。所以也可以用来计算创建对象的次数。
那么当子类继承了父类之后,子类和父类的代码块的执行顺序又是什么样子的呢,我个人觉得如果已经理解了静态代码块和构造代码块的执行顺序之后,是可以比较容易理解 子类的和父类代码块的执行顺序的。他的执行顺序是
父类的静态代码块
>子类的静态代码块
>父类的构造代码块
>父类的构造函数
>子类的构造代码块
>子类的构造函数
这里要注意的一点是不管子类的构造方法有没有参数,继承的父类走的都是无参的构造方法,不会因为调用了子类的有参构造方法,就会调用父类中同样的方法,父类只会执行无参的构造方法。如果子类重写了父类中的方法,那么运行时就不会再执行父类的方法了。而是执行子类中的方法。
还是建议大家自己测试一下,毕竟代码也比较简单,试过之后 印象也会更深刻一些。