一道高级java面试题

public class Shape {

private int i=10;
public Shape(){
    i = 20;
    print();
}
public Shape(int m){

    i = m;
    print();

}
public void print(){
    System.out.println("This shape=>"+i);
}

}

public class Circle extends Shape{

private int i = 20;

public void print(){
    System.out.println("this circle=>"+i);
}
public Circle(){
    this.i = 30;
    print();
    super.print();

}


public static void main(String[] args){
    Shape shap = new Circle();


}

}

请问输出什么结果呢?
为何第一输出的是this circle=>0??实在是搞不懂。

new操作明确一点首先调用的是父类的构造方法:
[quote]public Shape(){
i = 20;
print();
}
[/quote]
在调用print()时,print被重写,去调用Circle的print()方法。

[code="java"]public void print(){ //Circle
System.out.println("this circle=>"+i);
}
[/code]
Circle 的i还没被被赋值,在加载类的时候整型变量均被赋值为0。所以输出 “this circle=>0”
'''''''''''如果你把shape里的print()方法改为private,

'''''''因为没有被重写,不存在多态。这时调用的为父类Shape中的print方法。

参考 我的文章说明

http://lovewhzlq.iteye.com/admin/blogs/452636

初始化的实际过程:
1.在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制的0。
2.调用基类构造器。(这个步骤会不断反复递归下去,首先是构造这种层次结构的根,然后是下一层子类,等等,直到最低层的子类)
3.按声明顺序调用成员的初始化方法。
4.调用子类的构造器主体。

将父类的print改为私有方法,不存在多态。
[code="java"]class Shape {

private int i=10;
public Shape(){
i = 20;
print();
}
public Shape(int m){

i = m;
print();

}
private void print(){
System.out.println("This shape=>"+i);
}
}

public class Circle extends Shape{

private int i = 20;

public void print(){
System.out.println("this circle=>"+i);
}
public Circle(){
this.i = 30;
print();
//super.print(); 因为父类为私有的print,不能在这个类里调用。

}

public static void main(String[] args){
Shape shap = new Circle();

}
} [/code]

/*****output
This shape=>20
this Circle=>30

[code="java"]
代码就执行顺序是这样子的。下面用(1),(2),(3)......表示它们执行顺序
(1)private int i = 0;(Circle类)
(2)private int i = 0;(Shape类)
(3)i = 10;(Shape类)
(4)i = 20;(Shape类)
(5)print();(Circle类)(因为前面i只是被定义过,但是没有被赋值,所以打印的时候是0)
(6)i = 20;(Circle类)
(7)Circle()(Circle类)
[/code]