黑马程序员技术交流社区

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

作者: 健健    时间: 2015-3-11 12:55
标题: 关于构造函数
本帖最后由 健健 于 2015-3-12 11:02 编辑
  1. class Super
  2. {
  3.         int i = 0;
  4.         public Super(String s)
  5.         {
  6.                 i = 1;
  7.         }
  8.         
  9. }

  10. class Demo extends Super
  11. {
  12.         public Demo(String s)
  13.         {
  14.                  i = 2;
  15.         }
  16.         public static void main(String[] args)
  17.         {
  18.                 Demo d = new Demo("yes");
  19.                 System.out.println(d.i);
  20.         }
  21. }
复制代码

为什么编译失败?
作者: 田得聖老师    时间: 2015-3-11 13:12
你那两个String 是干嘛用的?
删了   删了就过了
作者: saralihuan1992    时间: 2015-3-11 13:34
你的Demo类继承了Super类,应该在Demo类的构造方法的第一行添加super.Super("xxx"); 应该先用super调用一下父类的构造方法。
作者: 1021361407    时间: 2015-3-11 13:49
在Super中加一个无参构造函数,或者Demo的构造函数中第一句加一句super(s);否则默认的是super();(不显示)这时在父类中找不到这个无参构造函数,就会编译失败
作者: 健健    时间: 2015-3-11 13:50
saralihuan1992 发表于 2015-3-11 13:34
你的Demo类继承了Super类,应该在Demo类的构造方法的第一行添加super.Super("xxx"); 应该先用super调用一下 ...

              谢谢
作者: 路文龙    时间: 2015-3-11 14:35
1、如果一个类中没有定义构造器,编译器在编译时会自动加上默认无参构造器:
  public ClassName {}
2、this 和 super 的区别。
3、每个类直接或间接是Object的子类,Object只有一个无参构造方法。
4、编译器会在每个构造方法的第一行隐式添加父类的默认无参构造器,即添加super()。
   上述代码中 因为父类定义了一个带参数的构造器,因此编译器不会添加默认无参构造方法,但是因为在子类的构造器中没有显式调用父类的某个构造方法,因此编译器会自动添加super()方法, 但是父类中不存在默认无参构造方法,因此会提示默认无参构造方法未定义错误。
因此实现父类中的无参构造函数,就不会报错了。




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