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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑文博 中级黑马   /  2012-7-6 17:34  /  2755 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郑文博 于 2012-7-6 18:54 编辑
  1. class Super
  2. {
  3.         int i=0;        
  4.         public Super(String s)
  5.         {
  6.                 i=1;        
  7.         }
  8. }
  9. class Demo extends Super
  10. {
  11.         public Demo(String s)
  12.         {
  13.                 i=2;                        
  14.         }
  15.         public static void main(String[] args)
  16.         {
  17.                 Demo d=new Demo("yes");
  18.                 System.out.println(d.i);
  19.         }
  20. }
复制代码
这段代码为什么编译失败?
说是父类缺少空参数的构造函数,可是我创建的对象是带有参数的啊。
是不是子类中有一个隐式super(){},必须要到父类中初始化呢?求解。。

7 个回复

正序浏览
:victory:这个我不知道啊
回复 使用道具 举报
苟苟 中级黑马 2015-4-29 08:28:54
7#
学习了。。。。
回复 使用道具 举报
本帖最后由 郑庆伟 于 2012-7-6 19:26 编辑

需要在父类中写一个构造方法Super(){}
回复 使用道具 举报
1、所有子类的构造函数(无参,有参)第一行都默认有一条super()语句调用父类无参构造函数
2、Demo d = new Demo("yes");这句话调用了public Demo(String s),而Demo(String s)又调用了父类的无参数构造函数,父类的无参数构造函数被重载了
3、在class super这个类里添加一个public Super(){},编译即可通过。
回复 使用道具 举报
问题有3点:
1 子类通过new构造方法创建对象,在调用构造方法时,默认执行的第一行是super();即调用父类的无参构造方法。
2. 如果父类没有无参构造方法,系统会调用父类的默认无参构造方法(也就是一个方法体为空的无参构造方法);
3 如果父类存在有参的构造方法同时没有无参构造方法,子类的构造方法就不能调用父类无参构造方法,表现就是编译不能通过。
你的程序中父类
01.class Super

02.{

03.        int i=0;        

04.        public Super(String s)

05.        {

06.                i=1;        

07.        }

08.}
有一个带参数的构造方法,这种情况下系统不会自动添加一个无参数,无方法体的构造方法就是super(){}。所以在子类在调用时会出错。

点评

嗯 就你回答的在理,谢了  发表于 2012-7-6 18:54

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 姬仁贵 于 2012-7-6 18:48 编辑

子类的所有的构造函数,默认的都会访问父类中空参数的构造函数。
因为子子类每一个构造函数内的第一行都有一句隐式super();
当父类没有空参数的构造函数时子类必须手动通过super语句形式来指定要访问父类中的构造函数。
class Super
{
        int i=0;        
        public Super(String s)
        {
                i=1;        
        }
}
class Demo extends Super
{

                public Demo(String s)
        {
                                super(s);//显示通过super语句形式来指定要访问父类中的构造函数
                i=2;                        
        }
        public static void main(String[] args)
        {
                Demo d=new Demo("yes");
                System.out.println(d.i);
        }
}
回复 使用道具 举报
这是一道子类继承父类时的一个必须显式的调用父类的构造函数的问题
在下面两种情况下,子类必须显式的继承父类的构造函数
1. 父类中没有默认的构造函数。
2.父类有默认构造函数,但子类的构造函数不想jvm调用父类默认的那个构造函数
所以你那一道题中的方法改为这样就行了

         Test(String s)

        {
                 super(s);

                i=2;                     
        }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马