创建子类实例时,会先执行父类构造函数定义的流程,再执行子类构造函数定义的流程。如下例:
class Some{
Some(){
System.out.println("调用Some()");
}
}
class Other extends Some{
Other (){
System.out.ptintln("调用Other()");
}
}
如果执行new Other(),是先执行Some()中的流程,再执行Other中的流程,也就是显示结果为:
调用Some()
调用Other()
继续看原因:
我们知道,父类中可以重载多个构造函数,如果子类构造函数中没有指定执行父类的哪一个构造函数,默认就会调用父类的无参构造函数。如果想要执行其他某一个构造函数,可以使用super()指定,例如:
class Some{
Some(){
System.out.println("调用Some()");
}
Some(int i){
System.out.println("调用Some(int i)");
}
}
class Other extends Some{
Other (){
super(10); //指定某一构造方法,不一定打印输出。
System.out.ptintln("调用Other()");
}
}
在这个例子中,new Other()时,首先执行了super(10),表示调用构造函数时传入int数值10,也就是调用父类中Some(int i)版本的构造函数,而后再继续执行Other()中super(10)之后的流程。
重点来了,其实当你这么撰写时:
class Some{
Some(){
System.out.println("调用Some()");
}
}
class Other extends Some{
Other (){
System.out.ptintln("调用Other()");
}
}
前面谈过,如果子类的构造函数中没有指定调用父类的哪一个构造函数,那么默认调用父类的无参构造函数,也就相当于你这么写:
class Some{
Some(){
System.out.println("调用Some()");
}
}
class Other extends Some{
Other (){
super(); //super()默认省略。
System.out.ptintln("调用Other()");
}
}
注意:
this()与super()只能择一调用,并且一定要在构造函数的第一行。