Java 在创建对象的时候会要执行它的构造函数。不仅如此,Java 还要执行父类的构造函数,往上一级一级直到没有父类为止。对于初学者来说,有三个问题不容易搞懂:

 1、父类的构造函数是否一定会执行?

2、是先执行子类的构造函数还是先执行父类的构造函数?

3、如果父类有多个构造函数,那么 Java 会选择哪一个? 

- 父类的构造函数是否一定会执行?

是的,父类的构造函数一定会执行。所以如果某个类的层次很深,那么它创建对象时就会要执行一大堆的构造函数。 

- 是先执行子类的构造函数还是先执行父类的构造函数?

Java 会顺着继承结构往上一直找到 Object,然后从 Object 开始往下依次执行构造函数。先执行父类的构造函数,那么子类的构造函数执行的时候就不需要担心父类的成员是否初始化好了。 

- 如果父类有多个构造函数,那么 Java 会选择哪一个?

如果父类有多个构造函数,那么子类可以在构造函数中选择其中一个(且最多只能选择一个)来执行。如果子类没有选择,那么 Java 将会执行父类的缺省构造函数。

这个问题涉及到两个个基础知识:

1. 所有的class都必须有一个构造方法,如果你没有在代码里声明构造方法,系统会自动给你生成一个公有无参的构造方法。而只要你自己声明了一个构造方法,无论有参无参,私有公有,系统就不再帮你生成默认无参构造器了。

2. 所有的子类构造器都要求在第一行代码中调用父类构造器,如果不写,系统默认去调用父类的无参构造器。

关于默认构造函数和无参数构造函数

当new一个对象时,先判断是否调用的构造函数有参数,如果有参数,则根据参数的个数、类型来自动调用相应的构造函数构造对象,分配内存,并返回对象的引用。

“如果定义了一个带参数的构造方法后,就一定要定义一个不带参数的构造方法,否则就不能创建新对象(无参数)。”

因为当构造一个类的对象时,编译器首先判断类是否有构造函数,如果没有,则自动加上一个默认构造函数,而一旦发现有构造函数后,则不再自动加上构造函数。

转而认为你没有用类的合法的构造函数而报出编译错误。