请写出下面这段代码的输出结果?
class Shape{
  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){
    super(i);
    System.out.println("This is Circle" + i);
  }  public static void main(String args[]){
    Circle c1 = new Circle(2);
  }
}

解决方案 »

  1.   

    This is Shape1
    This is Shape2
    This is Shape3
    This is Circle2分析过程:
    1、JVM在运行class时,首先会扫描一次全部的程序,静态块优先级最高,因为它们会存储在JVM的公共内存区域。
    2、接着会调用构造方法,构造方法调用的顺序是,JVM会先扫描类的继承关系,然后从最顶层的构造方法向下执行。
    3、执行到指定类内部时,会先处理类中定义的实例变量,然后再执行构造方法内部的代码。
    所以得到上面的结果。
      

  2.   

    还是不明白,我来捋一下,您看中间哪错了。
    第一步,static Shape s1 = new Shape(1);这里调用基类的构造函数,输出This is Shape1;
    第二步,依据继承关系调用构造函数。由于main函数里是 Circle c1 = new Circle(2);先调用Shape类的构造函数,输出This is Shape2;然后调用Circle类的构造函数,其构造函数是
     Circle(int i){
      super(i);
      System.out.println("This is Circle" + i);
      }
    我就晕了,第一句是调用Shape类的构造函数吧?那是不是输出This is Shape 2;This is Circle 2 ?
    再接着按实例, Shape s2 = new Shape(3);那就是输出This is Shape 3;
    最后再执行构造方法内部的代码,又是 super(i);
      System.out.println("This is Circle" + i);
    不敢往下写了~~~
      

  3.   

    public class Circle extends Shape { static Shape s1 = new Shape(1);
    //Shape s2 = new Shape(3);
    Shape s2 = null;
    Circle(int i) {
    super(i);
    s2 = new Shape(3);
    System.out.println("This is Circle" + i);
    } public static void main(String args[]) {
    Circle c1 = new Circle(2);
    }}
      

  4.   

    如上面的写法楼主就没疑问了吧。在构造circle的时候会先调用引用shape2的构造的。的而且顺序在打印之前。
      

  5.   

    super(i);这一句怎么用的,不是调用基类的构造函数吗?
      

  6.   

    你只需要记住:
    1、静态先于非静态,静态包括静态实例变量,静态代码块;
    2、父类先于子类;
    3、同级的以代码书写顺序执行;
    4、同类中实例变量先与构造方法;所以最后顺序就是:
    先父类的静态-子类的静态-父类实例变量-父类构造方法-子类实例变量-子类构造方法
    为什么JVM会用这个顺序来初始化对象,其实想都想得明白:如果静态的东西不先初始化,我们的静态方法就没法调用了;如果实例变量不先初始化,我们的构造方法里如果用到了那个变量就会出错;如果父类的不先初始化,我们子类的构造方法用到了父类的东西也会出错。
    所以结果就是
    shape 1(子类静态)
    shape 2(父类构造方法)
    shape 3(子类实例变量)
    circle 2(子类构造方法)
      

  7.   

    是先调用Circle的构造函数,然后执行到super(i)在调用基类的
    你可以理解为super是执行基类的同名方法
    你也可以重写自己的方法不调用基类的,把super去掉就好
      

  8.   

    Shape s2 = new Shape(3);//////////////11111111
      Circle(int i){
      super(i);
      System.out.println("This is Circle" + i); ///////////////222222222
      }
    1要比2先执行,同类中实例变量要比构造方法先执行;如果实例变量没有执行,写程序的时候很多构造函数里都要调用自己类的实例变量。
      

  9.   

    建议楼主看下实现继承中的构造方法 必须实现的条件     默认调用父类无参构造方法或者显示(super())调用构造方法