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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 史卜坤 中级黑马   /  2012-7-4 10:27  /  2061 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我在父类中定义了一个有参的构造函数以后,子类中必须要在构造函数中调用super。不然编译器报错,如下
  • class Person
  • {
  •         private String name;
  • //        Person(){  //注释掉,子类就会报错
  • //
  • //       }
  •         public Person(String name)
  •         {
  •                 this.name=name;
  •         }
  •         public String getName()
  •         {
  •                 return name;
  •         }
  • }
  • class Student extends Person
  • {
  •                 String name;
  •                 Student(String name){ // 要我必须
  •                         this.name = name ;
  •         }
  • }

复制代码
注释掉了person()后,子类就必须调用super,而在父类中显示定义了Person()以后,子类就可以随便定义构造函数了··。
子类自己定义自己的构造函数咋就不可以呢。为什么非要调用父类的super()呢??

4 个回复

倒序浏览
因为子类中的构造函数中第一行为隐式的super语句,会去调用父类中无参的构造函数,所以当你父类中没有无参的构造函数时,就会报错。这种情况下你需要在子类的构造函数中手动指定super语句去调用父类中有参的构造函数。
回复 使用道具 举报
子类继承父类后在子类构造函数中,会隐式写一句super() 去调用父类无参的构造函数,将父类加载进内存以便子类能够调用到父类的方法,但是如果父类没有无参构造函数子类在构造函数中隐式写的super(),就不能调用..就会报错,所以就需要显示的手动去写super语句并指定要调用的构造函数的实参,以便加载父类...但是要注意,要在子类构造函数显示定义super()语句的话..就不能再写this()语句去调用本类的其他构造函数,因为super()和this()都必须出现在构造函数的第一行,所以他们不能共存....

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
因为在子类的构造函数中第一行默认就会有一句super(),这句会去调用父类的空参数
的构造函数,而你的父类中已经写了一个带参数的构造函数,所以这个默认的空参数
的构造函数就会自动消失。这时,你要么在父类中加上空参数的构造函数,要么在子类
中手动调用自己写好的父类的构造函数。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
★╃小胖╃☆ 发表于 2012-7-4 13:03
首先子类继承父类所有成员变量和成员方法,但是子类不能继承父类的构造方法.但是子类的构造方法中可以用supe ...

子类不能继承父类的private成员和构造函数
父类的成员变量private String name,是不能继承的,所以子类必须定义
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马