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,
参考 我的文章说明
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]