黑马程序员技术交流社区

标题: 构造函数的一点小问题 [打印本页]

作者: 精彩生活向钱看    时间: 2013-6-7 00:07
标题: 构造函数的一点小问题
各位高手请教一个小问题,请问如果子类继承父类,那么我们都知道子类是要调父类的无参构造的,但是如果子类的构造函数是有参数的,父类的构造函数也是有参数的,那么此时子类怎么调用父类构造呢?还有假如子类的构造是无参的,父类的构造是有参的,那么又是一种什么情况呢?
作者: 王林涛    时间: 2013-6-7 00:25
当构造函数在父类中,是无参时,子类会默认访问父类中无参构造,因为在子类构造方法第一行会有默认的super();
但当父类中写了有参的构造函数时,系统默认的无参构造函数也就没有了!
作者: 小冰块    时间: 2013-6-7 00:44
本帖最后由 小冰块 于 2013-6-7 00:52 编辑

1、子类中所有的构造函数(不管有参没参)都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super();
2、如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数。
3、如果子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数。

关于第二点,举个例子:

  1. class Fu
  2. {
  3.         Fu(int x)
  4.         {
  5.                 System.out.println(x);
  6.         }
  7. }

  8. class Zi extends Fu
  9. {
  10.         String s = "ok";
  11.         Zi()
  12.         {
  13.                 super(4);//------------在这里指定要访问的父类构造函数+参数
  14.                
  15.         }
  16. }
复制代码

作者: 娄田田    时间: 2013-6-7 00:50
1、如果一个类没有构造方法,那么系统会为这个类提供一个无参的默认的构造函数;
2、一旦一个类中定义了其他有参的构造函数,系统将不再提供默认的构造函数;
3、如果父类中定义了有参的构造函数,并且没有显示的定义无参的构造函数,那么它的子类必须在它的构造函数(无论有参还是无参)中的第一行显示的调用super(参数);
4、super(参数)为父类中的某个构造函数。

作者: 孔雀东南飞    时间: 2013-6-7 19:14
楼主:
1、我所理解的子类构造函数调用父类构造函数是这样的:子类在继承父类的时候,是继承非private、非final、非构造函数的,但是,在父类的非默认构造函数中有可能会对父类的成员进行一些赋值,也就是初始化过程,而子类又不能继承父类构造函数,因此子类继承的成员都是父类构造函数初始化后的(你可以想一想,如果子类不继承父类构造函数,而子类继承成员后,父类构造函数又对父类成员赋值了,那么子类继承的成员与父类的成员不一致了,那还叫继承吗,因此子类继承父类,必须先用父类构造函数初始化父类成员)
2、子类构造函数内第一行用super无参数或带参数,其实另一种含义就是父类的构造函数中已经有一些功能了,而子类构造函数中要做同样的功能,因此子类构造函数中的代码可以不写了,而是直接调用父类的构造函数,用的是它的功能。
话说的比较绕,不知你明白没?演示下2的代码
class Fu
{
    int age;
    Fu(int age)
    {
         this.age = age;
    }
    Fu()
    {
     }
}
class Zi extends Fu
{
    Zi(int age)
    {
            super(age);//这里属于Zi 的this.age = age ;就可以不写了,直接调用父类构造函数功能就可以了
       //不用super(age)的话是下面代码
        super();
            this.age = age;//这里的this.age是属于Zi 的
    }
}
作者: 钟成军    时间: 2013-6-8 00:37
楼上的几位大哥都解释的非常详细,我也正有此问题,嘿嘿




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