class SuperClass {
  private int n;
  /*
  SuperClass() {
    System.out.println("11");
  }
   */
  SuperClass(int n) {
    System.out.println("22");
    this.n = n;
  }
}class SubClass extends SuperClass {
  private int n;
 
  SubClass(int n) {
    System.out.println("33");
    this.n = n;
  }  SubClass() {
    super(300);
    System.out.println("44");
  } 
}public class TextSuperSub {
  public static void main(String []args) {
    SubClass sc1 = new SubClass();
    //SubClass sc2 = new SubClass(400);
  }
}
为什么会说找不到父类无参的那个构造方法?,其一我遵守了super的使用规则,我在子类构造方法中第一行写了super函数.其二.我创建子类的对象时.调用的是子类无参的构造方法.无参的构造方法正好第一行有这个super(300).而父类中也有带参数的构造方法.为啥会去找那个无参的构造方法.可能有人会说我子类中有一个构造方法没有写super函数.可我也没调用过那个构造方法啊.

解决方案 »

  1.   

    编译就会出错,因为子类构造会默认继承父类的无参构造,除非想你那样用super显示调用,不然都会去父类中招无参的构造,可你的父类没有,于是报错
      

  2.   


    顶一个,你用super调用,但是却父类里面却没有。。
      

  3.   

    因为在SubClass(int n)构造方法中,没有显式调用父类的构造方法,所以编译器默认调用父类的无参的构造方法,而SuperClass中由于已经定义了一个无参的构造方法,因此编译器就不会添加默认的无参的构造方法,也就是说父类没有无参的构造方法。故会出现上面的错误!
      

  4.   

    即便 我指定了super带参数的构造方法,它也会去找无参的构造方法是吗
      

  5.   

    很明显,你子类中无参构造函数方法是对的,但有参构造函数错了,他找不到父类的无参构造函数,所以javac才会报错,
    而如果你指定了super的有参构造函数是会调用相应函数的
      

  6.   


    "而SuperClass中由于已经定义了一个无参的构造方法"。    纠正,定义了一个有参的构造方法    
      

  7.   

    如果在编写一个类时提供了至少一个构造器,但是没有提供默认的构造器,那么在构造对象时若不提供构造参数就被视为不合法。
    --java2 核心技术(卷I)第七版    120页
      

  8.   

    是我说的不明白,还是你们都没看懂呢??//SubClass sc2 = new SubClass(400);这句我注释掉了; SubClass sc1 = new SubClass();单单执行这一句.是不是应该去找子类不带参数的构造函数.也就是SubClass() {
      super(300);
      System.out.println("44");
      }  
    这个构造函数.在这个函数中我已经显示调用super(300);他是不是应该去找父类中带参数的那个构造函数呢?还是说我没创建带参数的构造方法,我子类的带参构造方法也会调用.解释下关键的!!!!!!!!!!!!!!!!!!!!!!!!!
      

  9.   

    一句话就是要先调用父类的构造函数。父类若是有无参的构造函数,默认会自己去调用。父类若是没有无参的构造函数,就要用Supper显示的去调用!