黑马程序员技术交流社区

标题: 关于隐式构造函数 [打印本页]

作者: 侯凯斌    时间: 2013-1-13 15:45
标题: 关于隐式构造函数
本帖最后由 侯凯斌 于 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()呢??
作者: 高浩    时间: 2013-1-13 17:00
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 ;
        }        
        
}

子类的构造函数中默认有一个调用父类的构造函数,原来父类中没有带参的构造函数时,里面有一个隐式的构造函数,它是没有参数的,而如果父类中定义了构造函数那个隐式的构造函数就没有了。而子类的构造函数中会自动的去调用父类的构造函数用来给自己初始化,继承父类的东西,然而这时,你的父类的两个重载的构造函数,你把无参构造函数的删了,那子类构造函数自动调用时,只能调用那个带参的构造函数,然而你并没有给他提供参数,当然会报错!
作者: 李培根    时间: 2013-1-13 17:04
父类的构造函数负责给子类对象初始化,子类对象的构造函数默认第一行村子隐式的super()语句,访问父类空参数的构造函数,如果父类中定义了有参的构造函数,空参数构造函数就不存在了。子类对象在初始化调用父类空参数构造函数不存在会报错
作者: 邝雄伟    时间: 2013-1-13 17:11
子类自己定义自己的构造函数咋就不可以呢。为什么非要调用父类的super()呢??


因为子类在初始化之前一定要先初始化父类,如果父类中super()去掉的话,子类中初始化无参的构造方法找不到父类中的无参构造方法,那父类就无法初始化,就出错




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2