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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘_浩 中级黑马   /  2012-4-3 13:05  /  2233 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

友友们请问一下
在继承当中,父类定义了非空参数的构造函数,则系统就不会自动加上空参数的构造函数。那么在建立子类空参数的对象时,除了去子类当中进行相对应的初始化之前,还会去父类中做什么呢?还是不去父类中?

9 个回复

倒序浏览
子类会调用父类的空参数构造函数
回复 使用道具 举报
蒙武辉 发表于 2012-4-3 13:07
子类会调用父类的空参数构造函数

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

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

所以上面问题中如果你只创建了父类有参构造方法,那么子类中不显示指明就会默认去初始化父类空参数构造方法。
所以编译会失败。
回复 使用道具 举报
本帖最后由 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. }
复制代码
回复 使用道具 举报
new Zi(); 没指明参数,所以会去class Zi 里面的Zi() 方法体内进行初始化。 然后完了。。。

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

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

上面代码Zi 类 ...

谢谢你,我明白的了。
回复 使用道具 举报
葛尧 发表于 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. }
复制代码
我试过了,没有报错。你也看看
回复 使用道具 举报
  继承中,子类实现父类,子类构造函数中有一个默认的super();这个你不添加系统自动加上的,你在创建子类对象的时候,子类构造函数是空参会到哦父类去进行初始化,如果子类有构造函数,就会去覆盖父类的构造函数。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马