子类当然可以调用父类的构造函数,
但是你的三个类都没有指明要继承谁,如extends ParentCC或extends ChildCC,
当然使用super(i)会出现错误了
如果你的“孙子”类是继承“父亲”类,就不会有错。
方法如下:
public class GrandChildCC extends ParentCC{ 
GrandChildCC(int i){
super(i);
System.out.println(";") ;
}

public static void main(String[] args) {
}
}
或者使用以下方法:
public class ParentCC {
public ParentCC(){
System.out.println("parent") ;
}

public ParentCC(int i){
System.out.println("parent:"+i) ;
}}
//---------------------------------------------
public class ChildCC extends ParentCC{
public ChildCC(int i){
super(i);
}
public ChildCC(int i,int j){
System.out.println("child:"+i) ;
}}
//---------------------------------------------
public class GrandChildCC extends ChildCC{
GrandChildCC(int i){
super(i);
System.out.println(";") ;
}

public static void main(String[] args) {
}
}

解决方案 »

  1.   

    忘记说了,在GrandChildCC类的main里加入如下代码:
    GrandChildCC gc=new GrandChildCC(4);
    你就可以看到结果是:
    -------
    parent:4
    ;
    -------
    可以看出GrandChildCC确实调用了ParentCC的构造函数
      

  2.   

    非常抱欠,因为最开始把几个类写在一个文件里,害怕是因为这个原因所以把三个类写成了三个public 类,后来测试搞忘了extends,不过extends也存在相同问题,iamwls所说经过测试好像完全正确!
    问题已经解决,现整理如下,望各位指正!!!
    =======================
    1.为什么孙子不能直接调用爷爷的构造函数?父亲不是已经继承了爷爷的构造函数吗?
    下面的文件中GrandChildCC.java中的super(i)编绎报错,通不过?小结:
    A.类可以限制子类的构造方法!是因为子类如果不显示覆盖父类的构造函数,那么父类的构造函数就已经在子类去除了 。
    B.由A可得:
    派生类只能调用它的基类的构造函数,而不能直接调用它的祖先类的构造函数。
    当然经常会出现这种情况,孙子调用父亲的构造函数时,父亲的构造函数又调用爷爷的构造函数。下面是我现在的文件-----------------------------------------------------------
    a.ParentCC.java文件  父亲类
    -----------------------------------public class ParentCC {
    public ParentCC(){
    System.out.println("parent") ;
    }

    public ParentCC(int i){
    System.out.println("parent:"+i) ;
    }

    public void f(){
    System.out.println("parent:f") ;
    }

    public ParentCC(String s){
    System.out.println("parent:s "+s) ;
    }}----------------------------
    b.ChildCC.java文件  儿子类
    -----------------------------------
    public class ChildCC extends ParentCC{
    public ChildCC(int i,int j){
    System.out.println("child:"+i) ;
    }

    //注意:此处的构造函数不需要super(s)是因为
    //在它的父类ParentCC中定义了无参数构造函数,
    //此处会自动调用父类ParentCC中的无参数构造函数
    public ChildCC(String s){
    System.out.println("child:s "+s) ;
    }}----------------------------
    c.GrandChildCC.java  孙子类
    ------------------------------
    public class GrandChildCC extends ChildCC{
    GrandChildCC(int i){
    //用super(i)调用爷爷的构造函数会编绎报错!也就是说只能调用父亲的构造函数
    //!super(i) ; 
    super(i,5) ;
    f() ; //可以调用爷爷的一般方法
    System.out.println(";") ;
    }

    //因为此类的父类ChildCC中没有定义无参数的构造函数,
    //所以必须显示调用super(参数),否则会编绎报错.
    public GrandChildCC(String s){
    super(s) ;
    System.out.println("child:s "+s) ;
    }

    public static void main(String[] args) {
    new GrandChildCC("4") ;
    }
    }PS:在三种情况下子类继承时关于构造函数的情况:父类只有不带参数的构造函数,父类只有带参数的构造函数,父类既有带参数的构造函数又有不带参数的构造函数A.父类的构造函数只有一个无参数的构造函数:
    如果父类的构造函数是默认的(即不带参数的),不管派生类的构造函数是否带数,则派生类的构造函数一定会自动地调用基类的构造函数。  当然明确的用super()调用也可以。
    这个派生类继续派生下来的类也遵循此规定,因此如果整个类系都是默认的构造函数,则会依次调用,从祖先的构造函数开始调用起,一直调用到最末端的派生类的构造函数。B.父类的构造函数只有一个带参数的构造函数:
    无论派生类的构造函数带参数或是不带参数,都必须首先明确的调用super关键字以及合适的参数明确的调用基类的构造函数。
    也就是说在调用基类的构造函数之前不能有任何东西。因为这样做会妨碍派生类的构造函数捕捉基类抛出的异常。
    C.父类的构造函数中有带参数和不带参数的多个构造函数时
    如果派生类的构造函数中不调用super(参数列表)来调用父类带参数的构造函数时,它会自动调用父类的不带参数的构造函数。
    当然这时,派生类中可以定义带参数或不带数的构造函数。
      

  3.   


    子构造的时候要先构造父,同样父构造的时候要构造爷。你在子里调用super(i),它就会找父的带i的构造函数,但是找不到,所以上溯到父就失败。
    也就是说子类里面隐含有父类的一个引用,然后一层层递归上去,你现在这个到父类就不行了。
      

  4.   

    楼主总结的很对,严重支持!
    对于每一个构造子,在初始化的时候都要执行父类的构造子
    如果省略的话就是执行的默认super();
      

  5.   

    同意, kenli(致虚子)  是说法,这个是上溯造型带来的错误。
      

  6.   

    因为父类里面没有接收一个int参数的构造函数,而super(i)是调用直接父类的接收一个int参数的构造函数,所以会报错
      

  7.   

    非常感谢楼主,我刚接触java,看了你的帖子对我帮助很大,再次感谢!!!
      

  8.   

    我只总结了一句话,请各位指点指点:
    http://expert.csdn.net/Expert/topic/2678/2678097.xml?temp=.9209406
      

  9.   

    好象没有声明extends,没有父类怎么super()