Note:
所有的子类构造方法默认调用父类的无参构造方法,只有当子类构造方法中指明调用父类的构造方法时,才会调用相应的父类构造方法。
Example:
public class Person {
Person(){
System.out.println("This is the Person!");
}
Person(String s){
System.out.println("Person : "+s);
}
}
public class Chinese extends Person{
Chinese(){
System.out.println("This is a Chinese!");
}
Chinese(String name){
super(name);
System.out.println("Chinese name is : "+name);
}
Chinese(String name,String address){
this(name);
System.out.println(name+"'s address is:"+address);
}
public static void main(String args[]){
Chinese c=new Chinese("XiaoWang");
}
}
运行的结果为:
Person : XiaoWang
Chinese name is : XiaoWang
在子类中可以使用super来调用父类的构造方法,可以使用this来调用自身的构造方法。
如:当main变成如下代码时,
public static void main(String args[]){
Chinese c=new Chinese("XiaoWang","Shenzhen");
}
运行的结果为:
Person : XiaoWang
Chinese name is : XiaoWang
XiaoWang's address is:Shenzhen
请注意:
如果把子类的构造函数改成如下形式是错误的:
Chinese(String name){
System.out.println("Chinese name is : "+name);
super(name);
}
调用构造函数的语句必须放在构造函数所有语句的最前面。
所以,如下的形式也自然是错误的:
Chinese(String name,String address){
super(name);
this(name);
System.out.println(name+"'s address is:"+address);
}
因为super(name)和this(name)会去竞争第一语句的位置。
由上面的描述,我们也可以得到下面的结论:
当有多层继承关系的时候,构造函数的执行顺序也是自上而下的,即先执行顶层类的构造函数,然后顺次执行到最低层类的构造函数,可以用栈的思想来理解。