黑马程序员技术交流社区

标题: 为什么要定义空构造方法? [打印本页]

作者: 于潇    时间: 2012-4-24 23:07
标题: 为什么要定义空构造方法?
在java类中定义一个空的构造方法到底会起到什么作用?
在一个父类中定义一个有参数的构造方法(没定义空的构造方法),为什么继承它的时候会出现错误?若在父类中定义一个空的构造方法怎么就不出错了呢?

作者: 张小庆    时间: 2012-4-24 23:12
不是吧,空参数的构造函数,是在你没有定义构造函数的情况下,自动生成的,如果你定义了,它就不回生成了啊
作者: 程序猿    时间: 2012-4-24 23:16
类在定义对象时都会调用构造方法的。构造方法是为对象初始化。空的构造方法的对象也可以调用类中的方法。
子类的构造方法隐藏一个super(); 调用父类无参的构造方法,你把父类定义一个有参的构造方法,无参的默认构造就不存在了,自然子类调用不到父类的无参构造就会报错。你手动在父类加一个无参的构造方法,子类对象的隐藏super()就能找得到了
作者: 张卯    时间: 2012-4-24 23:20
没有构造方法就没办法建立对象啊,所以默认有一个空参构造,而当你自己定义了有参的构造,空参的构造就没有了,子类继承时,子类的构造方法的第一行默认有隐式的super语句调用父类的空参构造,所以这时就报错了~建议再认真看下构造函数和继承相关章节的视频~
作者: 袁冬梅    时间: 2012-4-24 23:40
java中类的初始化依靠的是构造方法来实现的
当程序员没有创建类的构造方法时,系统会自动创建一个空参数构造函数,以便以后要创建类的对象的时候用来初始化对象
但是如果你创造了构造函数,那么系统就不会创建空参数构造函数了。
作者: 孙天    时间: 2012-4-25 00:03
因为子类在初始化的时候有最前面一条隐式语句super();找的就是父类中的空参数构造函数,除非你指定了要继承的构造方法。而父类在初始化的时候也是要找父类的父类(。。。)的构造函数的,它找的是Objcet类
作者: 高彰谦    时间: 2012-4-25 02:42
并不一定需要空参构造方法。
之所以会报错是因为,你继承父类的那个子类没有自己编写构造方法去调用父类的可用构造方法。
之所以会有这样的疑问是因为,一般在不指定构造方法时,编译器默认一个public的无参构造方法,默认情况下继承父类的子类的无参构造方法调用父类的无参构造方法。
作者: 盛光富    时间: 2012-4-25 08:46
子类中所有的构造方法默认都会访问父类中空参数的构造方法。
                        **因为每一个构造方法的第一行都有一条默认的语句super();

                      当父类中没有空参数的构造方法时,子类的构造函数必须通过this
                      或者super语句指定要访问的构造方法。类手动提供无参构造方法。

                      this(...):调用本类中的构造方法
                      super(...):调用父类中的构造方法

                      //Person p =new Person();  //系统默认给出无参构造

                      //当你手动给出构造方法后,系统就不会再给出默认的空的构造方法。




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