如下代码:
public class Contruct {
private int value;
public Contruct() {
value=setValue();
System.out.println("value=="+value);
System.out.println("Contruct");
}
public int setValue() {
System.out.println("setValue()");
return 5;
}
public int value(){
System.out.println("value()");
return value;
}
static class SubContruct extends Contruct{
public SubContruct(){
System.out.println("SubContruct num="+num);
}
private int num=10;
public int setValue() {
System.out.println("subContruct setValue()");
System.out.println("num=="+num);
return num;
}
}
/**
* @param args
*/
public static void main(String[] args) {
SubContruct c=new SubContruct();
int value=c.value();
System.out.println(value);
}
输出的结果:
subContruct setValue()
num==0
value==0
Contruct
SubContruct num=10
value()
0
由此可以看出对象的构建过程:
1.从Heap中分配内存,用以存放全部Instance变量以及这个对象的superclass 的专属数据
2.对象的Instance 变量初始化为默认值。 例:此时的value默认值为0,num默认值为0
3.调用superclass 的构造器,直到Object的构造器,然后依次从Object构造器返回。
4.在本体构造器执行之前,先为Instance变量赋值,然后才执行构造器。
你可只关注2、3、4点,根据这3点分析如下:
第2点分析结果已写出。从第3点开始:
此时先调用superclass Contruct 的构造器,先为value 赋值,因为value 无赋值操作,所以此时value的值为默认值0,由于superclass Contruct 的构造器中调用value=setValue()的操作,而setValue()的方法被subclass SubContruct 重写了,所以,此时调用的应是subclass Contruct 的setValue()方法,而这时,superclass Contruct的构造器还没执行完,所以subclass SubContruct 的构造器还没开始执行,此时的num值为默认值0。所以在superclass Contruct 的构造器中的value=setValue()的操作得到的value =0 。这时,superclass Contruct 执行完毕,value 赋值完后的值为0,接着调用本类的构造器SubContruct ,最终调用value()方法是得到的value值就为0.
302

被折叠的 条评论
为什么被折叠?



