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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄达标 黑马帝   /  2011-12-16 17:57  /  2518 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黄达标 于 2011-12-16 18:28 编辑

class Super
{
        int i=0;       
        public Super(String s)
        {
                i=1;       
        }
}
class Demo extends Super
{
        public Demo(String s)
        {
                i=2;                       
        }
        public static void main(String[] args)
        {
                Demo d=new Demo("yes");
                System.out.println(d.i);
        }
}
//编译失败,因为父类中缺少空参数的构造函数。
//或者子类应该通过super语句指定要调用的父类中的构造函数。

这是视频里老师讲的,但是没看懂,为什么父类中要定义空参数的构造函数?

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

8 个回复

倒序浏览
本帖最后由 余松霖 于 2011-12-16 18:27 编辑
  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.                  //你这里默认有个super();这里默认调用了父类的空参数构造函数
  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. }
复制代码
你父类定义了带参的构造方法,所以系统不会帮你生成无参构造方法,而你子类调用父类无参构造方法的时候就会提示父类没有无参构造方法。所以编译失败!

你这里调用了父类的空参数构造函数.所以必须父类中有这个函数.
其实定义不定义不是必须的,但一般做开发的话还是需要定义。不定义你就不能使用无参数构造函数

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 monghuan 于 2011-12-16 18:52 编辑

在子类的构造函数中,如果你没有显式调用super,那么它默认会自动调用父类的无参构造函数。
  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)   //2.开始调用子类构造函数,
  12.         {                               //3.这边你没有显示调用super,所以它会自动调用父类的无参构造函数,相当于写有该代码:“super();”,然后,调用父类的无参构造函数,但是父类并没有,所以编译出错!!
  13.                 i=2;                        
  14.         }
  15.         public static void main(String[] args)
  16.         {
  17.                 Demo d=new Demo("yes"); //1.会调用Demo(String)构造函数
  18.                 System.out.println(d.i);
  19.         }
  20. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
余松霖 发表于 2011-12-16 18:18
你这里调用了父类的空参数构造函数.所以必须父类中有这个函数.
其实定义不定义不是必须的,但一般做开发的 ...

忘记了有个默认的super();了。。。。。。
了解了了解了。。。。谢谢回答
回复 使用道具 举报
本帖最后由 熊明春 于 2011-12-16 18:29 编辑
  1. class Super {
  2.         int i = 0;

  3.         public Super(String s) {
  4.                 i = 1;
  5.         }
  6. }
  7. class Demo extends Super {
  8.         public Demo(String s) {
  9.                 super(s);       //这里只需指明调用父类的构造函数就OU了
  10.                 i = 2;
  11.         }
  12.         public static void main(String[] args) {
  13.                 Demo d = new Demo("yes");
  14.                 System.out.println(d.i);
  15.         }
  16. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
黄达标 发表于 2011-12-16 18:28
忘记了有个默认的super();了。。。。。。
了解了了解了。。。。谢谢回答

不客气   共同进步!
回复 使用道具 举报
刘志祥 黑马帝 2011-12-17 07:42:35
7#
monghuan 发表于 2011-12-16 18:26
在子类的构造函数中,如果你没有显式调用super,那么它默认会自动调用父类的无参构造函数。 ...

这么一看注释,我也明白了!!!
回复 使用道具 举报
刘志祥 黑马帝 2011-12-17 07:47:29
8#
这样的话,你只要在子类中显示调用 父类的构造方法就不会出错了。
如在子类构造方法中:super(参数);
应该super的显示调用放在子类构造方法的第一行吧!
因为隐式调用的时候它就隐藏在了第一行啊!
回复 使用道具 举报
舒远 黑马帝 2011-12-17 10:25:48
9#
子类构造函数中会隐式调用父类的无参构造函数:通过super()来调用,你的父类中有参数的构造函数覆盖了无参的默认的构造函数,子类中的有参构造函数没有显式调用super(s),则默认使用了super()来调用,因为没有在父类中定义无参的构造函数,编译就会出错。
想要编译通过,两种方法:
1.在子类中的构造函数第一句显式调用super(s);
2.在父类中定义一个无参构造函数。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

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