黑马程序员技术交流社区

标题: 为什么编译会错误?求解 [打印本页]

作者: 苏周周    时间: 2014-5-19 22:21
标题: 为什么编译会错误?求解
本帖最后由 苏周周 于 2014-5-23 21:54 编辑

给定如下一个Java源文件Child.java,编译并运行Child.java

class Parent1 {  

    Parent1(String s){  

        System.out.println(s);

    }

}  

class Parent2  extends Parent1{

    Parent2(){  

        System.out.println("parent2");

    }  

}  

public class Child extends Parent2 {  

    public static void main(String[] args) {  

     Child child = new Child();

    }

}  
求解为什么编译错误啊?大神们
作者: szsycwb    时间: 2014-5-19 22:32
本帖最后由 szsycwb 于 2014-5-19 22:36 编辑

子类任何构造方法,总会默认隐式调用父类空参数构造方法。
父类中没有空参数的构造方法,所以会出错。
解决办法:
1.在父类中增加一个空参数构造方法。
Parent1(){}
2.在子类Parent2的构造方法第一行调用父类有一个参数的构造方法。
super(......);

作者: jsjchenlong    时间: 2014-5-19 23:04
你代码的问题,我已在下面的代码中加注释说明了错误原因,以及解决方案,请看下面的代码中的注释:
class Parent1 {  

    Parent1(String s){  

        System.out.println(s);

    }

}  

class Parent2  extends Parent1{

        Parent2(){ //这里的问题是因为又一个隐藏的代码super();
                //这个super()是默认要调用Parent1类里的一个无参构造函数
                //由于你的Parent1类中没有,所以编译失败;
                //解决这问题,就是在Parent1类中加一个无参的构造方法就行了

        System.out.println("parent2");

    }  

}  


public class Child extends Parent2 {  

    public static void main(String[] args) {  

     Child child = new Child();

    }

}  
作者: liang090214    时间: 2014-5-19 23:17
貌似楼上正解
作者: 郝义涛    时间: 2014-5-19 23:38
#因为本来类都有默认Person()构造器的,但是当你自己定义了构造器后,默认构造器就不在了,所以Person2()就不能这么写了,他必须继承父类的构造函数,但是父类的无参构造没有了,所以只要在Person1()在增加一个无参构造函数就可以了#
作者: More    时间: 2014-5-20 08:19
要在Parent1中添加一个无参数构造器,因为在继承过程中,Parent2的无参数构造器会默认去调用其父类的无参数构造器,所以会报错
作者: 茂子    时间: 2014-5-20 08:31
jsjchenlong 发表于 2014-5-19 23:04
你代码的问题,我已在下面的代码中加注释说明了错误原因,以及解决方案,请看下面的代码中的注释:
class P ...

解释详细,赞一个……
作者: 喜爱    时间: 2014-5-20 09:07
Parent1没有无参的构造器,Parent2是Parent1的子类,在创建Parent2对象的时候,会默认调用父类的无参的构造器,而Parent1中没有无参的构造器。就会有错误!
作者: 赵京    时间: 2014-5-20 09:42
这是一道考试吗




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