为什么this和super不能同时出现在一个构造函数里面?class A
{
  A()
  {
    System.out.println("A");
  }
  
}class B extends A
{
  B()
  {
  //  super(); //error
    this(3);
    System.out.println("B");  
  }
  
  B(int x)
  {
    System.out.println("B2");  
  }
  
  public static void main(String[] args)
  {
    B a=new B();
  }
}关于this,super不是很理解。。就像上面那个例子。问1:不是每个构造函数默认第一条语句都是调用super么?反正默认也是加上,可是我加了super()以后反而会出错不加没事。问2:是不是所有构造函数里面第一条语句都会调用super?还是只要一个构造函数调用一个super()其它的就不在调用了?如果按照上面的运行。
我想是否应该是 先运行B()中默认的super(),这样,要先执行一次A()中的System语句,然后在回到B()中,继续运行this(3),在进入B(int x)
进入后在B(int x)中在默认运行super(),在回到B()中那么输出应该是
  A
  A
  B2
  B可是结果输出却是
  A
  B2
  B
这好像说明super()只运行了一次。。那么是说this(3)中的super()没有运行么?
是不是不管子类有多少个构造方法,但调用super只调用一次?谢谢,麻烦不忙时候讲讲。

解决方案 »

  1.   

    http://blog.csdn.net/tkd03072010/article/details/6705574
    楼主,看看这个 this与super用法
      

  2.   

    这个说的好super和this都必须出现在第一行,冲突了
      

  3.   

    java规定,在执行构造函数之前必须执行父类的构造函数,直到这个类是java.lang.Object类的构造函数。
    然而函数的入口是子类构造函数,因此任何构造函数第一句必须是执行父类构造函数,如果没有添加super关键字,那么编译器会为该构造函数第一句添加一个super()语句(你可以这么理解,当然编译以后并不是这样)。如果有super关键字显示的调用父类构造函数,就是用指定的那个父类构造函数,否则使用默认的无参数构造函数。也有一种情况例外,就是存在this关键字,调用本类其它构造函数,但是按照递归调用,最终还是会调用父类构造函数。
    如果你继承的父类没有无参数构造函数,那么你这个类第一句必须显示的调用super关键字来调用父类对应的有参数构造函数,否则不能通过编译。
      

  4.   

    this()
    和super()
    在构造方法中必须出现在第一行,一山不容二虎。
    如果一个构造方法里没写this()和super()
    那么默认就是super()。
    一旦你写了this()或者super(),那么这个默认的就消失了。
      

  5.   

    未必吧。在重载构造中写上this()或者this(参数)。就不执行父类构造,只执行重载的构造。
      

  6.   


    这个我在前面已经解释过了,不再复述了,不过殊途同归,你即使使用this,还是会执行父类构造函数的,因为你this的那个构造函数,它的第一行也会调用父类构造函数的,你的构造函数中,必定会有一个使用super来调用父类构造函数,而其它的this()调用,最终会指向这个构造函数(构造函数不存在全部都能够this(参数)的情况)。