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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© java陈辉 中级黑马   /  2013-12-18 17:08  /  1057 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

以下这段代码为什么要编译失败?为什么不是执行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);
          }

}

评分

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

查看全部评分

4 个回复

倒序浏览
因为Zi这个类继承了Fu
那么Zi这个类中必须有一个构造函数去访问Fu这个类中的构造函数
Zi这个类中的构造函数的第一行加一句
super(x);
就可以了
结果是
Fu run6
Zi run6
如果想要只打印Zi run6
可以在Fu这个类中加一个空参数的构造函数
Zi这个类中的构造函数的第一行写
super();
就可以了
注意super语句必须在构造函数的第一行

评分

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

查看全部评分

回复 使用道具 举报
楼上说的很对,因为你的子类继承啦父类,而父类你定义有参数的构造函数,java默认的隐式无参方法则不会存在,所以你子类在定义 Zi(int x)
         {
                System.out.println("zi run"+x);
          }
构造函数时,会报编译错误,必须在第一行加上super(x);
如果想单独运行结果为zi run6,可以在父类自己手动加上隐式的构造函数。

评分

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

查看全部评分

回复 使用道具 举报
Y_Y 中级黑马 2013-12-18 18:47:49
板凳
创建类时是先执行父类的构造函数的,只是在执行父类的构造函数时会看子类构造函数来确定执行哪个父类构造函数,在子类中如果调用父类构造函数既super()时必须放在第一句。实例化时是先有父类。
回复 使用道具 举报
因为子类在初始化的时候要先初始化父类,所以在子类构造函数的第一行都会默认的调用super();默认先初始化父类,当父类中没有空构造函数的时候,需要手动指定父类的有参构造函数.但是记住只能放在子类的构造函数第一行
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马