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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 侯凯斌 中级黑马   /  2013-1-13 15:45  /  1507 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 侯凯斌 于 2013-2-18 11:48 编辑

以前没注意这个问题,刚才回答比人问题时候编程试验了下,发现了好多问题啊···(有点绕嘴)
大概是,我在父类中定义了一个有参的构造函数以后,子类中必须要在构造函数中调用super。不然编译器报错,如下
  1. class Person
  2. {
  3.         private String name;
  4.         
  5. //        Person(){  //注释掉,子类就会报错
  6. //               
  7. //       }
  8.         public Person(String name)
  9.         {
  10.                 this.name=name;
  11.         }
  12.         public String getName()
  13.         {
  14.                 return name;
  15.         }
  16. }
  17. class Student extends Person
  18. {        
  19.                 String name;
  20.                 Student(String name){ // 要我必须
  21.                         this.name = name ;
  22.         }        
  23.         
  24. }
复制代码
注释掉了person()后,子类就必须调用super,而在父类中显示定义了Person()以后,子类就可以随便定义构造函数了··。
子类自己定义自己的构造函数咋就不可以呢。为什么非要调用父类的super()呢??

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
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){ // 要我必须

               因为自动调用的五参构造函数被注释了,super();不存在了你必须手动调用父类方法了!

                在这里添行代码:super(name);
                        this.name = name ;
        }        
        
}

子类的构造函数中默认有一个调用父类的构造函数,原来父类中没有带参的构造函数时,里面有一个隐式的构造函数,它是没有参数的,而如果父类中定义了构造函数那个隐式的构造函数就没有了。而子类的构造函数中会自动的去调用父类的构造函数用来给自己初始化,继承父类的东西,然而这时,你的父类的两个重载的构造函数,你把无参构造函数的删了,那子类构造函数自动调用时,只能调用那个带参的构造函数,然而你并没有给他提供参数,当然会报错!

评分

参与人数 1技术分 +1 收起 理由
金鑫 + 1

查看全部评分

回复 使用道具 举报
父类的构造函数负责给子类对象初始化,子类对象的构造函数默认第一行村子隐式的super()语句,访问父类空参数的构造函数,如果父类中定义了有参的构造函数,空参数构造函数就不存在了。子类对象在初始化调用父类空参数构造函数不存在会报错
回复 使用道具 举报
子类自己定义自己的构造函数咋就不可以呢。为什么非要调用父类的super()呢??


因为子类在初始化之前一定要先初始化父类,如果父类中super()去掉的话,子类中初始化无参的构造方法找不到父类中的无参构造方法,那父类就无法初始化,就出错
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马