日期:2014-05-20  浏览次数:20636 次

关于子类继承的问题
今天刚好看到了子类继承的问题,看到了子类的构造函数必定会调用父类的构造函数,看完了就自己写了点代码,于是预先了下面的可爱代码,父类中又一个含有两个参数的构造函数,而没有无参构造函数,子类中有一个无参的构造函数,编译的时候报错了,于是乎自己又去看了一遍教程。

经过自己的思考以后得出了下面的结论,如果说在自己编写子类的时候一定要确认父类中是否包含无参的构造函数,因为如果子类中我们写构造函数的时候,我们没有自己写super函数的话,系统会为我们添加无参数的super函数,但是父类中没有无参数的构造函数,那么就会报错。

这是个人的愚见,希望大牛们给予指正或者见解

------解决方案--------------------
嗯,子类肯定会默认调用父类中无参的构造器,如果父类中没有肯定会报错的!
------解决方案--------------------
其实对于父类来说,有4种情况:
1 无任何构造函数
这时实际上是有默认的(即无参数构造函数),这时子类的构造函数能够调用此默认构造函数. 子类怎么调用呢? 在构造函数里不用写super()(写上也可以),默认去调用了。

2 只有一个无参构造函数
这和第一种情况一样。

3 只有有参构造函数
这时因为父类有了构造函数,那就不存在默认的无参构造函数了。此时子类的构造函数的必须要有super(args)语句了。第一条语句如果不是super(args),那一定是this(***)语句。如果第一条语句既不是super(args),也不是this(xxx),那就是一个隐式的super()语句,但父类没有这个无参构造函数了,所以一定报错。

4 既有无参构造函数,又有有参构造函数。
这时最方便了,子类的构造函数里即使没有super(args)或this(xxx),也不会报错了,因为如果没有this(xxx),也没有super(args), 系统会调用super(),而父类里有这个构造函数。所以许多书上告诉我们,如果设计一个将被继承的类,最好有无参构造函数。

简单理解,父类有什么,子类用什么。(只是记住子类什么构造函数都没有时,是有一个无参构造函数;而一旦有了有参构造函数,就屏蔽了无参构造函数)。
以上个人浅见。

------解决方案--------------------
调用子类构造器会先调用父类的
如果没有参数就隐式调
如果有参数就必须用super显示调