本文为学习笔记,留作自用,不会记载的特别详细,如有错误,欢迎指正
1. 关于无参构造函数与有参构造函数
我们都知道如果不定义无参构造函数系统会自动调用默认构造函数
当我们定义了一个有参构造函数,就必须手动定义一个无参构造函数
这里来尝试分析下原因,首先要了解下构造函数的调用逻辑
上图中我们可以看出子类的构造函数将会递归优先调用父类方法的
无参构造函数,效果相当于
class GrandFather{ public GrandFather(){ super(); System.out.println("高层构造函数"); } } class Father extends GrandFather{ public Father(){ super(); System.out.println("中层构造函数"); } } class Son extends Father{ public Son(){ super(); System.out.println("底层构造函数"); } }
只不过这里将super给隐藏了,这是系统默认会执行的语句
我们可以发现,无参构造函数在申明时默认调用的是父类的无参构造函数。
加入我们把中间一层的无参构造函数去掉,并只申明一个有参构造函数。
此时,编译器将提醒我们存在编译错误:Implicit super constructor Father() is undefined. Must explicitly invoke another constructor
强制要求我们申明Father类的无参构造函数,这是因为编译器认为,此时子类并不想走
父类的无参构造函数,但是又没有指明该走哪条路,这里的super()失效了,
所以我们可以给Son指出他的道路
只要显示的申明super(1),告诉子类递归走父类的哪一个构造函数即可。
由此可见,实际上一个类假如不作为父类,不申明无参构造函数并不会造成实际影响。
但我们并无法保证永远不作为子类这一前提,所以我们还是需要遵循规则去显示的申明。
值得注意的是,每个构造函数的首行如果没有显示的super父类构造函数,编译器将默认添加上super(),指向
父类的默认构造函数
在构造方法中调用另一个构造方法,调用动作必须置于最起始的位置。
不能在构造方法以外的任何方法内调用构造方法。
在一个构造方法内只能调用一个构造方法。