先看看我的理解再回答,首先super必须写在子类的构造函数中第一行.这个我懂ok,其实super可以重载.也就是说可以调用父类带参数的构造函数.其三.在子类创建对象时,首先会调用父类的构造方法.Ok这我也明白.但接下来这程序我就不明白了.我创建一个子类对象.调用了子类中无参的构造方法,而这个子类无参构造方法中第一行我已经显示调用了super(300);这说明我要调用父类带参数的构造方法.子类中带参数的构造方法我根本没调.他怎么也会自动去找父类那个无参的构造方法呢???这是规定的吗?还是其它什么原因??????
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);
  }
}

解决方案 »

  1.   

    这个输出结果是:22、44,不知道楼主怎么看出来它去掉无参的方法了,而且我觉得楼主说super可以重载太别扭!
      

  2.   

    这个是不是得考 虑到多态的问题上,因为在实际运行中可能编译 器并不知道你要调用父类的哪个构造方法,所以在每个子类的构造方法中都要显示调用super();.或是在父类中写出无参构造方法,不知道我这么理解对不对.
      

  3.   

    晕,放开你注释掉的super中的无参方法就行了,在子类构造方法中第一行总会默认的加上super();但是父类中你没有定义无参构造方法当然报错了
      

  4.   

    如果父类的构造方法多于一个或者父类显示的声明了构造方法,那么子类的所有构造方法都必须要显示的用super
    换句话说  只有当父类只有一个默认的构造方法(无参的)时  子类的构造方法不用super  不知道这样说能否明白
      

  5.   

    补充一下,如果父类只有一个带参数的构造方法 那么子类所有的构造方法都有用super了,因为父类只有一个带参数的构造方法,如果子类的某些构造方法不想调用父类的带参数的构造方法, 那就在父类写一个空实现的不带参数的构造方法。
      

  6.   

    这问题已经有人问过了啊。。
    看这篇帖子就明白了http://topic.csdn.net/u/20110310/13/38d023a2-6601-46a6-84f7-2c7db6fdabfa.html