class Shape{
  public Shape(int i){
    System.out.println("This is Shape" + i);
  }
}public class Circle extends Shape {
static Shape s1 = new Shape(1);
Shape s2 = new Shape(3);
Circle(int i) {
                //System.out.println(555);
super(i);
System.out.println("This is Circle" + i);
}
public static void main(String args[]) {
Circle c1 = new Circle(2);
}
}
不明白这段代码的执行顺序,请高手指点一下,还有就是为什么我把System.out.println(555);这段代码上的注释去掉,代码就会报错,编译都过不去。
再有就是我把super(i);这行代码注释掉,代码也会报错,编译不过去。
麻烦哪位高手帮忙指点一下啊。我在此先谢过了。

解决方案 »

  1.   

    super();必须写在构造方法的第一句。不允许你前面写别的代码。
    构造方法中需要先调用父类的构造方法,如果你自己不直接写super(),编译器会给你自动加上。
      

  2.   

    System.out.println(555);这句注释报错,不可能吧
      

  3.   

    再有就是我把super(i);这行代码注释掉,代码也会报错,编译不过去。 
    -----------------------
    如果你不写super(i),编译器会自动给你加上super();这样调用的是父类中没有参数的构造方法,而你父类里面没有不带参数的构造方法,所以会报错。
    再者,如果你父类里面不自己写构造方法,系统会默认加上没有参数的构造方法,如果写了,系统则不加。
      

  4.   

    在ide里 让程序单步的走一下,你自己就弄明白了。
      

  5.   

    再有就是我把super(i);这行代码注释掉,代码也会报错,编译不过去。 
    麻烦哪位高手帮忙指点一下啊。我在此先谢过了你在父类加一个public Shape(){ 
        System.out.println("默认构造器"); 
      } 这样就不会报错了。因为你父类没有默认构造器,有自定义构造器,所以继承的子类必须调用父类的构造器super(i);
      

  6.   

    Circle c1 = new Circle(2); 执行步骤如下:
    1、进入Circle(int i){...}
    2、进入Shape(int i){...}
    3、调用Object(){...}
    4、返回到Shape(int i){...}
    5、返回到Circle(int i){...}
    System.out.println(555);这段代码上的注释去掉,报错,因为:
    Circle(int i)中第一句未显式调用“super();”或“super(i);”时,系统首先会默认调用父类的无参数构造方法“super();”,此时Circle(int i)中即使第一句你写“System.out.println(555);”,也会被当作是在调用“super();”之后;
    但你在写了“System.out.println(555);”之后又显式调用父类的带参数构造方法“super(i);”,当然会报错,因为调用父类的构造方法2次就搅乱了子类对象的初始化步骤。
    这就是所谓“super();”或“super(...);”必须是构造方法中的第一句的原因,与此相关的话题还有:“this();”或“this(...);”必须是构造方法中的第一句;构造方法中有“super();”或“super(...);”就不能同时有this();”或“this(...);”。(不仅要知道结论,更重要的是要理解原因。)
    把super(i);这行代码注释掉,代码也会报错,前面已经部分讲到了:
    Circle(int i)中第一句未显式调用“super();”或“super(i);”时,系统首先会默认调用父类的无参数构造方法“super();”;
    而class Shape中,若没有写任何构造方法,系统会默认添加一个无参数构造方法,如你这里的Shape(){}; 
    但若你写了一个带参数的构造方法,如你这里的Shape(int i){},而没写无参数构造方法的话,系统不再会给你添加无参数构造方法;
    回到前面,系统默认调用父类的无参数构造方法“super();”时,找不到Shape(){}。over