黑马程序员技术交流社区

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

作者: java陈辉    时间: 2013-12-18 17:08
标题: 关于构造函数的问题
以下这段代码为什么要编译失败?为什么不是执行zi run6这段语句?求解释。
public class Test {

                public static void main(String[] args) {
                 new  Zi(6);
         }
}
class Fu
{
          Fu(int x)
         {
             System.out.println("fu run"+x);
          }  
}

class Zi extends Fu
{
         Zi(int x)
         {
                System.out.println("zi run"+x);
          }

}

作者: §傻、才乖    时间: 2013-12-18 17:22
因为Zi这个类继承了Fu
那么Zi这个类中必须有一个构造函数去访问Fu这个类中的构造函数
Zi这个类中的构造函数的第一行加一句
super(x);
就可以了
结果是
Fu run6
Zi run6
如果想要只打印Zi run6
可以在Fu这个类中加一个空参数的构造函数
Zi这个类中的构造函数的第一行写
super();
就可以了
注意super语句必须在构造函数的第一行
作者: 纷飞尽    时间: 2013-12-18 17:36
楼上说的很对,因为你的子类继承啦父类,而父类你定义有参数的构造函数,java默认的隐式无参方法则不会存在,所以你子类在定义 Zi(int x)
         {
                System.out.println("zi run"+x);
          }
构造函数时,会报编译错误,必须在第一行加上super(x);
如果想单独运行结果为zi run6,可以在父类自己手动加上隐式的构造函数。
作者: Y_Y    时间: 2013-12-18 18:47
创建类时是先执行父类的构造函数的,只是在执行父类的构造函数时会看子类构造函数来确定执行哪个父类构造函数,在子类中如果调用父类构造函数既super()时必须放在第一句。实例化时是先有父类。
作者: ┾——黑马    时间: 2013-12-18 18:52
因为子类在初始化的时候要先初始化父类,所以在子类构造函数的第一行都会默认的调用super();默认先初始化父类,当父类中没有空构造函数的时候,需要手动指定父类的有参构造函数.但是记住只能放在子类的构造函数第一行




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