A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 张俊飞 中级黑马   /  2013-12-15 19:47  /  1200 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天写代码,发现了这样一个问题,我在定义父类的时候定义了一个带参数的构造方法,但在定义子类的时候错误提示说父类必须要有一个无参的构造方法,这是为什么呢。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

5 个回复

倒序浏览
在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行有一条隐式的语句super();而父类中如果没有自定义的构造函数,那么会有默认的空参数构造函数,而父类如果自定义了带参数的构造函数,那么就不存在默认的空参函数了,而子类在默认调用super( )时找不到父类的空参构造函数,那么会报错。如果父类自定义了带参构造函数,那么子类初始化时必须要调用该带参数的构造函数。
子类一定要访问父类中的构造函数,因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的,所以子类在对象初始化时 ,要先访问一下父类中的构造函数,如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定。

注意:super语句一定要定义在子类构造函数的第一行。

子类的实例化过程:

结论: 子类的所有的构造函数,默认都会访问父类中空参数的构造函数,因为子类每一个构造函数内的第一行都有一句隐式super();

当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问父类中的构造函数。

当然,子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。子类中至少会有一个构造函数会访问父类中的构造函数。
毕老师的基础视频第7天讲的很清楚,建议你再仔细学习巩固一下

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
构造函数是用来给对象初始化的,子类必须继承父类的方法,所以你子类是不是也要有相同的参数呢?试试给子类加一句第一句加上super(参数);
回复 使用道具 举报
1.子类中所有的构造函数默认都会访问父类中空参数的构造方法
(因为每个构造方法的第一行都有一条默认的语句super())
2.当父类中没有空参数的构造方法时,子类的构造函数必须通过this或者是super指定要访问的构造方法,或者手动提供无参构造方法。
  1. public class Father {
  2.                 public Father (){}//父类空参构造函数
  3.                 public Father(String str){}//有参的构造函数
  4. }
  5. class Son extends Father{
  6.                 public Son (){
  7.                         super();//子类中所有的构造函数默认都会访问父类中空参数的构造方法。
  8.                 }
  9.        
  10. }
复制代码
回复 使用道具 举报
因为,子类的构造方法,每一行默认有一个super();调用父类的无参构造方法,完成父类成员变量的初始化,因为你父类写了带参的构造方法,所以默认的无参构造就没有了,你可以在子类构造方法的第一行写了super带参的,调用父类带参的构造方法就可以了。
回复 使用道具 举报
本帖最后由 绕世界流浪丶 于 2013-12-15 20:49 编辑
  1. public class Fu {
  2.                 public Fu (){}//父类空参构造函数
  3.                 public Fu(String str){}//有参的构造函数
  4. }
  5. class Zi extends Fu{
  6.                 public Zi (){
  7.                        // super();//子类构造第一行默认有一个super();
  8.                 }
复制代码

你不定义带参构造的时候,虚拟机默认会给你提供一个无参构造方法
定义带参构造后,就必须手动给出无参构造,才能使用无参构造。。。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马