黑马程序员技术交流社区

标题: 关于子父类构造函数的问题 [打印本页]

作者: 刘_浩    时间: 2012-4-3 13:05
标题: 关于子父类构造函数的问题
友友们请问一下
在继承当中,父类定义了非空参数的构造函数,则系统就不会自动加上空参数的构造函数。那么在建立子类空参数的对象时,除了去子类当中进行相对应的初始化之前,还会去父类中做什么呢?还是不去父类中?
作者: 蒙武辉    时间: 2012-4-3 13:07
子类会调用父类的空参数构造函数
作者: 刘_浩    时间: 2012-4-3 13:09
蒙武辉 发表于 2012-4-3 13:07
子类会调用父类的空参数构造函数

可是我在父类中定义了含参数的构造函数,系统就不会自动添加空参数的构造函数了呀。怎么还会去调用呢?
作者: 蒙武辉    时间: 2012-4-3 13:21
如果你没有相对应的构造函数,系统就会报错
作者: 葛尧    时间: 2012-4-3 13:24
本帖最后由 葛尧 于 2012-4-3 13:26 编辑

子类中如果有多个构造方法,至少有一个子类构造方法,要在构造方法开头隐(显)式调用父类构造函数。
而其他的构造方法要么隐式调用父类空参数构造函数。
要么显示调用父类构造方法,或者去调用子类内部其他调用了父类构造方法的构造方法。(绕口了,就是子类初始化前一定会先去父类中进行初始化)

所以上面问题中如果你只创建了父类有参构造方法,那么子类中不显示指明就会默认去初始化父类空参数构造方法。
所以编译会失败。
作者: 刘_浩    时间: 2012-4-3 13:25
本帖最后由 liuhao411 于 2012-4-3 13:56 编辑
蒙武辉 发表于 2012-4-3 13:21
如果你没有相对应的构造函数,系统就会报错
  1. class Fu
  2. {
  3.         Fu(int x)
  4.         {
  5.                 System.out.println();
  6.         }
  7. }
  8. class Zi extends Fu
  9. {
  10.         Zi()
  11.         {       
  12.                 System.out.println();
  13.         }
  14.         Zi(int x)
  15.         {       
  16.                 System.out.println();
  17.         }
  18. }
  19. class Demo
  20. {
  21.         public static void main(String[] args)
  22.         {
  23.                 Zi zi=new Zi();//这个对象还会怎么做,给个流程看看谢谢。
  24.         }
  25. }
复制代码

作者: 葛尧    时间: 2012-4-3 13:34
new Zi(); 没指明参数,所以会去class Zi 里面的Zi() 方法体内进行初始化。 然后完了。。。

上面代码Zi 类 你没有继承Fu类啊。。所以可以正常编译通过。。。

如果继承了Fu类,因为Zi类中Zi(){} 构造方法中没有显示调用Fu(int x) 所以会编译失败!
因为Fu类中有了Fu(int x)构造方法,默认的Fu()就没有了。
作者: 刘_浩    时间: 2012-4-3 13:57
葛尧 发表于 2012-4-3 13:34
new Zi(); 没指明参数,所以会去class Zi 里面的Zi() 方法体内进行初始化。 然后完了。。。

上面代码Zi 类 ...

谢谢你,我明白的了。
作者: 刘_浩    时间: 2012-4-3 14:21
葛尧 发表于 2012-4-3 13:34
new Zi(); 没指明参数,所以会去class Zi 里面的Zi() 方法体内进行初始化。 然后完了。。。

上面代码Zi 类 ...
  1. class Fu
  2. {
  3.         Fu(int x)
  4.         {
  5.                 System.out.println();
  6.         }
  7. }
  8. class Zi extends Fu
  9. {
  10.         Zi()
  11.         {       
  12.                 System.out.println();
  13.         }
  14.         Zi(int x)
  15.         {       
  16.                 System.out.println();
  17.         }
  18. }
  19. class Demo
  20. {
  21.         public static void main(String[] args)
  22.         {
  23.                 Zi zi=new Zi();
  24.         }
  25. }
复制代码
我试过了,没有报错。你也看看

作者: 陈苓    时间: 2012-4-3 14:28
  继承中,子类实现父类,子类构造函数中有一个默认的super();这个你不添加系统自动加上的,你在创建子类对象的时候,子类构造函数是空参会到哦父类去进行初始化,如果子类有构造函数,就会去覆盖父类的构造函数。




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