Java的派生类在对内存中有两部分构成,一部分是继承自父类的对象,另一部分则是本身新有的成员。 所以,在构造派生类对象时,应该先构造父类对象,调用父类的构造函数(Constructor)。在派生类没有显式调用父类的构造函数时,Java编译器调用父类的默认构造函数(就是无参数的构造函数)。

示例:
this关键字指代当前对象 this();是当前对象的构造函数
super关键字指代父类对象 super();是父类构造函数

class  Person  {
private String name;
private int age;
//默认构造函数
Person() {
this("DefaultName",20); //调用重载构造函数,必须放在函数体第一行
System.out.println("Person default constructor!");
}
Person(String name,int age) {
this.name=name;
this.age=age;
}
public void display() {
System.out.println("Name:"+name);
System.out.println("Age:"+age);
}
}
class  Student extends Person  {
private String school;
//默认构造函数这里会自动调用父类默认构造函数
Student() {
System.out.println("Student default constructor!");
this.school="DefaultSchool";
}
Student(String name,int age,String school) {
super(name,age);//调用父类构造函数,必须放在函数体第一行
this.school=school;
}
//重写函数
public void display() {
super.display();
System.out.println("School:"+school);
}
}
public   class  ConstructorTest  {
public static void main(String[] args) {
Person p1=new Person();
System.out.println();
p1.display();
System.out.println();
Person p2=new Person("nyzhl",22);
System.out.println();
p2.display();
System.out.println();
Student s1=new Student();
System.out.println();
s1.display();
System.out.println();
Student s2=new Student("zhaohongliang",23,"Nanyang Normal Univercity");
System.out.println();
s2.display();
}
}

运行结果:

Person default constructor!
Name:DefaultName
Age:20Name:nyzhl
Age:22Person default constructor!
Student default constructor!Name:DefaultName
Age:20
School:DefaultSchoolName:zhaohongliang
Age:23
School:Nanyang Normal Univercity

分析:

          

Person p1=new Person();
       声明新对象p1 调用Person默认构造函数 
        Person p2=new Person("nyzhl",22);
            声明新对象p2 调用Person第二个重载构造函数
  Student s1=new Student();
        声明新对象s1 先父类调用Person默认构造函数,再调用Student类默认构造函数
        Student s2=new Student("zhaohongliang",23,"Nanyang Normal Univercity");
           声明新对象s2  过程如下
           new Person("zhaohongliang",23);
        this.school="Nanyang Normal Univercity";