当子类继承父类时候,子类的构造函数用this 或者super
为什么super(i);这里改成了this(i);怎么不对啊?
class base{
//  base(){
//    System.out.println("base constructor");
//  }
  base(int i){
    System.out.println("base constructor int i");
  }
}
class derived extends base{
  derived(){
    super(8);
    System.out.println("derived constructor");
  }
  derived(int i){
    super(i);//这里改this(i);怎么不对啊?
    System.out.println("derived constructor int i");
  }
  public static void main(String[] args){
    derived d=new derived();
    derived t=new derived(9);
  }
}

解决方案 »

  1.   

    derived(int i){
        super(i);//这里改this(i);怎么不对啊?
        System.out.println("derived constructor int i");
      }
    ---------------------------------------------------------------
    super(i),调用父类的构造函数。this(i)调用自身的构造函数,构造函数系统自动调用,而不允许这样显式的调用。等同于:
    public class Main  {
    Main(int i)
    {
    ;
    }
    Main()
    {

    }

    public static void main(String[] args) {
    Main m = new Main();
    m.Main(20);         //一样的不合法:
    }}
      

  2.   

    谢谢
    shazi_pig(傻子) 
    那子类的构造函数用this 怎么做呢?
      

  3.   

    derived(int i){
        super(i);//这里改this(i);怎么不对啊?
        System.out.println("derived constructor int i");
      }
    都说不能显式调用构造函数了,特别是在构造函数derived里面调用构造函数本身super
    当derived d=new derived();时
    会自动先调用父类构造函数base();//如果没参数,也可以在子类构造函数里显式父类构造函数super(i);
    再调用子类构造函数derived();
    如果有static块,方法,变量,且为第1次使用这个类
    则先初始化父类static块,方法,变量
    再初始化子类static块,方法,变量
    再调用父类,子类构造函数
      

  4.   

    class A{
      A(){ 
        this(1);//要这样加
      }
      A(int i){
        //this(1); 这里加就错了,你看一下,加上会不会出现循环问题
      }
    }
      

  5.   

    可以用this调用本类的构造函数,但不能是自身(编译不通过).
    用this调用本类的构造函数要避免出现间接调用自身的情形(死循环,有些编译器也报错).常见用法:
    class Base{
       Base(){
          this(0);//也可以用this(0.0f);但不能用自身,即this();
       }
       Base(int i){  
         //这里完成初始化,但不要出现调用this()的情况(如果上面用了this(0);)
       }
       Base(float f){ 
        //这里完成初始化,但不要出现调用this()的情况(如果上面用了this(0.0f);)   }}