黑马程序员技术交流社区

标题: 继承问题 [打印本页]

作者: 黄达标    时间: 2011-12-16 17:57
标题: 继承问题
本帖最后由 黄达标 于 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语句指定要调用的父类中的构造函数。

这是视频里老师讲的,但是没看懂,为什么父类中要定义空参数的构造函数?
作者: 余松霖    时间: 2011-12-16 18:18
本帖最后由 余松霖 于 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. }
复制代码
你父类定义了带参的构造方法,所以系统不会帮你生成无参构造方法,而你子类调用父类无参构造方法的时候就会提示父类没有无参构造方法。所以编译失败!

你这里调用了父类的空参数构造函数.所以必须父类中有这个函数.
其实定义不定义不是必须的,但一般做开发的话还是需要定义。不定义你就不能使用无参数构造函数
作者: 刘基军    时间: 2011-12-16 18:26
本帖最后由 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. }
复制代码

作者: 黄达标    时间: 2011-12-16 18:28
余松霖 发表于 2011-12-16 18:18
你这里调用了父类的空参数构造函数.所以必须父类中有这个函数.
其实定义不定义不是必须的,但一般做开发的 ...

忘记了有个默认的super();了。。。。。。
了解了了解了。。。。谢谢回答
作者: 小春同学    时间: 2011-12-16 18:28
本帖最后由 熊明春 于 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. }
复制代码

作者: 余松霖    时间: 2011-12-16 18:32
黄达标 发表于 2011-12-16 18:28
忘记了有个默认的super();了。。。。。。
了解了了解了。。。。谢谢回答

不客气   共同进步!
作者: 刘志祥    时间: 2011-12-17 07:42
monghuan 发表于 2011-12-16 18:26
在子类的构造函数中,如果你没有显式调用super,那么它默认会自动调用父类的无参构造函数。 ...

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




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