黑马程序员技术交流社区

标题: 继承时为何显式写出父类空参数构造函数? [打印本页]

作者: 不想飞不到    时间: 2014-8-9 00:08
标题: 继承时为何显式写出父类空参数构造函数?
本帖最后由 不想飞不到 于 2014-8-9 00:48 编辑

class Super
{
        int i=0;
        Super(){}//注释后编译失败
        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语句指定要调用的父类中的构造函数。(这句是什么意思,能有例子解释么?)

问:为什么要在继承时显式写出父类空参数构造函数?不是默认就有空参数构造函数么?                    通过查资料找到的,给大家分享一下
     当我们创建一个类的时候,如果我们没有创建一个构造方法(哪怕是无参数的)。JVM会帮助我们创建一个默认的构造方法,也称为无参构造方法。但是如      果我们创建一个构造方法时,JVM就不会再为我们生成一个默认的构造方法。有时有必要的显示的写出这个默认构造函数,也就是无参构造函数。所以当这      个类被继承时,子类就会默认的调用这个无参构造方法。
   如果你想显示的调用父类的构造方法,可以使用super()在子类的构造方法中的第一句。(构造方法中只能调用构造方法一次)。如果你在父类中没有写    无参构造方法,那么在子类的构造方法中必须显示的调用父类中的有参数的构造方法(写在第一句)。

作者: Bule丶    时间: 2014-8-9 00:11
因为实例子类的时候,会自动执行父类无参构造函数,
作者: 不想飞不到    时间: 2014-8-9 00:13
Bule丶 发表于 2014-8-9 00:11
因为实例子类的时候,会自动执行父类无参构造函数,

不是说创建类的时候会默认有空参数构造函数么?只是没写出来
作者: Bule丶    时间: 2014-8-9 00:21
本帖最后由 Bule丶 于 2014-8-9 00:22 编辑
不想飞不到 发表于 2014-8-9 00:13
不是说创建类的时候会默认有空参数构造函数么?只是没写出来

为什么呢?因为你实例化子类,虽然说是默认有无参构造函数,但是你既然父类指定了有参构造函数,那么无参的就不会自动有了,而只要new了子类,肯定会去找父类无参构造函数,所以你父类如果把无参构造函数注释掉,那就会报错的, 如果你在你子类的有参构造函数写上super();  然后父类不写无参试试,  我今晚坐的肩膀都疼了,桌子有点低
作者: 不想飞不到    时间: 2014-8-9 00:32
Bule丶 发表于 2014-8-9 00:21
为什么呢?因为你实例化子类,虽然说是默认有无参构造函数,但是你既然父类指定了有参构造函数,那么无参 ...

我把父类的无参构造注释了,然后子类的构造函数这样写就编译通过了

public Demo(String s)
{
      super(s);
      i = 2;
}
作者: 舍我其谁    时间: 2014-8-9 00:33
你自己定义了带参的构造了,jvm就不会帮你添加默认的空参构造了!
作者: 不想飞不到    时间: 2014-8-9 00:37
舍我其谁 发表于 2014-8-9 00:33
你自己定义了带参的构造了,jvm就不会帮你添加默认的空参构造了!

奥, 为什么我后来在子类构造方法加入super(s);编译就通过了,但这时父类还是没有空参构造么?
作者: 790324255a    时间: 2014-8-9 00:43
不想飞不到 发表于 2014-8-9 00:37
奥, 为什么我后来在子类构造方法加入super(s);编译就通过了,但这时父类还是没有空参构造么? ...

你这样是调用了父类的有参方法就不会报错 默认构造方法第一行是super() 你写super(s)就没有super()调用构造方法 就不会报错了
作者: 不想飞不到    时间: 2014-8-9 00:43
舍我其谁 发表于 2014-8-9 00:33
你自己定义了带参的构造了,jvm就不会帮你添加默认的空参构造了!

多谢提示~
作者: 烟海    时间: 2014-8-9 00:44
不想飞不到 发表于 2014-8-9 00:32
我把父类的无参构造注释了,然后子类的构造函数这样写就编译通过了

public Demo(String s)

加上super(s)之后,
请求了父类的有参构造函数:  
public Super(String s)
        {
                i=1;        
        }

所以就不会请求无参构造函数了。。请求的这个有参函数,这个函数存在,没有问题,所以正常。

因为不写super的时候,默认有个super() ,这个会请求父类中无参的,,
而你父类中有参的构造函数存在,就没有了默认的无参构造函数。。。而这时候还在请求父类中无参的,所以会报错。。
作者: 舍我其谁    时间: 2014-8-9 00:44
你这就显示调用了父类的带参构造了啊,所以不需要无参构造了
作者: 舍我其谁    时间: 2014-8-9 00:46
不想飞不到 发表于 2014-8-9 00:37
奥, 为什么我后来在子类构造方法加入super(s);编译就通过了,但这时父类还是没有空参构造么? ...


你这就显示调用了父类的带参构造了啊,所以不需要无参构造了
作者: 不想飞不到    时间: 2014-8-9 00:46
Bule丶 发表于 2014-8-9 00:21
为什么呢?因为你实例化子类,虽然说是默认有无参构造函数,但是你既然父类指定了有参构造函数,那么无参 ...

原因找到了,谢谢解答~




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